ETH Price: $3,246.11 (+2.55%)
Gas: 2 Gwei

Contract

0x7c5A8551535670B25d055a95225C97E61fc8e23A
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Set Approval For...185991742023-11-18 13:58:59251 days ago1700315939IN
0x7c5A8551...61fc8e23A
0 ETH0.0013175428.60618113
Set Approval For...182581802023-10-01 20:50:23298 days ago1696193423IN
0x7c5A8551...61fc8e23A
0 ETH0.000366857.96502809
Safe Transfer Fr...170674402023-04-17 15:40:47466 days ago1681746047IN
0x7c5A8551...61fc8e23A
0 ETH0.003558949.62007976
Set Approval For...170534732023-04-15 16:06:23468 days ago1681574783IN
0x7c5A8551...61fc8e23A
0 ETH0.001253627.21794707
Set_mint_price170339942023-04-12 19:29:35470 days ago1681327775IN
0x7c5A8551...61fc8e23A
0 ETH0.0012064835.56023132
Dev_mint_to170132812023-04-09 21:08:23473 days ago1681074503IN
0x7c5A8551...61fc8e23A
0 ETH0.0019144919.63848025
Dev_mint_to170117972023-04-09 16:05:35474 days ago1681056335IN
0x7c5A8551...61fc8e23A
0 ETH0.0018295823.40907497
Withdraw Money170117522023-04-09 15:55:23474 days ago1681055723IN
0x7c5A8551...61fc8e23A
0 ETH0.0008101824.76657716
Free_M_I_N_T170116222023-04-09 15:29:11474 days ago1681054151IN
0x7c5A8551...61fc8e23A
0 ETH0.0008866423.74443267
Free_M_I_N_T170115682023-04-09 15:17:59474 days ago1681053479IN
0x7c5A8551...61fc8e23A
0 ETH0.0008367922.39513392
Free_M_I_N_T170115652023-04-09 15:17:23474 days ago1681053443IN
0x7c5A8551...61fc8e23A
0 ETH0.0008742623.39788034
Free_M_I_N_T170115402023-04-09 15:12:23474 days ago1681053143IN
0x7c5A8551...61fc8e23A
0 ETH0.0022082222.27197941
M_I_N_T170115382023-04-09 15:11:59474 days ago1681053119IN
0x7c5A8551...61fc8e23A
0.06 ETH0.0023307225.33309819
Free_M_I_N_T170115192023-04-09 15:07:59474 days ago1681052879IN
0x7c5A8551...61fc8e23A
0 ETH0.0008874723.75144205
Free_M_I_N_T170115152023-04-09 15:07:11474 days ago1681052831IN
0x7c5A8551...61fc8e23A
0 ETH0.0025083625.28694048
Free_M_I_N_T170112992023-04-09 14:21:59474 days ago1681050119IN
0x7c5A8551...61fc8e23A
0 ETH0.0007727520.714648
Set_mint_price169896742023-04-06 12:50:11477 days ago1680785411IN
0x7c5A8551...61fc8e23A
0 ETH0.0010416130.70077221
Safe Transfer Fr...169188382023-03-27 12:52:59487 days ago1679921579IN
0x7c5A8551...61fc8e23A
0 ETH0.0027267921.90123981
Safe Transfer Fr...169188332023-03-27 12:51:59487 days ago1679921519IN
0x7c5A8551...61fc8e23A
0 ETH0.0026254921.86526391
Batch_switch_sta...168916962023-03-23 17:23:59491 days ago1679592239IN
0x7c5A8551...61fc8e23A
0 ETH0.0042882240.65011913
Dev_mint_to168094652023-03-12 4:06:11502 days ago1678593971IN
0x7c5A8551...61fc8e23A
0 ETH0.0015883518.08612075
Batch_switch_sta...168092902023-03-12 3:30:47502 days ago1678591847IN
0x7c5A8551...61fc8e23A
0 ETH0.0026689522.47806403
Set Approval For...168092282023-03-12 3:17:59502 days ago1678591079IN
0x7c5A8551...61fc8e23A
0 ETH0.0007822516.98411712
Dev_mint_to168092212023-03-12 3:16:23502 days ago1678590983IN
0x7c5A8551...61fc8e23A
0 ETH0.0020621917.65320557
Dev_mint_to168091992023-03-12 3:11:59502 days ago1678590719IN
0x7c5A8551...61fc8e23A
0 ETH0.0023560920.61021663
View all transactions

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
170117522023-04-09 15:55:23474 days ago1681055723
0x7c5A8551...61fc8e23A
0.06 ETH
157798272022-10-19 4:40:35646 days ago1666154435
0x7c5A8551...61fc8e23A
0.29 ETH
154777402022-09-05 11:56:36690 days ago1662378996
0x7c5A8551...61fc8e23A
2.635 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FACES_OF_REKT_CONTRACT

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-03
*/

// By interacting with this contract, you agree to our terms and conditions. Please check our website for the latest version.

// SPDX-License-Identifier: UNLICENSED
/*  ______    ___    ______    ______   _____          ____     ______           ____     ______    __ __  ______
   / ____/   /   |  / ____/   / ____/  / ___/         / __ \   / ____/          / __ \   / ____/   / //_/ /_  __/
  / /_      / /| | / /       / __/     \__ \         / / / /  / /_             / /_/ /  / __/     / ,<     / /
 / __/     / ___ |/ /___    / /___    ___/ /        / /_/ /  / __/            / _, _/  / /___    / /| |   / /
/_/       /_/  |_|\____/   /_____/   /____/         \____/  /_/              /_/ |_|  /_____/   /_/ |_|  /_/
                                                                                                                 */

/*
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOO,,,,,,,,,,,,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOO,,,,,,,,,,,,OOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,°OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOIFOOOOROOOOOOOOOOELSEOOOOOOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOOOOOOOOOE###OOOOOOWHILEOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOO#####OOOOOOOOOOOOOO##OOOOOOOOOOOOOOOOO°],,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOFOROOOOOOOOOOOOOOOOOOOOOEE#OOOOO]°°]OOOOOOOOOOOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOOOOOOOOOOOOOO]°.....°(OOOOOOOOO.°...........,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O]°O.........°OOOOOOO].............]OOOOO°..O,,,,,,,,,,,,,°°°,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O...........OO°........°..........°.....°OO.O,,,,,,,,°°°°°°°°°°°,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..............OOO}}°..............OO°}},...O,,,,,,,,,}}°°}}]°}}],,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....E........OOOOOO}}............COODE}}]..O,,,,,,,,,}}}}]°°°°°°°°,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.............,COOODE]............,COODE}}.°O,,,,,,,,,,}}°}}°°°°°°°°,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....°,........COOODE].............COODE}}.O,,,,,,,,,,,,,}}]°°°°°°°°,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.....O........COOODE].............COODE]°.O,,,,,,,,,,,,]°]°°°°°°°°,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°,,,,O,...........COOODE].............COODE}}.O,,,,,,,,,,,}}°°°°}}],,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O,..}}].............COOODE].............COODE}}.O,,,,,,,,,,,,]°],,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..°°}}.............COOODE].............COODE}}.O,,,,,,,,,,,]°°,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O..°°°°°............COOODE].............COODE]°..O,,,,,,,,,,}}°°°°°°°°,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O....°°°...........COOOODE]............COODE}}..O,,,,,,,,,,,}}]°°°°°°°,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OO...O...........COOODE}}.°.°......O.COODE}}].°O,,,,,,,,,,,,°]°°°°°°°,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.................°°....°OOOOO°......°°°..O,,,,,,°]°°°°]°°°°°°,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.......................................°O,,,,,],,}}}}°,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O.................    OOO.  .OOOOOO°....O,,O°°°°°°°°°O,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°...........,   ,° ,°,,,°°OOOOOE}}}}COOODE#COOOOODE##O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°.......°..OOOOE...................COOODE°°°°°°°°###O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°.....°O°....................°O,,,,,,O#°°°°°°°###O,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°°°°°°°°°°°O,,,,,,,,,,,,,,,,,COOOODE,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O°°°°°°°°°°°°O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OO#O]°°..°...]..°OO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OE###OOOO.......°...OO#EO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOO##O####O    °OO.....OO.O###E°,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,OOO############O######O        O.    O####O######OOO,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,OE###############OO########O    #OO###EOO O###OOO###########EE°,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,O###################O#########OOO.  O####O  O#####O##############O,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,O#####################O#########O    O####O   O####O###############O,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,O###############################O#E.#######O OO#####################O,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O################################O##########OO#O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O#################################O#####OOOO####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,O#################################O#######O#####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,O##################################O#(#####O#####O#####################O,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,O################O#################O((##,##O#####O#############O########O,,,,,,,,,,,,,,,,,,,,,,,,
 */


pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {

        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;

        _;

        _status = _NOT_ENTERED;
    }
}


pragma solidity ^0.8.0;

library MerkleProof {

    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {

        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;

        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {

        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;


        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;

        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {

        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

pragma solidity ^0.8.0;
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    function toString(uint256 value) internal pure returns (string memory) {

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

pragma solidity ^0.8.0;

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {

        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.1;

library Address {

    function isContract(address account) internal view returns (bool) {

        return account.code.length > 0;
    }


    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error ApproveToCaller();
    error BalanceQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerQueryForNonexistentToken();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error URIQueryForNonexistentToken();
    error MintERC2309QuantityExceedsLimit();
    error OwnershipNotInitializedForExtraData();


    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
        bool burned;
        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

pragma solidity ^0.8.4;

interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

contract ERC721A is IERC721A {
    struct TokenApprovalRef {
        address value;
    }


    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
    0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;


    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;


    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }


    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {
    unchecked {
        return _currentIndex - _burnCounter - _startTokenId();
    }
    }

    function __burn_non_minted_token(uint16 amount) internal virtual {
        _currentIndex += amount;
    }

    function _totalMinted() internal view virtual returns (uint256) {
    unchecked {
        return _currentIndex - _startTokenId();
    }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }


    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
        interfaceId == 0x01ffc9a7 ||
        interfaceId == 0x80ac58cd ||
        interfaceId == 0x5b5e139f;
    }


    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }


    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

    unchecked {
        if (_startTokenId() <= curr)
            if (curr < _currentIndex) {
                uint256 packed = _packedOwnerships[curr];
                if (packed & _BITMASK_BURNED == 0) {
                    while (packed == 0) {
                        packed = _packedOwnerships[--curr];
                    }
                    return packed;
                }
            }
    }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        assembly {
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }


    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
        _startTokenId() <= tokenId &&
        tokenId < _currentIndex &&
        _packedOwnerships[tokenId] & _BITMASK_BURNED == 0;
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            owner := and(owner, _BITMASK_ADDRESS)
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
    private
    view
    returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }


    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

    unchecked {
        --_packedAddressData[from];
        ++_packedAddressData[to];

        _packedOwnerships[tokenId] = _packOwnershipData(
            to,
            _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
        );

        if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
            uint256 nextTokenId = tokenId + 1;
            if (_packedOwnerships[nextTokenId] == 0) {
                if (nextTokenId != _currentIndex) {
                    _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                }
            }
        }
    }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }


    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    unchecked {
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        uint256 toMasked;
        uint256 end = startTokenId + quantity;

        assembly {
            toMasked := and(to, _BITMASK_ADDRESS)
            log4(
            0,
            0,
            _TRANSFER_EVENT_SIGNATURE,
            0,
            toMasked,
            startTokenId
            )

            for {
                let tokenId := add(startTokenId, 1)
            } iszero(eq(tokenId, end)) {
                tokenId := add(tokenId, 1)
            } {
                log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
            }
        }
        if (toMasked == 0) revert MintToZeroAddress();

        _currentIndex = end;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    unchecked {
        _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

        _packedOwnerships[startTokenId] = _packOwnershipData(
            to,
            _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
        );

        emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

        _currentIndex = startTokenId + quantity;
    }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

    unchecked {
        if (to.code.length != 0) {
            uint256 end = _currentIndex;
            uint256 index = end - quantity;
            do {
                if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
            } while (index < end);
            if (_currentIndex != end) revert();
        }
    }
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }


    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        assembly {
            if approvedAddress {
                sstore(approvedAddressSlot, 0)
            }
        }

    unchecked {
        _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

        _packedOwnerships[tokenId] = _packOwnershipData(
            from,
            (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
        );

        if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
            uint256 nextTokenId = tokenId + 1;
            if (_packedOwnerships[nextTokenId] == 0) {
                if (nextTokenId != _currentIndex) {
                    _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                }
            }
        }
    }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

    unchecked {
        _burnCounter++;
    }
    }


    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }


    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            str := add(mload(0x40), 0x80)
            mstore(0x40, str)

            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)
                mstore8(str, add(48, mod(temp, 10)))
                temp := div(temp, 10)
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            str := sub(str, 0x20)
            mstore(str, length)
        }
    }
}

// ERC 721A END

pragma solidity ^0.8.14;

contract FACES_OF_REKT_CONTRACT is ERC721A, Ownable, ReentrancyGuard {

    using ECDSA for bytes32;

    string public _baseURIextended = "ipfs://QmPNh2m595pWnxRbSUSXxnTL91KHLQv1TQEgG8H4HUdDfR/";

    bool public mint_paused = true;

    bool public whitelist_mint = true;

    struct token  {
        uint256 experience;
        bool is_staked;
        uint256 stake_date;
    }

    struct airdrop {
        uint8 amount;
        address to;
    }

    mapping(uint256 => token) public face_of_rekt;

    mapping(uint8 => bytes32) public whiteListMapping;

    uint256 public experience_bonus_multiplier = 1;

    address public interactor_address;

    uint public wl_mint_price = 0.01 ether;

    uint public public_mint_price = 0.02 ether;

    mapping(address => uint8) private free_mint_already_minted ;

    uint8 public mint_limit_per_wallet = 5;

    constructor() ERC721A("Faces of Rekt", "FoR") {
        whiteListMapping[0] = 0x75eb3524d993cf03d8d1bed0ac85793a0ebd090cd08d497838619018af7bc72f;
        whiteListMapping[1] = 0x4e86997fc1292744c02df775932a2de5653a1c9616e57a06198b19c72810a193;
    }

    function set_Base_URI(string memory baseURI_) external onlyOwner() {
        _baseURIextended = baseURI_;
    }

    function switch_Mint_State() external onlyOwner() {

        mint_paused = !mint_paused;

    }

    function switch_Whitelist_Mint_State() external onlyOwner() {

        whitelist_mint = !whitelist_mint;

    }

    function set_mint_price(uint256 wl, uint256 pb) external onlyOwner {
        wl_mint_price = wl;
        public_mint_price = pb;
    }

    function set_limit_mint(uint8 limit) external onlyOwner {
        mint_limit_per_wallet = limit;
    }

    function burn(uint16 amount) external onlyOwner() {

        __burn_non_minted_token(amount);

    }

    function _baseURI() internal view virtual override returns (string memory) {

        return _baseURIextended;

    }

    function set_Whitelist_MerkleRoot(bytes32 newMerkleRoot_, uint8 _id) external onlyOwner {
        whiteListMapping[_id] = newMerkleRoot_;
    }

    function bulk_give_Exp (uint256 xp_amount, uint16[]memory id_array) external {

        require(msg.sender == interactor_address || msg.sender == owner(), "Not an interactor");

        for (uint index = 0; index < id_array.length; index++) {

            face_of_rekt[id_array[index]].experience += xp_amount;

        }

    }

    function set_experience_bonus_multiplier (bytes32[] memory proof, uint256 _experience_bonus_multiplier) external {

        require(MerkleProof.verify(
            proof,
            whiteListMapping[2],
            keccak256(abi.encodePacked(msg.sender))) || msg.sender == owner(), "Not whitelisted");

        experience_bonus_multiplier = _experience_bonus_multiplier;
    }

    function M_I_N_T(bytes32[] memory proof, uint16 quantity) external payable {

        require(_numberMinted(msg.sender) + quantity <=  mint_limit_per_wallet, "Can't mint more than limit");

        require((totalSupply() + quantity) < 5555, "Sold out");

        if (whitelist_mint) {

            require(msg.value  >= (wl_mint_price * quantity));

            require(MerkleProof.verify(
                    proof,
                    whiteListMapping[0],
                    keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");

        } else {
            require(msg.value >= (public_mint_price * quantity));
        }

        require(!mint_paused, ">MINT PAUSED< The mint is paused >MINT PAUSED<");

        _safeMint(msg.sender, quantity);

    }

    function get_experience_bonus(uint16 tokenId) external {

        require(ownerOf(tokenId) == msg.sender, "You're not the owner of this token");

        face_of_rekt[tokenId].experience += (block.timestamp - face_of_rekt[tokenId].stake_date) * experience_bonus_multiplier;
        face_of_rekt[tokenId].stake_date = block.timestamp;

    }

    function batch_switch_stake(uint16[] memory face_array) external {

        for(uint16 i = 0; i < face_array.length; i++ ) {
            require(ownerOf(face_array[i]) == msg.sender, "You're not the owner of this token");

            face_of_rekt[face_array[i]].is_staked ?

            face_of_rekt[face_array[i]].experience += (block.timestamp - face_of_rekt[face_array[i]].stake_date) :

            face_of_rekt[face_array[i]].stake_date = block.timestamp;

            face_of_rekt[face_array[i]].is_staked = !face_of_rekt[face_array[i]].is_staked;
        }

    }

    function expell_from_stake(uint16[] memory face_array) external onlyOwner {

        for(uint16 i = 0; i < face_array.length; i++ ) {
            face_of_rekt[face_array[i]].experience += (block.timestamp - face_of_rekt[face_array[i]].stake_date);
            face_of_rekt[face_array[i]].is_staked = false;
        }

    }

    function check_experience_owned(uint16 tokenId)public view returns (uint256) {

        return face_of_rekt[tokenId].is_staked ?

        (block.timestamp - face_of_rekt[tokenId].stake_date + face_of_rekt[tokenId].experience) *  experience_bonus_multiplier:

        face_of_rekt[tokenId].experience;

    }

    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {

        face_of_rekt[startTokenId].is_staked = false;
        face_of_rekt[startTokenId].experience = 0;
        face_of_rekt[startTokenId].stake_date = 0;

    }

    function withdrawMoney() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }

    function dev_mint_to(address to, uint16 quantity) external onlyOwner {
        require((totalSupply() + quantity) < 5555, "Sold out");
        _safeMint(to, quantity);
    }

    function free_M_I_N_T(bytes32[] memory proof) external {

        require(totalSupply() + 1 < 5555, "Sold out");
        require(MerkleProof.verify(
                proof,
                whiteListMapping[1],
                keccak256(abi.encodePacked(msg.sender))), "Not whitelisted");
        require(free_mint_already_minted[msg.sender] < 1, "Only one free mint please");
        require(!mint_paused, ">MINT PAUSED< The mint is paused >MINT PAUSED<");

        _safeMint(msg.sender, 1);
        free_mint_already_minted[msg.sender] += 1;

    }

    function bulk_air_drop(airdrop[] memory airdropArray) external onlyOwner {
        for(uint16 i = 0; i < airdropArray.length; i++ ) {
            require(totalSupply() + airdropArray[i].amount < 5555, "Sold out");
            _safeMint(airdropArray[i].to, airdropArray[i].amount);
        }
    }

}
/*////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////@#(@/////////////////////////////////////////////////////////////////////////////
////////////////////@##@////////////////////////////////////////////////////////////////////////////
///////////////////@@@#@/@////@@@///////////////////////////////////////////////////////////////////
////////////////////////@@#////@@@/////////@%###%@%%###########%(///////////////////////////////////
////////////////////////////(     @////#%########################%%@@///////////////////////////////
///////////////////////@##@*****    @@%################################&////////////////////////////
////////////////////////////(.....*   @&########################%%@@////////////////////////////////
////////////////////////////@##@....@@%###############################@/////////////////////////////
//////////////////////////@#####%@%###########%#########%@@@@%#########%@///////////////////////////
/////////////////////////@%%&@@%####%@@&###%@@@@//%#####%*......,/@@.@%%@///////////////////////////
////////////////////////////&############@.@@@@@@@@,  .,..,..@@@@@@@...#////////////////////////////
///////////////////////////@%##########%/. ..,.....,.......,............@///////////////////////////
////////////////////////////&#######%@@,.,..@@@@@/...........@@@@//,...#////////////////////////////
///////////////////////////@##########@......@@@@@/..........@@@@@//(@//////////////////////////////
////////////////////////////&#########%,.,...@@@@@/..........@@@@@//...#////////////////////////////
/////////////////////////////@%######@.......@@@@@/....,* ..,@@@@@//@///////////////////////////////
////////////////////////////(,.....@#%@.///..@@@@@/..,  ...,.@@@@@//@///////////////////////////////
//////////////////////@@(@//(..///,....,  ..,@@@@@/..........@@@@@//@///////////////////////////////
//////////////////////@@#@//( .,/,/.....**...@@@@@/..........@@@@@//.@//////////////////////////////
////////////////////////////(..,..,.........@@@@@@/........,.@@@@@//.@//////////////////////////////
////////////////////////////////@@@..........@@@//.,,,,...,@.@@@(//.,@//////////////////////////////
//////////////////////////////////@..., ................,,...........@//////////////////////////////
/////////////////////////////////@...,. ..*............,,///,......*..@/////////////////////////////
///////////////////////////////////@...*........./@@@@%((#@@@%%%,*.....#////////////////////////////
////////////////////////////////////@/.,..*............,/@%((%@%#@@/////////////////////////////////
///////////////////////////////////////,..................,@((%%(@//////////////////////////////////
////////////////////////////////////////@@@///#,@@@@..@@@@//@((((@///@@/////////////////////////////
////////////////////////////////////////////@&%,,,,,../,,%%&@((%%%@/%(@/////////////////////////////
///////////////////////////////////////%@@@###%...........@###@%((((%@//////////////////////////////
////////////////////////@#%@@@@@&%#######@&###%/,..........@###%%#########%/////////////////////////
/////////////////////////%###############%@@%%@  .@@/,..,%@,@%@@%###########@///////////////////////
////////////////////////@,,(@@&&#########&%&&&&  ,((,    /( @##&###########@////////////////////////
//////////////////////@( ,@%#################&%             &############&&#%@%/////////////////////
/////////////////////#,      (@@@&%##########&%             &#############%. (%/////////////////////
//////////////////////        @&#############&%%&#          &#########@*,@@@  ,/////////////////////
////////////////////@.           @###########&%             &########@(        #@///////////////////
//////////////////,   ,(@@@,     @###########&#&        ,%&%#########@     ,(@@,,@//////////////////
//////////////////((,         ,(&@############%&           %#########@           ,#/////////////////*/

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"M_I_N_T","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"face_array","type":"uint16[]"}],"name":"batch_switch_stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"amount","type":"uint8"},{"internalType":"address","name":"to","type":"address"}],"internalType":"struct FACES_OF_REKT_CONTRACT.airdrop[]","name":"airdropArray","type":"tuple[]"}],"name":"bulk_air_drop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"xp_amount","type":"uint256"},{"internalType":"uint16[]","name":"id_array","type":"uint16[]"}],"name":"bulk_give_Exp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"check_experience_owned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"quantity","type":"uint16"}],"name":"dev_mint_to","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"face_array","type":"uint16[]"}],"name":"expell_from_stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"experience_bonus_multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"face_of_rekt","outputs":[{"internalType":"uint256","name":"experience","type":"uint256"},{"internalType":"bool","name":"is_staked","type":"bool"},{"internalType":"uint256","name":"stake_date","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"free_M_I_N_T","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"get_experience_bonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interactor_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_limit_per_wallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"public_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"tokenId","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":"string","name":"baseURI_","type":"string"}],"name":"set_Base_URI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot_","type":"bytes32"},{"internalType":"uint8","name":"_id","type":"uint8"}],"name":"set_Whitelist_MerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"_experience_bonus_multiplier","type":"uint256"}],"name":"set_experience_bonus_multiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"limit","type":"uint8"}],"name":"set_limit_mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wl","type":"uint256"},{"internalType":"uint256","name":"pb","type":"uint256"}],"name":"set_mint_price","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switch_Mint_State","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switch_Whitelist_Mint_State","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"whiteListMapping","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelist_mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wl_mint_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60e0604052603660808181529062002dfe60a03980516200002991600a91602090910190620001d6565b50600b805461010161ffff199091161790556001600e55662386f26fc1000060105566470de4df8200006011556013805460ff191660051790553480156200007057600080fd5b50604080518082018252600d81526c119858d95cc81bd98814995add609a1b6020808301918252835180850190945260038452622337a960e91b908401528151919291620000c191600291620001d6565b508051620000d7906003906020840190620001d6565b50506000805550620000e93362000184565b60016009819055600d6020527f75eb3524d993cf03d8d1bed0ac85793a0ebd090cd08d497838619018af7bc72f7f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee556000527f4e86997fc1292744c02df775932a2de5653a1c9616e57a06198b19c72810a1937ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c555620002b8565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001e4906200027c565b90600052602060002090601f01602090048101928262000208576000855562000253565b82601f106200022357805160ff191683800117855562000253565b8280016001018555821562000253579182015b828111156200025357825182559160200191906001019062000236565b506200026192915062000265565b5090565b5b8082111562000261576000815560010162000266565b600181811c908216806200029157607f821691505b602082108103620002b257634e487b7160e01b600052602260045260246000fd5b50919050565b612b3680620002c86000396000f3fe6080604052600436106102715760003560e01c8063715018a61161014f578063c52e7121116100c1578063dd9acb491161007a578063dd9acb491461077c578063e16c090414610792578063e985e9c5146107be578063edd8f96914610807578063eee9a0951461081d578063f2fde38b1461083057600080fd5b8063c52e7121146106c2578063c7d27228146106e2578063c87b56dd146106fc578063ca5059301461071c578063cae45c851461073c578063cb3d535f1461075c57600080fd5b8063a22cb46511610113578063a22cb465146105de578063a30e206c146105fe578063aa59a2b21461061e578063ac44600214610633578063b88d4fde14610648578063c1dd1f291461066857600080fd5b8063715018a614610561578063777142571461057657806381ca52ad146105965780638da5cb5b146105ab57806395d89b41146105c957600080fd5b8063251a95c3116101e85780634b89e004116101ac5780634b89e0041461049557806356ab561c146104c25780635af79923146104e15780636352211e146105015780636a10adf01461052157806370a082311461054157600080fd5b8063251a95c3146103f557806331bf3cfd146104155780633b8b8a0b1461043557806342842e0e146104555780634abd07211461047557600080fd5b8063095ea7b31161023a578063095ea7b31461033c5780630a1867661461035c57806318160ddd1461037c57806319ac6f691461039f5780631c4df70e146103bf57806323b872dd146103d557600080fd5b80625ae1131461027657806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef5780630928fc2214610327575b600080fd5b34801561028257600080fd5b50610296610291366004612271565b610850565b005b3480156102a457600080fd5b506102b86102b33660046122bb565b610a82565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610ad4565b6040516102c49190612330565b3480156102fb57600080fd5b5061030f61030a366004612343565b610b66565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102e2610baa565b34801561034857600080fd5b50610296610357366004612373565b610c38565b34801561036857600080fd5b506102966103773660046123ae565b610cd8565b34801561038857600080fd5b50600154600054035b6040519081526020016102c4565b3480156103ab57600080fd5b506102966103ba3660046123c9565b610d18565b3480156103cb57600080fd5b5061039160105481565b3480156103e157600080fd5b506102966103f03660046123e4565b610d4e565b34801561040157600080fd5b50610296610410366004612420565b610ef3565b34801561042157600080fd5b50610296610430366004612466565b610fc2565b34801561044157600080fd5b50610296610450366004612581565b6110b9565b34801561046157600080fd5b506102966104703660046123e4565b6110f6565b34801561048157600080fd5b50610296610490366004612271565b611111565b3480156104a157600080fd5b506103916104b03660046123ae565b600d6020526000908152604090205481565b3480156104ce57600080fd5b50600b546102b890610100900460ff1681565b3480156104ed57600080fd5b506102966104fc3660046125c9565b61123e565b34801561050d57600080fd5b5061030f61051c366004612343565b611273565b34801561052d57600080fd5b5061029661053c3660046125eb565b61127e565b34801561054d57600080fd5b5061039161055c36600461261e565b6112f2565b34801561056d57600080fd5b50610296611340565b34801561058257600080fd5b50610296610591366004612694565b611376565b3480156105a257600080fd5b50610296611506565b3480156105b757600080fd5b506008546001600160a01b031661030f565b3480156105d557600080fd5b506102e2611544565b3480156105ea57600080fd5b506102966105f93660046126c8565b611553565b34801561060a57600080fd5b50600f5461030f906001600160a01b031681565b34801561062a57600080fd5b506102966115e8565b34801561063f57600080fd5b5061029661162f565b34801561065457600080fd5b50610296610663366004612704565b611742565b34801561067457600080fd5b506106a7610683366004612343565b600c60205260009081526040902080546001820154600290920154909160ff169083565b604080519384529115156020840152908201526060016102c4565b3480156106ce57600080fd5b506102966106dd36600461277f565b61178c565b3480156106ee57600080fd5b50600b546102b89060ff1681565b34801561070857600080fd5b506102e2610717366004612343565b6117ca565b34801561072857600080fd5b506102966107373660046123c9565b61184e565b34801561074857600080fd5b506102966107573660046127a2565b6118f3565b34801561076857600080fd5b506103916107773660046123c9565b61197f565b34801561078857600080fd5b5061039160115481565b34801561079e57600080fd5b506013546107ac9060ff1681565b60405160ff90911681526020016102c4565b3480156107ca57600080fd5b506102b86107d93660046127e6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081357600080fd5b50610391600e5481565b61029661082b366004612810565b6119f2565b34801561083c57600080fd5b5061029661084b36600461261e565b611baf565b60005b81518161ffff161015610a7e57336001600160a01b0316610894838361ffff168151811061088357610883612854565b602002602001015161ffff16611273565b6001600160a01b0316146108c35760405162461bcd60e51b81526004016108ba9061286a565b60405180910390fd5b600c6000838361ffff16815181106108dd576108dd612854565b60209081029190910181015161ffff1682528101919091526040016000206001015460ff166109465742600c6000848461ffff168151811061092157610921612854565b602002602001015161ffff1681526020019081526020016000206002018190556109d6565b600c6000838361ffff168151811061096057610960612854565b602002602001015161ffff168152602001908152602001600020600201544261098991906128c2565b600c6000848461ffff16815181106109a3576109a3612854565b602002602001015161ffff16815260200190815260200160002060000160008282546109cf91906128d9565b9250508190555b50600c6000838361ffff16815181106109f1576109f1612854565b602002602001015161ffff16815260200190815260200160002060010160009054906101000a900460ff1615600c6000848461ffff1681518110610a3757610a37612854565b602002602001015161ffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055508080610a76906128f1565b915050610853565b5050565b60006301ffc9a760e01b6001600160e01b031983161480610ab357506380ac58cd60e01b6001600160e01b03198316145b80610ace5750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610ae390612912565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0f90612912565b8015610b5c5780601f10610b3157610100808354040283529160200191610b5c565b820191906000526020600020905b815481529060010190602001808311610b3f57829003601f168201915b5050505050905090565b6000610b7182611c47565b610b8e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600a8054610bb790612912565b80601f0160208091040260200160405190810160405280929190818152602001828054610be390612912565b8015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b505050505081565b6000610c4382611273565b9050336001600160a01b03821614610c7c57610c5f81336107d9565b610c7c576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610d025760405162461bcd60e51b81526004016108ba9061294c565b6013805460ff191660ff92909216919091179055565b6008546001600160a01b03163314610d425760405162461bcd60e51b81526004016108ba9061294c565b610d4b81611c6e565b50565b6000610d5982611c8b565b9050836001600160a01b0316816001600160a01b031614610d8c5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610dd957610dbc86336107d9565b610dd957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610e0057604051633a954ecd60e21b815260040160405180910390fd5b610e0d8686866001611cf2565b8015610e1857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610eaa57600184016000818152600460205260408120549003610ea8576000548114610ea85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600f546001600160a01b0316331480610f1657506008546001600160a01b031633145b610f565760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba37b960791b60448201526064016108ba565b60005b8151811015610fbd5782600c6000848481518110610f7957610f79612854565b602002602001015161ffff1681526020019081526020016000206000016000828254610fa591906128d9565b90915550819050610fb581612981565b915050610f59565b505050565b6008546001600160a01b03163314610fec5760405162461bcd60e51b81526004016108ba9061294c565b60005b81518161ffff161015610a7e576115b3828261ffff168151811061101557611015612854565b60200260200101516000015160ff166110316001546000540390565b61103b91906128d9565b106110585760405162461bcd60e51b81526004016108ba9061299a565b6110a7828261ffff168151811061107157611071612854565b602002602001015160200151838361ffff168151811061109357611093612854565b60200260200101516000015160ff16611d18565b806110b1816128f1565b915050610fef565b6008546001600160a01b031633146110e35760405162461bcd60e51b81526004016108ba9061294c565b8051610a7e90600a9060208401906120be565b610fbd83838360405180602001604052806000815250611742565b6008546001600160a01b0316331461113b5760405162461bcd60e51b81526004016108ba9061294c565b60005b81518161ffff161015610a7e57600c6000838361ffff168151811061116557611165612854565b602002602001015161ffff168152602001908152602001600020600201544261118e91906128c2565b600c6000848461ffff16815181106111a8576111a8612854565b602002602001015161ffff16815260200190815260200160002060000160008282546111d491906128d9565b925050819055506000600c6000848461ffff16815181106111f7576111f7612854565b602002602001015161ffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055508080611236906128f1565b91505061113e565b6008546001600160a01b031633146112685760405162461bcd60e51b81526004016108ba9061294c565b601091909155601155565b6000610ace82611c8b565b6008546001600160a01b031633146112a85760405162461bcd60e51b81526004016108ba9061294c565b6115b38161ffff166112bd6001546000540390565b6112c791906128d9565b106112e45760405162461bcd60e51b81526004016108ba9061299a565b610a7e828261ffff16611d18565b60006001600160a01b03821661131b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461136a5760405162461bcd60e51b81526004016108ba9061294c565b6113746000611d32565b565b6115b36113866001546000540390565b6113919060016128d9565b106113ae5760405162461bcd60e51b81526004016108ba9061299a565b6001600052600d60209081527ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c5546040516001600160601b03193360601b169281019290925261141a918391906034015b60405160208183030381529060405280519060200120611d84565b6114365760405162461bcd60e51b81526004016108ba906129bc565b33600090815260126020526040902054600160ff9091161061149a5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f6e652066726565206d696e7420706c656173650000000000000060448201526064016108ba565b600b5460ff16156114bd5760405162461bcd60e51b81526004016108ba906129e5565b6114c8336001611d18565b3360009081526012602052604081208054600192906114eb90849060ff16612a33565b92506101000a81548160ff021916908360ff16021790555050565b6008546001600160a01b031633146115305760405162461bcd60e51b81526004016108ba9061294c565b600b805460ff19811660ff90911615179055565b606060038054610ae390612912565b336001600160a01b0383160361157c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146116125760405162461bcd60e51b81526004016108ba9061294c565b600b805461ff001981166101009182900460ff1615909102179055565b6008546001600160a01b031633146116595760405162461bcd60e51b81526004016108ba9061294c565b6002600954036116ab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108ba565b6002600955604051600090339047908381818185875af1925050503d80600081146116f2576040519150601f19603f3d011682016040523d82523d6000602084013e6116f7565b606091505b505090508061173a5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108ba565b506001600955565b61174d848484610d4e565b6001600160a01b0383163b156117865761176984848484611d9a565b611786576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117b65760405162461bcd60e51b81526004016108ba9061294c565b60ff166000908152600d6020526040902055565b60606117d582611c47565b6117f257604051630a14c4b560e41b815260040160405180910390fd5b60006117fc611e86565b9050805160000361181c5760405180602001604052806000815250611847565b8061182684611e95565b604051602001611837929190612a58565b6040516020818303038152906040525b9392505050565b3361185c61ffff8316611273565b6001600160a01b0316146118825760405162461bcd60e51b81526004016108ba9061286a565b600e5461ffff82166000908152600c60205260409020600201546118a690426128c2565b6118b09190612a87565b61ffff82166000908152600c6020526040812080549091906118d39084906128d9565b909155505061ffff166000908152600c6020526040902042600290910155565b6002600052600d60209081527f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc249546040516001600160601b03193360601b1692810192909252611948918491906034016113ff565b8061195d57506008546001600160a01b031633145b6119795760405162461bcd60e51b81526004016108ba906129bc565b600e5550565b61ffff81166000908152600c602052604081206001015460ff166119b65761ffff82166000908152600c6020526040902054610ace565b600e5461ffff83166000908152600c6020526040902080546002909101546119de90426128c2565b6119e891906128d9565b610ace9190612a87565b60135460ff1661ffff8216611a29336001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b611a3391906128d9565b1115611a815760405162461bcd60e51b815260206004820152601a60248201527f43616e2774206d696e74206d6f7265207468616e206c696d697400000000000060448201526064016108ba565b6115b38161ffff16611a966001546000540390565b611aa091906128d9565b10611abd5760405162461bcd60e51b81526004016108ba9061299a565b600b54610100900460ff1615611b60578061ffff16601054611adf9190612a87565b341015611aeb57600080fd5b60008052600d60209081527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee546040516001600160601b03193360601b1692810192909252611b3f918491906034016113ff565b611b5b5760405162461bcd60e51b81526004016108ba906129bc565b611b7e565b8061ffff16601154611b729190612a87565b341015611b7e57600080fd5b600b5460ff1615611ba15760405162461bcd60e51b81526004016108ba906129e5565b610a7e338261ffff16611d18565b6008546001600160a01b03163314611bd95760405162461bcd60e51b81526004016108ba9061294c565b6001600160a01b038116611c3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ba565b610d4b81611d32565b6000805482108015610ace575050600090815260046020526040902054600160e01b161590565b8061ffff16600080828254611c8391906128d9565b909155505050565b600081600054811015611cd95760008181526004602052604081205490600160e01b82169003611cd7575b80600003611847575060001901600081815260046020526040902054611cb6565b505b604051636f96cda160e11b815260040160405180910390fd5b506000908152600c6020526040812060018101805460ff19169055818155600201555050565b610a7e828260405180602001604052806000815250611ecd565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611d918584611f3a565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611dcf903390899088908890600401612aa6565b6020604051808303816000875af1925050508015611e0a575060408051601f3d908101601f19168201909252611e0791810190612ae3565b60015b611e68573d808015611e38576040519150601f19603f3d011682016040523d82523d6000602084013e611e3d565b606091505b508051600003611e60576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610ae390612912565b604080516080019081905280825b600183039250600a81066030018353600a900480611ea35750819003601f19909101908152919050565b611ed78383611f87565b6001600160a01b0383163b15610fbd576000548281035b611f016000868380600101945086611d9a565b611f1e576040516368d2bf6b60e11b815260040160405180910390fd5b818110611eee578160005414611f3357600080fd5b5050505050565b600081815b8451811015611f7f57611f6b82868381518110611f5e57611f5e612854565b6020026020010151612092565b915080611f7781612981565b915050611f3f565b509392505050565b6000805490829003611fac5760405163b562e8dd60e01b815260040160405180910390fd5b611fb96000848385611cf2565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461206857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612030565b508160000361208957604051622e076360e81b815260040160405180910390fd5b60005550505050565b60008183106120ae576000828152602084905260409020611847565b5060009182526020526040902090565b8280546120ca90612912565b90600052602060002090601f0160209004810192826120ec5760008555612132565b82601f1061210557805160ff1916838001178555612132565b82800160010185558215612132579182015b82811115612132578251825591602001919060010190612117565b5061213e929150612142565b5090565b5b8082111561213e5760008155600101612143565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561218f5761218f612157565b60405290565b604051601f8201601f191681016001600160401b03811182821017156121bd576121bd612157565b604052919050565b60006001600160401b038211156121de576121de612157565b5060051b60200190565b803561ffff811681146121fa57600080fd5b919050565b600082601f83011261221057600080fd5b81356020612225612220836121c5565b612195565b82815260059290921b8401810191818101908684111561224457600080fd5b8286015b8481101561226657612259816121e8565b8352918301918301612248565b509695505050505050565b60006020828403121561228357600080fd5b81356001600160401b0381111561229957600080fd5b611e7e848285016121ff565b6001600160e01b031981168114610d4b57600080fd5b6000602082840312156122cd57600080fd5b8135611847816122a5565b60005b838110156122f35781810151838201526020016122db565b838111156117865750506000910152565b6000815180845261231c8160208601602086016122d8565b601f01601f19169290920160200192915050565b6020815260006118476020830184612304565b60006020828403121561235557600080fd5b5035919050565b80356001600160a01b03811681146121fa57600080fd5b6000806040838503121561238657600080fd5b61238f8361235c565b946020939093013593505050565b803560ff811681146121fa57600080fd5b6000602082840312156123c057600080fd5b6118478261239d565b6000602082840312156123db57600080fd5b611847826121e8565b6000806000606084860312156123f957600080fd5b6124028461235c565b92506124106020850161235c565b9150604084013590509250925092565b6000806040838503121561243357600080fd5b8235915060208301356001600160401b0381111561245057600080fd5b61245c858286016121ff565b9150509250929050565b6000602080838503121561247957600080fd5b82356001600160401b0381111561248f57600080fd5b8301601f810185136124a057600080fd5b80356124ae612220826121c5565b81815260069190911b820183019083810190878311156124cd57600080fd5b928401925b8284101561251f57604084890312156124eb5760008081fd5b6124f361216d565b6124fc8561239d565b815261250986860161235c565b81870152825260409390930192908401906124d2565b979650505050505050565b60006001600160401b0383111561254357612543612157565b612556601f8401601f1916602001612195565b905082815283838301111561256a57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561259357600080fd5b81356001600160401b038111156125a957600080fd5b8201601f810184136125ba57600080fd5b611e7e8482356020840161252a565b600080604083850312156125dc57600080fd5b50508035926020909101359150565b600080604083850312156125fe57600080fd5b6126078361235c565b9150612615602084016121e8565b90509250929050565b60006020828403121561263057600080fd5b6118478261235c565b600082601f83011261264a57600080fd5b8135602061265a612220836121c5565b82815260059290921b8401810191818101908684111561267957600080fd5b8286015b84811015612266578035835291830191830161267d565b6000602082840312156126a657600080fd5b81356001600160401b038111156126bc57600080fd5b611e7e84828501612639565b600080604083850312156126db57600080fd5b6126e48361235c565b9150602083013580151581146126f957600080fd5b809150509250929050565b6000806000806080858703121561271a57600080fd5b6127238561235c565b93506127316020860161235c565b92506040850135915060608501356001600160401b0381111561275357600080fd5b8501601f8101871361276457600080fd5b6127738782356020840161252a565b91505092959194509250565b6000806040838503121561279257600080fd5b823591506126156020840161239d565b600080604083850312156127b557600080fd5b82356001600160401b038111156127cb57600080fd5b6127d785828601612639565b95602094909401359450505050565b600080604083850312156127f957600080fd5b6128028361235c565b91506126156020840161235c565b6000806040838503121561282357600080fd5b82356001600160401b0381111561283957600080fd5b61284585828601612639565b925050612615602084016121e8565b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f596f75277265206e6f7420746865206f776e6572206f66207468697320746f6b60408201526132b760f11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156128d4576128d46128ac565b500390565b600082198211156128ec576128ec6128ac565b500190565b600061ffff808316818103612908576129086128ac565b6001019392505050565b600181811c9082168061292657607f821691505b60208210810361294657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201612993576129936128ac565b5060010190565b60208082526008908201526714dbdb19081bdd5d60c21b604082015260600190565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602e908201527f3e4d494e54205041555345443c20546865206d696e742069732070617573656460408201526d080f935253950814105554d1510f60921b606082015260800190565b600060ff821660ff84168060ff03821115612a5057612a506128ac565b019392505050565b60008351612a6a8184602088016122d8565b835190830190612a7e8183602088016122d8565b01949350505050565b6000816000190483118215151615612aa157612aa16128ac565b500290565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ad990830184612304565b9695505050505050565b600060208284031215612af557600080fd5b8151611847816122a556fea2646970667358221220f2d7f433305e7f9962a427666e4fc252a42d4c2456f534898171dd2d8a6b159c64736f6c634300080e0033697066733a2f2f516d504e68326d35393570576e78526253555358786e544c39314b484c51763154514567473848344855644466522f

Deployed Bytecode

0x6080604052600436106102715760003560e01c8063715018a61161014f578063c52e7121116100c1578063dd9acb491161007a578063dd9acb491461077c578063e16c090414610792578063e985e9c5146107be578063edd8f96914610807578063eee9a0951461081d578063f2fde38b1461083057600080fd5b8063c52e7121146106c2578063c7d27228146106e2578063c87b56dd146106fc578063ca5059301461071c578063cae45c851461073c578063cb3d535f1461075c57600080fd5b8063a22cb46511610113578063a22cb465146105de578063a30e206c146105fe578063aa59a2b21461061e578063ac44600214610633578063b88d4fde14610648578063c1dd1f291461066857600080fd5b8063715018a614610561578063777142571461057657806381ca52ad146105965780638da5cb5b146105ab57806395d89b41146105c957600080fd5b8063251a95c3116101e85780634b89e004116101ac5780634b89e0041461049557806356ab561c146104c25780635af79923146104e15780636352211e146105015780636a10adf01461052157806370a082311461054157600080fd5b8063251a95c3146103f557806331bf3cfd146104155780633b8b8a0b1461043557806342842e0e146104555780634abd07211461047557600080fd5b8063095ea7b31161023a578063095ea7b31461033c5780630a1867661461035c57806318160ddd1461037c57806319ac6f691461039f5780631c4df70e146103bf57806323b872dd146103d557600080fd5b80625ae1131461027657806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef5780630928fc2214610327575b600080fd5b34801561028257600080fd5b50610296610291366004612271565b610850565b005b3480156102a457600080fd5b506102b86102b33660046122bb565b610a82565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e2610ad4565b6040516102c49190612330565b3480156102fb57600080fd5b5061030f61030a366004612343565b610b66565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b506102e2610baa565b34801561034857600080fd5b50610296610357366004612373565b610c38565b34801561036857600080fd5b506102966103773660046123ae565b610cd8565b34801561038857600080fd5b50600154600054035b6040519081526020016102c4565b3480156103ab57600080fd5b506102966103ba3660046123c9565b610d18565b3480156103cb57600080fd5b5061039160105481565b3480156103e157600080fd5b506102966103f03660046123e4565b610d4e565b34801561040157600080fd5b50610296610410366004612420565b610ef3565b34801561042157600080fd5b50610296610430366004612466565b610fc2565b34801561044157600080fd5b50610296610450366004612581565b6110b9565b34801561046157600080fd5b506102966104703660046123e4565b6110f6565b34801561048157600080fd5b50610296610490366004612271565b611111565b3480156104a157600080fd5b506103916104b03660046123ae565b600d6020526000908152604090205481565b3480156104ce57600080fd5b50600b546102b890610100900460ff1681565b3480156104ed57600080fd5b506102966104fc3660046125c9565b61123e565b34801561050d57600080fd5b5061030f61051c366004612343565b611273565b34801561052d57600080fd5b5061029661053c3660046125eb565b61127e565b34801561054d57600080fd5b5061039161055c36600461261e565b6112f2565b34801561056d57600080fd5b50610296611340565b34801561058257600080fd5b50610296610591366004612694565b611376565b3480156105a257600080fd5b50610296611506565b3480156105b757600080fd5b506008546001600160a01b031661030f565b3480156105d557600080fd5b506102e2611544565b3480156105ea57600080fd5b506102966105f93660046126c8565b611553565b34801561060a57600080fd5b50600f5461030f906001600160a01b031681565b34801561062a57600080fd5b506102966115e8565b34801561063f57600080fd5b5061029661162f565b34801561065457600080fd5b50610296610663366004612704565b611742565b34801561067457600080fd5b506106a7610683366004612343565b600c60205260009081526040902080546001820154600290920154909160ff169083565b604080519384529115156020840152908201526060016102c4565b3480156106ce57600080fd5b506102966106dd36600461277f565b61178c565b3480156106ee57600080fd5b50600b546102b89060ff1681565b34801561070857600080fd5b506102e2610717366004612343565b6117ca565b34801561072857600080fd5b506102966107373660046123c9565b61184e565b34801561074857600080fd5b506102966107573660046127a2565b6118f3565b34801561076857600080fd5b506103916107773660046123c9565b61197f565b34801561078857600080fd5b5061039160115481565b34801561079e57600080fd5b506013546107ac9060ff1681565b60405160ff90911681526020016102c4565b3480156107ca57600080fd5b506102b86107d93660046127e6565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561081357600080fd5b50610391600e5481565b61029661082b366004612810565b6119f2565b34801561083c57600080fd5b5061029661084b36600461261e565b611baf565b60005b81518161ffff161015610a7e57336001600160a01b0316610894838361ffff168151811061088357610883612854565b602002602001015161ffff16611273565b6001600160a01b0316146108c35760405162461bcd60e51b81526004016108ba9061286a565b60405180910390fd5b600c6000838361ffff16815181106108dd576108dd612854565b60209081029190910181015161ffff1682528101919091526040016000206001015460ff166109465742600c6000848461ffff168151811061092157610921612854565b602002602001015161ffff1681526020019081526020016000206002018190556109d6565b600c6000838361ffff168151811061096057610960612854565b602002602001015161ffff168152602001908152602001600020600201544261098991906128c2565b600c6000848461ffff16815181106109a3576109a3612854565b602002602001015161ffff16815260200190815260200160002060000160008282546109cf91906128d9565b9250508190555b50600c6000838361ffff16815181106109f1576109f1612854565b602002602001015161ffff16815260200190815260200160002060010160009054906101000a900460ff1615600c6000848461ffff1681518110610a3757610a37612854565b602002602001015161ffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055508080610a76906128f1565b915050610853565b5050565b60006301ffc9a760e01b6001600160e01b031983161480610ab357506380ac58cd60e01b6001600160e01b03198316145b80610ace5750635b5e139f60e01b6001600160e01b03198316145b92915050565b606060028054610ae390612912565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0f90612912565b8015610b5c5780601f10610b3157610100808354040283529160200191610b5c565b820191906000526020600020905b815481529060010190602001808311610b3f57829003601f168201915b5050505050905090565b6000610b7182611c47565b610b8e576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600a8054610bb790612912565b80601f0160208091040260200160405190810160405280929190818152602001828054610be390612912565b8015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b505050505081565b6000610c4382611273565b9050336001600160a01b03821614610c7c57610c5f81336107d9565b610c7c576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610d025760405162461bcd60e51b81526004016108ba9061294c565b6013805460ff191660ff92909216919091179055565b6008546001600160a01b03163314610d425760405162461bcd60e51b81526004016108ba9061294c565b610d4b81611c6e565b50565b6000610d5982611c8b565b9050836001600160a01b0316816001600160a01b031614610d8c5760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610dd957610dbc86336107d9565b610dd957604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610e0057604051633a954ecd60e21b815260040160405180910390fd5b610e0d8686866001611cf2565b8015610e1857600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610eaa57600184016000818152600460205260408120549003610ea8576000548114610ea85760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600f546001600160a01b0316331480610f1657506008546001600160a01b031633145b610f565760405162461bcd60e51b81526020600482015260116024820152702737ba1030b71034b73a32b930b1ba37b960791b60448201526064016108ba565b60005b8151811015610fbd5782600c6000848481518110610f7957610f79612854565b602002602001015161ffff1681526020019081526020016000206000016000828254610fa591906128d9565b90915550819050610fb581612981565b915050610f59565b505050565b6008546001600160a01b03163314610fec5760405162461bcd60e51b81526004016108ba9061294c565b60005b81518161ffff161015610a7e576115b3828261ffff168151811061101557611015612854565b60200260200101516000015160ff166110316001546000540390565b61103b91906128d9565b106110585760405162461bcd60e51b81526004016108ba9061299a565b6110a7828261ffff168151811061107157611071612854565b602002602001015160200151838361ffff168151811061109357611093612854565b60200260200101516000015160ff16611d18565b806110b1816128f1565b915050610fef565b6008546001600160a01b031633146110e35760405162461bcd60e51b81526004016108ba9061294c565b8051610a7e90600a9060208401906120be565b610fbd83838360405180602001604052806000815250611742565b6008546001600160a01b0316331461113b5760405162461bcd60e51b81526004016108ba9061294c565b60005b81518161ffff161015610a7e57600c6000838361ffff168151811061116557611165612854565b602002602001015161ffff168152602001908152602001600020600201544261118e91906128c2565b600c6000848461ffff16815181106111a8576111a8612854565b602002602001015161ffff16815260200190815260200160002060000160008282546111d491906128d9565b925050819055506000600c6000848461ffff16815181106111f7576111f7612854565b602002602001015161ffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055508080611236906128f1565b91505061113e565b6008546001600160a01b031633146112685760405162461bcd60e51b81526004016108ba9061294c565b601091909155601155565b6000610ace82611c8b565b6008546001600160a01b031633146112a85760405162461bcd60e51b81526004016108ba9061294c565b6115b38161ffff166112bd6001546000540390565b6112c791906128d9565b106112e45760405162461bcd60e51b81526004016108ba9061299a565b610a7e828261ffff16611d18565b60006001600160a01b03821661131b576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b0316331461136a5760405162461bcd60e51b81526004016108ba9061294c565b6113746000611d32565b565b6115b36113866001546000540390565b6113919060016128d9565b106113ae5760405162461bcd60e51b81526004016108ba9061299a565b6001600052600d60209081527ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c5546040516001600160601b03193360601b169281019290925261141a918391906034015b60405160208183030381529060405280519060200120611d84565b6114365760405162461bcd60e51b81526004016108ba906129bc565b33600090815260126020526040902054600160ff9091161061149a5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c79206f6e652066726565206d696e7420706c656173650000000000000060448201526064016108ba565b600b5460ff16156114bd5760405162461bcd60e51b81526004016108ba906129e5565b6114c8336001611d18565b3360009081526012602052604081208054600192906114eb90849060ff16612a33565b92506101000a81548160ff021916908360ff16021790555050565b6008546001600160a01b031633146115305760405162461bcd60e51b81526004016108ba9061294c565b600b805460ff19811660ff90911615179055565b606060038054610ae390612912565b336001600160a01b0383160361157c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146116125760405162461bcd60e51b81526004016108ba9061294c565b600b805461ff001981166101009182900460ff1615909102179055565b6008546001600160a01b031633146116595760405162461bcd60e51b81526004016108ba9061294c565b6002600954036116ab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108ba565b6002600955604051600090339047908381818185875af1925050503d80600081146116f2576040519150601f19603f3d011682016040523d82523d6000602084013e6116f7565b606091505b505090508061173a5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108ba565b506001600955565b61174d848484610d4e565b6001600160a01b0383163b156117865761176984848484611d9a565b611786576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146117b65760405162461bcd60e51b81526004016108ba9061294c565b60ff166000908152600d6020526040902055565b60606117d582611c47565b6117f257604051630a14c4b560e41b815260040160405180910390fd5b60006117fc611e86565b9050805160000361181c5760405180602001604052806000815250611847565b8061182684611e95565b604051602001611837929190612a58565b6040516020818303038152906040525b9392505050565b3361185c61ffff8316611273565b6001600160a01b0316146118825760405162461bcd60e51b81526004016108ba9061286a565b600e5461ffff82166000908152600c60205260409020600201546118a690426128c2565b6118b09190612a87565b61ffff82166000908152600c6020526040812080549091906118d39084906128d9565b909155505061ffff166000908152600c6020526040902042600290910155565b6002600052600d60209081527f10a81eed9d63d16face5e76357905348e6253d3394086026bb2bf2145d7cc249546040516001600160601b03193360601b1692810192909252611948918491906034016113ff565b8061195d57506008546001600160a01b031633145b6119795760405162461bcd60e51b81526004016108ba906129bc565b600e5550565b61ffff81166000908152600c602052604081206001015460ff166119b65761ffff82166000908152600c6020526040902054610ace565b600e5461ffff83166000908152600c6020526040902080546002909101546119de90426128c2565b6119e891906128d9565b610ace9190612a87565b60135460ff1661ffff8216611a29336001600160a01b03166000908152600560205260409081902054901c6001600160401b031690565b611a3391906128d9565b1115611a815760405162461bcd60e51b815260206004820152601a60248201527f43616e2774206d696e74206d6f7265207468616e206c696d697400000000000060448201526064016108ba565b6115b38161ffff16611a966001546000540390565b611aa091906128d9565b10611abd5760405162461bcd60e51b81526004016108ba9061299a565b600b54610100900460ff1615611b60578061ffff16601054611adf9190612a87565b341015611aeb57600080fd5b60008052600d60209081527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee546040516001600160601b03193360601b1692810192909252611b3f918491906034016113ff565b611b5b5760405162461bcd60e51b81526004016108ba906129bc565b611b7e565b8061ffff16601154611b729190612a87565b341015611b7e57600080fd5b600b5460ff1615611ba15760405162461bcd60e51b81526004016108ba906129e5565b610a7e338261ffff16611d18565b6008546001600160a01b03163314611bd95760405162461bcd60e51b81526004016108ba9061294c565b6001600160a01b038116611c3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ba565b610d4b81611d32565b6000805482108015610ace575050600090815260046020526040902054600160e01b161590565b8061ffff16600080828254611c8391906128d9565b909155505050565b600081600054811015611cd95760008181526004602052604081205490600160e01b82169003611cd7575b80600003611847575060001901600081815260046020526040902054611cb6565b505b604051636f96cda160e11b815260040160405180910390fd5b506000908152600c6020526040812060018101805460ff19169055818155600201555050565b610a7e828260405180602001604052806000815250611ecd565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600082611d918584611f3a565b14949350505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611dcf903390899088908890600401612aa6565b6020604051808303816000875af1925050508015611e0a575060408051601f3d908101601f19168201909252611e0791810190612ae3565b60015b611e68573d808015611e38576040519150601f19603f3d011682016040523d82523d6000602084013e611e3d565b606091505b508051600003611e60576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600a8054610ae390612912565b604080516080019081905280825b600183039250600a81066030018353600a900480611ea35750819003601f19909101908152919050565b611ed78383611f87565b6001600160a01b0383163b15610fbd576000548281035b611f016000868380600101945086611d9a565b611f1e576040516368d2bf6b60e11b815260040160405180910390fd5b818110611eee578160005414611f3357600080fd5b5050505050565b600081815b8451811015611f7f57611f6b82868381518110611f5e57611f5e612854565b6020026020010151612092565b915080611f7781612981565b915050611f3f565b509392505050565b6000805490829003611fac5760405163b562e8dd60e01b815260040160405180910390fd5b611fb96000848385611cf2565b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b81811461206857808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101612030565b508160000361208957604051622e076360e81b815260040160405180910390fd5b60005550505050565b60008183106120ae576000828152602084905260409020611847565b5060009182526020526040902090565b8280546120ca90612912565b90600052602060002090601f0160209004810192826120ec5760008555612132565b82601f1061210557805160ff1916838001178555612132565b82800160010185558215612132579182015b82811115612132578251825591602001919060010190612117565b5061213e929150612142565b5090565b5b8082111561213e5760008155600101612143565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171561218f5761218f612157565b60405290565b604051601f8201601f191681016001600160401b03811182821017156121bd576121bd612157565b604052919050565b60006001600160401b038211156121de576121de612157565b5060051b60200190565b803561ffff811681146121fa57600080fd5b919050565b600082601f83011261221057600080fd5b81356020612225612220836121c5565b612195565b82815260059290921b8401810191818101908684111561224457600080fd5b8286015b8481101561226657612259816121e8565b8352918301918301612248565b509695505050505050565b60006020828403121561228357600080fd5b81356001600160401b0381111561229957600080fd5b611e7e848285016121ff565b6001600160e01b031981168114610d4b57600080fd5b6000602082840312156122cd57600080fd5b8135611847816122a5565b60005b838110156122f35781810151838201526020016122db565b838111156117865750506000910152565b6000815180845261231c8160208601602086016122d8565b601f01601f19169290920160200192915050565b6020815260006118476020830184612304565b60006020828403121561235557600080fd5b5035919050565b80356001600160a01b03811681146121fa57600080fd5b6000806040838503121561238657600080fd5b61238f8361235c565b946020939093013593505050565b803560ff811681146121fa57600080fd5b6000602082840312156123c057600080fd5b6118478261239d565b6000602082840312156123db57600080fd5b611847826121e8565b6000806000606084860312156123f957600080fd5b6124028461235c565b92506124106020850161235c565b9150604084013590509250925092565b6000806040838503121561243357600080fd5b8235915060208301356001600160401b0381111561245057600080fd5b61245c858286016121ff565b9150509250929050565b6000602080838503121561247957600080fd5b82356001600160401b0381111561248f57600080fd5b8301601f810185136124a057600080fd5b80356124ae612220826121c5565b81815260069190911b820183019083810190878311156124cd57600080fd5b928401925b8284101561251f57604084890312156124eb5760008081fd5b6124f361216d565b6124fc8561239d565b815261250986860161235c565b81870152825260409390930192908401906124d2565b979650505050505050565b60006001600160401b0383111561254357612543612157565b612556601f8401601f1916602001612195565b905082815283838301111561256a57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561259357600080fd5b81356001600160401b038111156125a957600080fd5b8201601f810184136125ba57600080fd5b611e7e8482356020840161252a565b600080604083850312156125dc57600080fd5b50508035926020909101359150565b600080604083850312156125fe57600080fd5b6126078361235c565b9150612615602084016121e8565b90509250929050565b60006020828403121561263057600080fd5b6118478261235c565b600082601f83011261264a57600080fd5b8135602061265a612220836121c5565b82815260059290921b8401810191818101908684111561267957600080fd5b8286015b84811015612266578035835291830191830161267d565b6000602082840312156126a657600080fd5b81356001600160401b038111156126bc57600080fd5b611e7e84828501612639565b600080604083850312156126db57600080fd5b6126e48361235c565b9150602083013580151581146126f957600080fd5b809150509250929050565b6000806000806080858703121561271a57600080fd5b6127238561235c565b93506127316020860161235c565b92506040850135915060608501356001600160401b0381111561275357600080fd5b8501601f8101871361276457600080fd5b6127738782356020840161252a565b91505092959194509250565b6000806040838503121561279257600080fd5b823591506126156020840161239d565b600080604083850312156127b557600080fd5b82356001600160401b038111156127cb57600080fd5b6127d785828601612639565b95602094909401359450505050565b600080604083850312156127f957600080fd5b6128028361235c565b91506126156020840161235c565b6000806040838503121561282357600080fd5b82356001600160401b0381111561283957600080fd5b61284585828601612639565b925050612615602084016121e8565b634e487b7160e01b600052603260045260246000fd5b60208082526022908201527f596f75277265206e6f7420746865206f776e6572206f66207468697320746f6b60408201526132b760f11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000828210156128d4576128d46128ac565b500390565b600082198211156128ec576128ec6128ac565b500190565b600061ffff808316818103612908576129086128ac565b6001019392505050565b600181811c9082168061292657607f821691505b60208210810361294657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201612993576129936128ac565b5060010190565b60208082526008908201526714dbdb19081bdd5d60c21b604082015260600190565b6020808252600f908201526e139bdd081dda1a5d195b1a5cdd1959608a1b604082015260600190565b6020808252602e908201527f3e4d494e54205041555345443c20546865206d696e742069732070617573656460408201526d080f935253950814105554d1510f60921b606082015260800190565b600060ff821660ff84168060ff03821115612a5057612a506128ac565b019392505050565b60008351612a6a8184602088016122d8565b835190830190612a7e8183602088016122d8565b01949350505050565b6000816000190483118215151615612aa157612aa16128ac565b500290565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612ad990830184612304565b9695505050505050565b600060208284031215612af557600080fd5b8151611847816122a556fea2646970667358221220f2d7f433305e7f9962a427666e4fc252a42d4c2456f534898171dd2d8a6b159c64736f6c634300080e0033

Deployed Bytecode Sourcemap

42851:6906:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46901:585;;;;;;;;;;-1:-1:-1;46901:585:0;;;;;:::i;:::-;;:::i;:::-;;28132:227;;;;;;;;;;-1:-1:-1;28132:227:0;;;;;:::i;:::-;;:::i;:::-;;;2611:14:1;;2604:22;2586:41;;2574:2;2559:18;28132:227:0;;;;;;;;28369:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31583:209::-;;;;;;;;;;-1:-1:-1;31583:209:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3738:32:1;;;3720:51;;3708:2;3693:18;31583:209:0;3574:203:1;42961:89:0;;;;;;;;;;;;;:::i;31175:400::-;;;;;;;;;;-1:-1:-1;31175:400:0;;;;;:::i;:::-;;:::i;44506:104::-;;;;;;;;;;-1:-1:-1;44506:104:0;;;;;:::i;:::-;;:::i;26471:166::-;;;;;;;;;;-1:-1:-1;26592:12:0;;26532:7;26576:13;:28;26471:166;;;4713:25:1;;;4701:2;4686:18;26471:166:0;4567:177:1;44618:104:0;;;;;;;;;;-1:-1:-1;44618:104:0;;;;;:::i;:::-;;:::i;43537:38::-;;;;;;;;;;;;;;;;33313:1567;;;;;;;;;;-1:-1:-1;33313:1567:0;;;;;:::i;:::-;;:::i;45012:338::-;;;;;;;;;;-1:-1:-1;45012:338:0;;;;;:::i;:::-;;:::i;49451:301::-;;;;;;;;;;-1:-1:-1;49451:301:0;;;;;:::i;:::-;;:::i;44010:113::-;;;;;;;;;;-1:-1:-1;44010:113:0;;;;;:::i;:::-;;:::i;34888:185::-;;;;;;;;;;-1:-1:-1;34888:185:0;;;;;:::i;:::-;;:::i;47494:330::-;;;;;;;;;;-1:-1:-1;47494:330:0;;;;;:::i;:::-;;:::i;43382:49::-;;;;;;;;;;-1:-1:-1;43382:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;43098:33;;;;;;;;;;-1:-1:-1;43098:33:0;;;;;;;;;;;44361:137;;;;;;;;;;-1:-1:-1;44361:137:0;;;;;:::i;:::-;;:::i;29019:152::-;;;;;;;;;;-1:-1:-1;29019:152:0;;;;;:::i;:::-;;:::i;48698:176::-;;;;;;;;;;-1:-1:-1;48698:176:0;;;;;:::i;:::-;;:::i;27025:233::-;;;;;;;;;;-1:-1:-1;27025:233:0;;;;;:::i;:::-;;:::i;18003:103::-;;;;;;;;;;;;;:::i;48882:561::-;;;;;;;;;;-1:-1:-1;48882:561:0;;;;;:::i;:::-;;:::i;44131:99::-;;;;;;;;;;;;;:::i;17780:87::-;;;;;;;;;;-1:-1:-1;17853:6:0;;-1:-1:-1;;;;;17853:6:0;17780:87;;28477:104;;;;;;;;;;;;;:::i;31800:308::-;;;;;;;;;;-1:-1:-1;31800:308:0;;;;;:::i;:::-;;:::i;43495:33::-;;;;;;;;;;-1:-1:-1;43495:33:0;;;;-1:-1:-1;;;;;43495:33:0;;;44238:115;;;;;;;;;;;;;:::i;48500:190::-;;;;;;;;;;;;;:::i;35081:399::-;;;;;;;;;;-1:-1:-1;35081:399:0;;;;;:::i;:::-;;:::i;43328:45::-;;;;;;;;;;-1:-1:-1;43328:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10893:25:1;;;10961:14;;10954:22;10949:2;10934:18;;10927:50;10993:18;;;10986:34;10881:2;10866:18;43328:45:0;10697:329:1;44859:145:0;;;;;;;;;;-1:-1:-1;44859:145:0;;;;;:::i;:::-;;:::i;43059:30::-;;;;;;;;;;-1:-1:-1;43059:30:0;;;;;;;;28589:318;;;;;;;;;;-1:-1:-1;28589:318:0;;;;;:::i;:::-;;:::i;46546:347::-;;;;;;;;;;-1:-1:-1;46546:347:0;;;;;:::i;:::-;;:::i;45358:385::-;;;;;;;;;;-1:-1:-1;45358:385:0;;;;;:::i;:::-;;:::i;47832:315::-;;;;;;;;;;-1:-1:-1;47832:315:0;;;;;:::i;:::-;;:::i;43584:42::-;;;;;;;;;;;;;;;;43703:38;;;;;;;;;;-1:-1:-1;43703:38:0;;;;;;;;;;;11879:4:1;11867:17;;;11849:36;;11837:2;11822:18;43703:38:0;11707:184:1;32116:164:0;;;;;;;;;;-1:-1:-1;32116:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32237:25:0;;;32213:4;32237:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32116:164;43440:46;;;;;;;;;;;;;;;;45751:787;;;;;;:::i;:::-;;:::i;18114:201::-;;;;;;;;;;-1:-1:-1;18114:201:0;;;;;:::i;:::-;;:::i;46901:585::-;46983:8;46979:498;47001:10;:17;46997:1;:21;;;46979:498;;;47075:10;-1:-1:-1;;;;;47049:36:0;:22;47057:10;47068:1;47057:13;;;;;;;;;;:::i;:::-;;;;;;;47049:22;;:7;:22::i;:::-;-1:-1:-1;;;;;47049:36:0;;47041:83;;;;-1:-1:-1;;;47041:83:0;;;;;;;:::i;:::-;;;;;;;;;47141:12;:27;47154:10;47165:1;47154:13;;;;;;;;;;:::i;:::-;;;;;;;;;;;;47141:27;;;;;;;;;;;;-1:-1:-1;47141:27:0;:37;;;;;:229;;47355:15;47314:12;:27;47327:10;47338:1;47327:13;;;;;;;;;;:::i;:::-;;;;;;;47314:27;;;;;;;;;;;;;:38;;:56;;;47141:229;;;47257:12;:27;47270:10;47281:1;47270:13;;;;;;;;;;:::i;:::-;;;;;;;47257:27;;;;;;;;;;;;;:38;;;47239:15;:56;;;;:::i;:::-;47196:12;:27;47209:10;47220:1;47209:13;;;;;;;;;;:::i;:::-;;;;;;;47196:27;;;;;;;;;;;;;:38;;;:100;;;;;;;:::i;:::-;;;;;;;47141:229;;47428:12;:27;47441:10;47452:1;47441:13;;;;;;;;;;:::i;:::-;;;;;;;47428:27;;;;;;;;;;;;;:37;;;;;;;;;;;;47427:38;47387:12;:27;47400:10;47411:1;47400:13;;;;;;;;;;:::i;:::-;;;;;;;47387:27;;;;;;;;;;;;;:37;;;:78;;;;;;;;;;;;;;;;;;47020:3;;;;;:::i;:::-;;;;46979:498;;;;46901:585;:::o;28132:227::-;28217:4;-1:-1:-1;;;;;;;;;28250:25:0;;;;:63;;-1:-1:-1;;;;;;;;;;28288:25:0;;;28250:63;:101;;;-1:-1:-1;;;;;;;;;;28326:25:0;;;28250:101;28234:117;28132:227;-1:-1:-1;;28132:227:0:o;28369:100::-;28423:13;28456:5;28449:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28369:100;:::o;31583:209::-;31650:7;31675:16;31683:7;31675;:16::i;:::-;31670:64;;31700:34;;-1:-1:-1;;;31700:34:0;;;;;;;;;;;31670:64;-1:-1:-1;31754:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;31754:30:0;;31583:209::o;42961:89::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31175:400::-;31256:13;31272:16;31280:7;31272;:16::i;:::-;31256:32;-1:-1:-1;42198:10:0;-1:-1:-1;;;;;31305:28:0;;;31301:175;;31353:44;31370:5;42198:10;32116:164;:::i;31353:44::-;31348:128;;31425:35;;-1:-1:-1;;;31425:35:0;;;;;;;;;;;31348:128;31488:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;31488:35:0;-1:-1:-1;;;;;31488:35:0;;;;;;;;;31539:28;;31488:24;;31539:28;;;;;;;31245:330;31175:400;;:::o;44506:104::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;44573:21:::1;:29:::0;;-1:-1:-1;;44573:29:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;44506:104::o;44618:::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;44681:31:::1;44705:6;44681:23;:31::i;:::-;44618:104:::0;:::o;33313:1567::-;33447:27;33477;33496:7;33477:18;:27::i;:::-;33447:57;;33562:4;-1:-1:-1;;;;;33521:45:0;33537:19;-1:-1:-1;;;;;33521:45:0;;33517:86;;33575:28;;-1:-1:-1;;;33575:28:0;;;;;;;;;;;33517:86;33617:27;33126:24;;;:15;:24;;;;;33259:26;;42198:10;32868:30;;;-1:-1:-1;;;;;32732:28:0;;32846:20;;;32843:56;33721:180;;33814:43;33831:4;42198:10;32116:164;:::i;33814:43::-;33809:92;;33866:35;;-1:-1:-1;;;33866:35:0;;;;;;;;;;;33809:92;-1:-1:-1;;;;;33918:16:0;;33914:52;;33943:23;;-1:-1:-1;;;33943:23:0;;;;;;;;;;;33914:52;33979:43;34001:4;34007:2;34011:7;34020:1;33979:21;:43::i;:::-;34062:15;34059:83;;;34125:1;34104:19;34097:30;34059:83;-1:-1:-1;;;;;34184:24:0;;;;;;;:18;:24;;;;;;34182:26;;-1:-1:-1;;34182:26:0;;;34221:22;;;;;;;;;34219:24;;-1:-1:-1;34219:24:0;;;30923:11;30898:23;30894:41;30881:63;-1:-1:-1;;;30881:63:0;34256:26;;;;:17;:26;;;;;:163;;;;-1:-1:-1;;;34436:47:0;;:52;;34432:336;;34537:1;34527:11;;34505:19;34557:30;;;:17;:30;;;;;;:35;;34553:204;;34632:13;;34617:11;:28;34613:129;;34670:30;;;;:17;:30;;;;;:52;;;34613:129;34490:278;34432:336;34811:7;34807:2;-1:-1:-1;;;;;34792:27:0;34801:4;-1:-1:-1;;;;;34792:27:0;;;;;;;;;;;33436:1444;;;33313:1567;;;:::o;45012:338::-;45124:18;;-1:-1:-1;;;;;45124:18:0;45110:10;:32;;:57;;-1:-1:-1;17853:6:0;;-1:-1:-1;;;;;17853:6:0;45146:10;:21;45110:57;45102:87;;;;-1:-1:-1;;;45102:87:0;;14666:2:1;45102:87:0;;;14648:21:1;14705:2;14685:18;;;14678:30;-1:-1:-1;;;14724:18:1;;;14717:47;14781:18;;45102:87:0;14464:341:1;45102:87:0;45207:10;45202:139;45231:8;:15;45223:5;:23;45202:139;;;45318:9;45274:12;:29;45287:8;45296:5;45287:15;;;;;;;;:::i;:::-;;;;;;;45274:29;;;;;;;;;;;;;:40;;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;45248:7:0;;-1:-1:-1;45248:7:0;;;:::i;:::-;;;;45202:139;;;;45012:338;;:::o;49451:301::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;49539:8:::1;49535:210;49557:12;:19;49553:1;:23;;;49535:210;;;49648:4;49623:12;49636:1;49623:15;;;;;;;;;;:::i;:::-;;;;;;;:22;;;49607:38;;:13;26592:12:::0;;26532:7;26576:13;:28;;26471:166;49607:13:::1;:38;;;;:::i;:::-;:45;49599:66;;;;-1:-1:-1::0;;;49599:66:0::1;;;;;;;:::i;:::-;49680:53;49690:12;49703:1;49690:15;;;;;;;;;;:::i;:::-;;;;;;;:18;;;49710:12;49723:1;49710:15;;;;;;;;;;:::i;:::-;;;;;;;:22;;;49680:53;;:9;:53::i;:::-;49578:3:::0;::::1;::::0;::::1;:::i;:::-;;;;49535:210;;44010:113:::0;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;44088:27;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;34888:185::-:0;35026:39;35043:4;35049:2;35053:7;35026:39;;;;;;;;;;;;:16;:39::i;47494:330::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;47585:8:::1;47581:234;47603:10;:17;47599:1;:21;;;47581:234;;;47704:12;:27;47717:10;47728:1;47717:13;;;;;;;;;;:::i;:::-;;;;;;;47704:27;;;;;;;;;;;;;:38;;;47686:15;:56;;;;:::i;:::-;47643:12;:27;47656:10;47667:1;47656:13;;;;;;;;;;:::i;:::-;;;;;;;47643:27;;;;;;;;;;;;;:38;;;:100;;;;;;;:::i;:::-;;;;;;;;47798:5;47758:12;:27;47771:10;47782:1;47771:13;;;;;;;;;;:::i;:::-;;;;;;;47758:27;;;;;;;;;;;;;:37;;;:45;;;;;;;;;;;;;;;;;;47622:3;;;;;:::i;:::-;;;;47581:234;;44361:137:::0;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;44439:13:::1;:18:::0;;;;44468:17:::1;:22:::0;44361:137::o;29019:152::-;29091:7;29134:27;29153:7;29134:18;:27::i;48698:176::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;48815:4:::1;48803:8;48787:24;;:13;26592:12:::0;;26532:7;26576:13;:28;;26471:166;48787:13:::1;:24;;;;:::i;:::-;48786:33;48778:54;;;;-1:-1:-1::0;;;48778:54:0::1;;;;;;;:::i;:::-;48843:23;48853:2;48857:8;48843:23;;:9;:23::i;27025:233::-:0;27097:7;-1:-1:-1;;;;;27121:19:0;;27117:60;;27149:28;;-1:-1:-1;;;27149:28:0;;;;;;;;;;;27117:60;-1:-1:-1;;;;;;27195:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;27195:55:0;;27025:233::o;18003:103::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;18068:30:::1;18095:1;18068:18;:30::i;:::-;18003:103::o:0;48882:561::-;48978:4;48958:13;26592:12;;26532:7;26576:13;:28;;26471:166;48958:13;:17;;48974:1;48958:17;:::i;:::-;:24;48950:45;;;;-1:-1:-1;;;48950:45:0;;;;;;;:::i;:::-;49092:1;49075:19;;:16;:19;;;;;;;49123:28;-1:-1:-1;;;;;;49140:10:0;15435:2:1;15431:15;15427:53;49123:28:0;;;15415:66:1;;;;49014:139:0;;49051:5;;49075:19;15497:12:1;;49123:28:0;;;;;;;;;;;;;49113:39;;;;;;49014:18;:139::i;:::-;49006:167;;;;-1:-1:-1;;;49006:167:0;;;;;;;:::i;:::-;49217:10;49192:36;;;;:24;:36;;;;;;49231:1;49192:36;;;;:40;49184:78;;;;-1:-1:-1;;;49184:78:0;;16066:2:1;49184:78:0;;;16048:21:1;16105:2;16085:18;;;16078:30;16144:27;16124:18;;;16117:55;16189:18;;49184:78:0;15864:349:1;49184:78:0;49282:11;;;;49281:12;49273:71;;;;-1:-1:-1;;;49273:71:0;;;;;;;:::i;:::-;49357:24;49367:10;49379:1;49357:9;:24::i;:::-;49417:10;49392:36;;;;:24;:36;;;;;:41;;49432:1;;49392:36;:41;;49432:1;;49392:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;48882:561;:::o;44131:99::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;44209:11:::1;::::0;;-1:-1:-1;;44194:26:0;::::1;44209:11;::::0;;::::1;44208:12;44194:26;::::0;;44131:99::o;28477:104::-;28533:13;28566:7;28559:14;;;;;:::i;31800:308::-;42198:10;-1:-1:-1;;;;;31899:31:0;;;31895:61;;31939:17;;-1:-1:-1;;;31939:17:0;;;;;;;;;;;31895:61;42198:10;31969:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;31969:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;31969:60:0;;;;;;;;;;32045:55;;2586:41:1;;;31969:49:0;;42198:10;32045:55;;2559:18:1;32045:55:0;;;;;;;31800:308;;:::o;44238:115::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;44329:14:::1;::::0;;-1:-1:-1;;44311:32:0;::::1;44329:14;::::0;;;::::1;;;44328:15;44311:32:::0;;::::1;;::::0;;44238:115::o;48500:190::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;7077:1:::1;7227:7;;:19:::0;7219:63:::1;;;::::0;-1:-1:-1;;;7219:63:0;;17044:2:1;7219:63:0::1;::::0;::::1;17026:21:1::0;17083:2;17063:18;;;17056:30;17122:33;17102:18;;;17095:61;17173:18;;7219:63:0::1;16842:355:1::0;7219:63:0::1;7077:1;7295:7;:18:::0;48587:49:::2;::::0;48569:12:::2;::::0;48587:10:::2;::::0;48610:21:::2;::::0;48569:12;48587:49;48569:12;48587:49;48610:21;48587:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48568:68;;;48655:7;48647:35;;;::::0;-1:-1:-1;;;48647:35:0;;17614:2:1;48647:35:0::2;::::0;::::2;17596:21:1::0;17653:2;17633:18;;;17626:30;-1:-1:-1;;;17672:18:1;;;17665:45;17727:18;;48647:35:0::2;17412:339:1::0;48647:35:0::2;-1:-1:-1::0;7033:1:0::1;7340:7;:22:::0;48500:190::o;35081:399::-;35248:31;35261:4;35267:2;35271:7;35248:12;:31::i;:::-;-1:-1:-1;;;;;35294:14:0;;;:19;35290:183;;35333:56;35364:4;35370:2;35374:7;35383:5;35333:30;:56::i;:::-;35328:145;;35417:40;;-1:-1:-1;;;35417:40:0;;;;;;;;;;;35328:145;35081:399;;;;:::o;44859:145::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;44958:21:::1;;;::::0;;;:16:::1;:21;::::0;;;;:38;44859:145::o;28589:318::-;28662:13;28693:16;28701:7;28693;:16::i;:::-;28688:59;;28718:29;;-1:-1:-1;;;28718:29:0;;;;;;;;;;;28688:59;28760:21;28784:10;:8;:10::i;:::-;28760:34;;28818:7;28812:21;28837:1;28812:26;:87;;;;;;;;;;;;;;;;;28865:7;28874:18;28884:7;28874:9;:18::i;:::-;28848:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28812:87;28805:94;28589:318;-1:-1:-1;;;28589:318:0:o;46546:347::-;46642:10;46622:16;;;;:7;:16::i;:::-;-1:-1:-1;;;;;46622:30:0;;46614:77;;;;-1:-1:-1;;;46614:77:0;;;;;;;:::i;:::-;46795:27;;46759:21;;;;;;;:12;:21;;;;;:32;;;46741:50;;:15;:50;:::i;:::-;46740:82;;;;:::i;:::-;46704:21;;;;;;;:12;:21;;;;;:118;;:21;;;:118;;;;;:::i;:::-;;;;-1:-1:-1;;46833:21:0;;;;;;:12;:21;;;;;46868:15;46833:32;;;;:50;46546:347::o;45358:385::-;45562:1;45545:19;;:16;:19;;;;;;;45589:28;-1:-1:-1;;;;;;45606:10:0;15435:2:1;15431:15;15427:53;45589:28:0;;;15415:66:1;;;;45492:127:0;;45525:5;;45545:19;15497:12:1;;45589:28:0;15286:229:1;45492:127:0;:152;;;-1:-1:-1;17853:6:0;;-1:-1:-1;;;;;17853:6:0;45623:10;:21;45492:152;45484:180;;;;-1:-1:-1;;;45484:180:0;;;;;;;:::i;:::-;45677:27;:58;-1:-1:-1;45358:385:0:o;47832:315::-;47929:21;;;47900:7;47929:21;;;:12;:21;;;;;:31;;;;;:208;;48105:21;;;;;;;:12;:21;;;;;:32;47929:208;;;48065:27;;48028:21;;;;;;;:12;:21;;;;;:32;;47993;;;;;47975:50;;:15;:50;:::i;:::-;:85;;;;:::i;:::-;47974:118;;;;:::i;45751:787::-;45888:21;;;;45847:36;;;:25;45861:10;-1:-1:-1;;;;;27355:25:0;27327:7;27355:25;;;:18;:25;;24813:2;27355:25;;;;;:50;;-1:-1:-1;;;;;27354:82:0;;27266:178;45847:25;:36;;;;:::i;:::-;:62;;45839:101;;;;-1:-1:-1;;;45839:101:0;;18606:2:1;45839:101:0;;;18588:21:1;18645:2;18625:18;;;18618:30;18684:28;18664:18;;;18657:56;18730:18;;45839:101:0;18404:350:1;45839:101:0;45990:4;45978:8;45962:24;;:13;26592:12;;26532:7;26576:13;:28;;26471:166;45962:13;:24;;;;:::i;:::-;45961:33;45953:54;;;;-1:-1:-1;;;45953:54:0;;;;;;;:::i;:::-;46024:14;;;;;;;46020:381;;;46096:8;46080:24;;:13;;:24;;;;:::i;:::-;46065:9;:40;;46057:49;;;;;;46200:19;;;:16;:19;;;;;;;46252:28;-1:-1:-1;;;;;;46269:10:0;15435:2:1;15431:15;15427:53;46252:28:0;;;15415:66:1;;;;46131:151:0;;46172:5;;46200:19;15497:12:1;;46252:28:0;15286:229:1;46131:151:0;46123:179;;;;-1:-1:-1;;;46123:179:0;;;;;;;:::i;:::-;46020:381;;;46379:8;46359:28;;:17;;:28;;;;:::i;:::-;46345:9;:43;;46337:52;;;;;;46422:11;;;;46421:12;46413:71;;;;-1:-1:-1;;;46413:71:0;;;;;;;:::i;:::-;46497:31;46507:10;46519:8;46497:31;;:9;:31::i;18114:201::-;17853:6;;-1:-1:-1;;;;;17853:6:0;42198:10;17915:23;17907:68;;;;-1:-1:-1;;;17907:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18203:22:0;::::1;18195:73;;;::::0;-1:-1:-1;;;18195:73:0;;18961:2:1;18195:73:0::1;::::0;::::1;18943:21:1::0;19000:2;18980:18;;;18973:30;19039:34;19019:18;;;19012:62;-1:-1:-1;;;19090:18:1;;;19083:36;19136:19;;18195:73:0::1;18759:402:1::0;18195:73:0::1;18279:28;18298:8;18279:18;:28::i;32288:230::-:0;32353:4;32435:13;;32425:7;:23;32386:124;;;;-1:-1:-1;;32461:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;32461:44:0;:49;;32288:230::o;26645:107::-;26738:6;26721:23;;:13;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;;26645:107:0:o;29726:581::-;29793:7;29828;29918:13;;29911:4;:20;29907:337;;;29952:14;29969:23;;;:17;:23;;;;;;;-1:-1:-1;;;30015:24:0;;:29;;30011:218;;30069:105;30076:6;30086:1;30076:11;30069:105;;-1:-1:-1;;;30143:6:0;30125:25;;;;:17;:25;;;;;;30069:105;;30011:218;29933:311;29907:337;30268:31;;-1:-1:-1;;;30268:31:0;;;;;;;;;;;48155:337;-1:-1:-1;48373:5:0;48334:26;;;:12;:26;;;;;:36;;;:44;;-1:-1:-1;;48334:44:0;;;48389:41;;;48441:37;;:41;-1:-1:-1;;48155:337:0:o;39370:112::-;39447:27;39457:2;39461:8;39447:27;;;;;;;;;;;;:9;:27::i;18323:191::-;18416:6;;;-1:-1:-1;;;;;18433:17:0;;;-1:-1:-1;;;;;;18433:17:0;;;;;;;18466:40;;18416:6;;;18433:17;18416:6;;18466:40;;18397:16;;18466:40;18386:128;18323:191;:::o;7435:190::-;7560:4;7613;7584:25;7597:5;7604:4;7584:12;:25::i;:::-;:33;;7435:190;-1:-1:-1;;;;7435:190:0:o;35821:716::-;36005:88;;-1:-1:-1;;;36005:88:0;;35984:4;;-1:-1:-1;;;;;36005:45:0;;;;;:88;;42198:10;;36072:4;;36078:7;;36087:5;;36005:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36005:88:0;;;;;;;;-1:-1:-1;;36005:88:0;;;;;;;;;;;;:::i;:::-;;;36001:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36288:6;:13;36305:1;36288:18;36284:235;;36334:40;;-1:-1:-1;;;36334:40:0;;;;;;;;;;;36284:235;36477:6;36471:13;36462:6;36458:2;36454:15;36447:38;36001:529;-1:-1:-1;;;;;;36164:64:0;-1:-1:-1;;;36164:64:0;;-1:-1:-1;36001:529:0;35821:716;;;;;;:::o;44730:121::-;44790:13;44825:16;44818:23;;;;;:::i;42224:573::-;42360:4;42354:11;;42367:4;42350:22;42386:17;;;;42350:22;42467:5;42449:219;42515:1;42510:3;42506:11;42499:18;;42566:2;42560:4;42556:13;42552:2;42548:22;42543:3;42535:36;42607:2;42597:13;;42628:25;42449:219;42628:25;-1:-1:-1;42698:13:0;;;-1:-1:-1;;42732:14:0;;;42760:19;;;42732:14;42224:573;-1:-1:-1;42224:573:0:o;38764:598::-;38895:19;38901:2;38905:8;38895:5;:19::i;:::-;-1:-1:-1;;;;;38948:14:0;;;:19;38944:404;;38984:11;38998:13;39042:14;;;39071:217;39098:62;39137:1;39141:2;39145:7;;;;;;39154:5;39098:30;:62::i;:::-;39093:159;;39192:40;;-1:-1:-1;;;39192:40:0;;;;;;;;;;;39093:159;39283:3;39275:5;:11;39071:217;;39323:3;39306:13;;:20;39302:34;;39328:8;;;39302:34;38969:379;;38764:598;;;:::o;7845:296::-;7928:7;7971:4;7928:7;7986:118;8010:5;:12;8006:1;:16;7986:118;;;8059:33;8069:12;8083:5;8089:1;8083:8;;;;;;;;:::i;:::-;;;;;;;8059:9;:33::i;:::-;8044:48;-1:-1:-1;8024:3:0;;;;:::i;:::-;;;;7986:118;;;-1:-1:-1;8121:12:0;7845:296;-1:-1:-1;;;7845:296:0:o;36547:1288::-;36620:20;36643:13;;;36671;;;36667:44;;36693:18;;-1:-1:-1;;;36693:18:0;;;;;;;;;;;36667:44;36724:61;36754:1;36758:2;36762:12;36776:8;36724:21;:61::i;:::-;-1:-1:-1;;;;;36815:22:0;;;;;;:18;:22;;;;24813:2;36815:22;;;:71;;36853:32;36841:45;;36815:71;;;36899:31;;;:17;:31;;;;;-1:-1:-1;31131:15:0;;31105:24;31101:46;30923:11;30898:23;30894:41;30891:52;30881:63;;36899:161;;37114:23;;;;36899:31;;36815:22;;37276:25;36815:22;;37225:157;37454:1;37440:12;37436:20;37398:253;37491:3;37482:7;37479:16;37398:253;;37628:7;37618:8;37615:1;37588:25;37585:1;37582;37577:59;37540:1;37527:15;37398:253;;;37402:69;37676:8;37688:1;37676:13;37672:45;;37698:19;;-1:-1:-1;;;37698:19:0;;;;;;;;;;;37672:45;37730:13;:19;-1:-1:-1;45202:139:0;45012:338;;:::o;11173:149::-;11236:7;11267:1;11263;:5;:51;;11398:13;11450:15;;;11486:4;11479:15;;;11533:4;11517:21;;11263:51;;;-1:-1:-1;11398:13:0;11450:15;;;11486:4;11479:15;11533:4;11517:21;;;11173:149::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:257;218:4;212:11;;;250:17;;-1:-1:-1;;;;;282:34:1;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:4;373:24;146:257;:::o;408:275::-;479:2;473:9;544:2;525:13;;-1:-1:-1;;521:27:1;509:40;;-1:-1:-1;;;;;564:34:1;;600:22;;;561:62;558:88;;;626:18;;:::i;:::-;662:2;655:22;408:275;;-1:-1:-1;408:275:1:o;688:182::-;747:4;-1:-1:-1;;;;;772:6:1;769:30;766:56;;;802:18;;:::i;:::-;-1:-1:-1;847:1:1;843:14;859:4;839:25;;688:182::o;875:159::-;942:20;;1002:6;991:18;;981:29;;971:57;;1024:1;1021;1014:12;971:57;875:159;;;:::o;1039:665::-;1092:5;1145:3;1138:4;1130:6;1126:17;1122:27;1112:55;;1163:1;1160;1153:12;1112:55;1199:6;1186:20;1225:4;1249:59;1265:42;1304:2;1265:42;:::i;:::-;1249:59;:::i;:::-;1342:15;;;1428:1;1424:10;;;;1412:23;;1408:32;;;1373:12;;;;1452:15;;;1449:35;;;1480:1;1477;1470:12;1449:35;1516:2;1508:6;1504:15;1528:147;1544:6;1539:3;1536:15;1528:147;;;1610:22;1628:3;1610:22;:::i;:::-;1598:35;;1653:12;;;;1561;;1528:147;;;-1:-1:-1;1693:5:1;1039:665;-1:-1:-1;;;;;;1039:665:1:o;1709:346::-;1792:6;1845:2;1833:9;1824:7;1820:23;1816:32;1813:52;;;1861:1;1858;1851:12;1813:52;1901:9;1888:23;-1:-1:-1;;;;;1926:6:1;1923:30;1920:50;;;1966:1;1963;1956:12;1920:50;1989:60;2041:7;2032:6;2021:9;2017:22;1989:60;:::i;2060:131::-;-1:-1:-1;;;;;;2134:32:1;;2124:43;;2114:71;;2181:1;2178;2171:12;2196:245;2254:6;2307:2;2295:9;2286:7;2282:23;2278:32;2275:52;;;2323:1;2320;2313:12;2275:52;2362:9;2349:23;2381:30;2405:5;2381:30;:::i;2638:258::-;2710:1;2720:113;2734:6;2731:1;2728:13;2720:113;;;2810:11;;;2804:18;2791:11;;;2784:39;2756:2;2749:10;2720:113;;;2851:6;2848:1;2845:13;2842:48;;;-1:-1:-1;;2886:1:1;2868:16;;2861:27;2638:258::o;2901:::-;2943:3;2981:5;2975:12;3008:6;3003:3;2996:19;3024:63;3080:6;3073:4;3068:3;3064:14;3057:4;3050:5;3046:16;3024:63;:::i;:::-;3141:2;3120:15;-1:-1:-1;;3116:29:1;3107:39;;;;3148:4;3103:50;;2901:258;-1:-1:-1;;2901:258:1:o;3164:220::-;3313:2;3302:9;3295:21;3276:4;3333:45;3374:2;3363:9;3359:18;3351:6;3333:45;:::i;3389:180::-;3448:6;3501:2;3489:9;3480:7;3476:23;3472:32;3469:52;;;3517:1;3514;3507:12;3469:52;-1:-1:-1;3540:23:1;;3389:180;-1:-1:-1;3389:180:1:o;3782:173::-;3850:20;;-1:-1:-1;;;;;3899:31:1;;3889:42;;3879:70;;3945:1;3942;3935:12;3960:254;4028:6;4036;4089:2;4077:9;4068:7;4064:23;4060:32;4057:52;;;4105:1;4102;4095:12;4057:52;4128:29;4147:9;4128:29;:::i;:::-;4118:39;4204:2;4189:18;;;;4176:32;;-1:-1:-1;;;3960:254:1:o;4219:156::-;4285:20;;4345:4;4334:16;;4324:27;;4314:55;;4365:1;4362;4355:12;4380:182;4437:6;4490:2;4478:9;4469:7;4465:23;4461:32;4458:52;;;4506:1;4503;4496:12;4458:52;4529:27;4546:9;4529:27;:::i;4749:184::-;4807:6;4860:2;4848:9;4839:7;4835:23;4831:32;4828:52;;;4876:1;4873;4866:12;4828:52;4899:28;4917:9;4899:28;:::i;4938:328::-;5015:6;5023;5031;5084:2;5072:9;5063:7;5059:23;5055:32;5052:52;;;5100:1;5097;5090:12;5052:52;5123:29;5142:9;5123:29;:::i;:::-;5113:39;;5171:38;5205:2;5194:9;5190:18;5171:38;:::i;:::-;5161:48;;5256:2;5245:9;5241:18;5228:32;5218:42;;4938:328;;;;;:::o;5271:414::-;5363:6;5371;5424:2;5412:9;5403:7;5399:23;5395:32;5392:52;;;5440:1;5437;5430:12;5392:52;5476:9;5463:23;5453:33;;5537:2;5526:9;5522:18;5509:32;-1:-1:-1;;;;;5556:6:1;5553:30;5550:50;;;5596:1;5593;5586:12;5550:50;5619:60;5671:7;5662:6;5651:9;5647:22;5619:60;:::i;:::-;5609:70;;;5271:414;;;;;:::o;5690:1202::-;5799:6;5830:2;5873;5861:9;5852:7;5848:23;5844:32;5841:52;;;5889:1;5886;5879:12;5841:52;5929:9;5916:23;-1:-1:-1;;;;;5954:6:1;5951:30;5948:50;;;5994:1;5991;5984:12;5948:50;6017:22;;6070:4;6062:13;;6058:27;-1:-1:-1;6048:55:1;;6099:1;6096;6089:12;6048:55;6135:2;6122:16;6158:59;6174:42;6213:2;6174:42;:::i;6158:59::-;6251:15;;;6333:1;6329:10;;;;6321:19;;6317:28;;;6282:12;;;;6357:19;;;6354:39;;;6389:1;6386;6379:12;6354:39;6413:11;;;;6433:429;6449:6;6444:3;6441:15;6433:429;;;6531:4;6525:3;6516:7;6512:17;6508:28;6505:118;;;6577:1;6606:2;6602;6595:14;6505:118;6649:22;;:::i;:::-;6698:21;6715:3;6698:21;:::i;:::-;6691:5;6684:36;6756:32;6784:2;6779:3;6775:12;6756:32;:::i;:::-;6740:14;;;6733:56;6802:18;;6475:4;6466:14;;;;;6840:12;;;;6433:429;;;6881:5;5690:1202;-1:-1:-1;;;;;;;5690:1202:1:o;6897:407::-;6962:5;-1:-1:-1;;;;;6988:6:1;6985:30;6982:56;;;7018:18;;:::i;:::-;7056:57;7101:2;7080:15;;-1:-1:-1;;7076:29:1;7107:4;7072:40;7056:57;:::i;:::-;7047:66;;7136:6;7129:5;7122:21;7176:3;7167:6;7162:3;7158:16;7155:25;7152:45;;;7193:1;7190;7183:12;7152:45;7242:6;7237:3;7230:4;7223:5;7219:16;7206:43;7296:1;7289:4;7280:6;7273:5;7269:18;7265:29;7258:40;6897:407;;;;;:::o;7309:451::-;7378:6;7431:2;7419:9;7410:7;7406:23;7402:32;7399:52;;;7447:1;7444;7437:12;7399:52;7487:9;7474:23;-1:-1:-1;;;;;7512:6:1;7509:30;7506:50;;;7552:1;7549;7542:12;7506:50;7575:22;;7628:4;7620:13;;7616:27;-1:-1:-1;7606:55:1;;7657:1;7654;7647:12;7606:55;7680:74;7746:7;7741:2;7728:16;7723:2;7719;7715:11;7680:74;:::i;7947:248::-;8015:6;8023;8076:2;8064:9;8055:7;8051:23;8047:32;8044:52;;;8092:1;8089;8082:12;8044:52;-1:-1:-1;;8115:23:1;;;8185:2;8170:18;;;8157:32;;-1:-1:-1;7947:248:1:o;8200:258::-;8267:6;8275;8328:2;8316:9;8307:7;8303:23;8299:32;8296:52;;;8344:1;8341;8334:12;8296:52;8367:29;8386:9;8367:29;:::i;:::-;8357:39;;8415:37;8448:2;8437:9;8433:18;8415:37;:::i;:::-;8405:47;;8200:258;;;;;:::o;8463:186::-;8522:6;8575:2;8563:9;8554:7;8550:23;8546:32;8543:52;;;8591:1;8588;8581:12;8543:52;8614:29;8633:9;8614:29;:::i;8654:661::-;8708:5;8761:3;8754:4;8746:6;8742:17;8738:27;8728:55;;8779:1;8776;8769:12;8728:55;8815:6;8802:20;8841:4;8865:59;8881:42;8920:2;8881:42;:::i;8865:59::-;8958:15;;;9044:1;9040:10;;;;9028:23;;9024:32;;;8989:12;;;;9068:15;;;9065:35;;;9096:1;9093;9086:12;9065:35;9132:2;9124:6;9120:15;9144:142;9160:6;9155:3;9152:15;9144:142;;;9226:17;;9214:30;;9264:12;;;;9177;;9144:142;;9320:348;9404:6;9457:2;9445:9;9436:7;9432:23;9428:32;9425:52;;;9473:1;9470;9463:12;9425:52;9513:9;9500:23;-1:-1:-1;;;;;9538:6:1;9535:30;9532:50;;;9578:1;9575;9568:12;9532:50;9601:61;9654:7;9645:6;9634:9;9630:22;9601:61;:::i;9673:347::-;9738:6;9746;9799:2;9787:9;9778:7;9774:23;9770:32;9767:52;;;9815:1;9812;9805:12;9767:52;9838:29;9857:9;9838:29;:::i;:::-;9828:39;;9917:2;9906:9;9902:18;9889:32;9964:5;9957:13;9950:21;9943:5;9940:32;9930:60;;9986:1;9983;9976:12;9930:60;10009:5;9999:15;;;9673:347;;;;;:::o;10025:667::-;10120:6;10128;10136;10144;10197:3;10185:9;10176:7;10172:23;10168:33;10165:53;;;10214:1;10211;10204:12;10165:53;10237:29;10256:9;10237:29;:::i;:::-;10227:39;;10285:38;10319:2;10308:9;10304:18;10285:38;:::i;:::-;10275:48;;10370:2;10359:9;10355:18;10342:32;10332:42;;10425:2;10414:9;10410:18;10397:32;-1:-1:-1;;;;;10444:6:1;10441:30;10438:50;;;10484:1;10481;10474:12;10438:50;10507:22;;10560:4;10552:13;;10548:27;-1:-1:-1;10538:55:1;;10589:1;10586;10579:12;10538:55;10612:74;10678:7;10673:2;10660:16;10655:2;10651;10647:11;10612:74;:::i;:::-;10602:84;;;10025:667;;;;;;;:::o;11031:250::-;11097:6;11105;11158:2;11146:9;11137:7;11133:23;11129:32;11126:52;;;11174:1;11171;11164:12;11126:52;11210:9;11197:23;11187:33;;11239:36;11271:2;11260:9;11256:18;11239:36;:::i;11286:416::-;11379:6;11387;11440:2;11428:9;11419:7;11415:23;11411:32;11408:52;;;11456:1;11453;11446:12;11408:52;11496:9;11483:23;-1:-1:-1;;;;;11521:6:1;11518:30;11515:50;;;11561:1;11558;11551:12;11515:50;11584:61;11637:7;11628:6;11617:9;11613:22;11584:61;:::i;:::-;11574:71;11692:2;11677:18;;;;11664:32;;-1:-1:-1;;;;11286:416:1:o;11896:260::-;11964:6;11972;12025:2;12013:9;12004:7;12000:23;11996:32;11993:52;;;12041:1;12038;12031:12;11993:52;12064:29;12083:9;12064:29;:::i;:::-;12054:39;;12112:38;12146:2;12135:9;12131:18;12112:38;:::i;12161:420::-;12253:6;12261;12314:2;12302:9;12293:7;12289:23;12285:32;12282:52;;;12330:1;12327;12320:12;12282:52;12370:9;12357:23;-1:-1:-1;;;;;12395:6:1;12392:30;12389:50;;;12435:1;12432;12425:12;12389:50;12458:61;12511:7;12502:6;12491:9;12487:22;12458:61;:::i;:::-;12448:71;;;12538:37;12571:2;12560:9;12556:18;12538:37;:::i;12586:127::-;12647:10;12642:3;12638:20;12635:1;12628:31;12678:4;12675:1;12668:15;12702:4;12699:1;12692:15;12718:398;12920:2;12902:21;;;12959:2;12939:18;;;12932:30;12998:34;12993:2;12978:18;;12971:62;-1:-1:-1;;;13064:2:1;13049:18;;13042:32;13106:3;13091:19;;12718:398::o;13121:127::-;13182:10;13177:3;13173:20;13170:1;13163:31;13213:4;13210:1;13203:15;13237:4;13234:1;13227:15;13253:125;13293:4;13321:1;13318;13315:8;13312:34;;;13326:18;;:::i;:::-;-1:-1:-1;13363:9:1;;13253:125::o;13383:128::-;13423:3;13454:1;13450:6;13447:1;13444:13;13441:39;;;13460:18;;:::i;:::-;-1:-1:-1;13496:9:1;;13383:128::o;13516:197::-;13554:3;13582:6;13623:2;13616:5;13612:14;13650:2;13641:7;13638:15;13635:41;;13656:18;;:::i;:::-;13705:1;13692:15;;13516:197;-1:-1:-1;;;13516:197:1:o;13718:380::-;13797:1;13793:12;;;;13840;;;13861:61;;13915:4;13907:6;13903:17;13893:27;;13861:61;13968:2;13960:6;13957:14;13937:18;13934:38;13931:161;;14014:10;14009:3;14005:20;14002:1;13995:31;14049:4;14046:1;14039:15;14077:4;14074:1;14067:15;13931:161;;13718:380;;;:::o;14103:356::-;14305:2;14287:21;;;14324:18;;;14317:30;14383:34;14378:2;14363:18;;14356:62;14450:2;14435:18;;14103:356::o;14810:135::-;14849:3;14870:17;;;14867:43;;14890:18;;:::i;:::-;-1:-1:-1;14937:1:1;14926:13;;14810:135::o;14950:331::-;15152:2;15134:21;;;15191:1;15171:18;;;15164:29;-1:-1:-1;;;15224:2:1;15209:18;;15202:38;15272:2;15257:18;;14950:331::o;15520:339::-;15722:2;15704:21;;;15761:2;15741:18;;;15734:30;-1:-1:-1;;;15795:2:1;15780:18;;15773:45;15850:2;15835:18;;15520:339::o;16218:410::-;16420:2;16402:21;;;16459:2;16439:18;;;16432:30;16498:34;16493:2;16478:18;;16471:62;-1:-1:-1;;;16564:2:1;16549:18;;16542:44;16618:3;16603:19;;16218:410::o;16633:204::-;16671:3;16707:4;16704:1;16700:12;16739:4;16736:1;16732:12;16774:3;16768:4;16764:14;16759:3;16756:23;16753:49;;;16782:18;;:::i;:::-;16818:13;;16633:204;-1:-1:-1;;;16633:204:1:o;17756:470::-;17935:3;17973:6;17967:13;17989:53;18035:6;18030:3;18023:4;18015:6;18011:17;17989:53;:::i;:::-;18105:13;;18064:16;;;;18127:57;18105:13;18064:16;18161:4;18149:17;;18127:57;:::i;:::-;18200:20;;17756:470;-1:-1:-1;;;;17756:470:1:o;18231:168::-;18271:7;18337:1;18333;18329:6;18325:14;18322:1;18319:21;18314:1;18307:9;18300:17;18296:45;18293:71;;;18344:18;;:::i;:::-;-1:-1:-1;18384:9:1;;18231:168::o;19166:489::-;-1:-1:-1;;;;;19435:15:1;;;19417:34;;19487:15;;19482:2;19467:18;;19460:43;19534:2;19519:18;;19512:34;;;19582:3;19577:2;19562:18;;19555:31;;;19360:4;;19603:46;;19629:19;;19621:6;19603:46;:::i;:::-;19595:54;19166:489;-1:-1:-1;;;;;;19166:489:1:o;19660:249::-;19729:6;19782:2;19770:9;19761:7;19757:23;19753:32;19750:52;;;19798:1;19795;19788:12;19750:52;19830:9;19824:16;19849:30;19873:5;19849:30;:::i

Swarm Source

ipfs://f2d7f433305e7f9962a427666e4fc252a42d4c2456f534898171dd2d8a6b159c

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.