Contract 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3

Contract Overview

Balance:
0 CRO

CRO Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3b2c44aae471d38c704facb8ea099800c60650435d197c46b33b391461f2637bMint Mystery Box57951352022-11-30 4:33:471 day 1 hr ago0x3a5265f61bd7d0c6a6f6334fa8fd941d6ca35789 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.1216754174410
0x9184aefd694721422128ee5e2bae74dc86f8c768ed2526ad1d62948d92807921Request Random N...57951262022-11-30 4:32:561 day 1 hr ago0x971f312729066c8b72a022e2676452dc09cb2ced IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.119430331052 4,866.959984201
0x45da8a25d6a20756f957779732414250b148e5b31f758c085a40cb2920353634Request Random N...57951042022-11-30 4:30:511 day 1 hr ago0x971f312729066c8b72a022e2676452dc09cb2ced IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.119430356095 4,866.961004741
0x922a19b900001c477e6d3212196987563d6e7e107637a951911b2eb0c2669f29Request Random N...57950862022-11-30 4:29:091 day 1 hr ago0x971f312729066c8b72a022e2676452dc09cb2ced IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.119430376681 4,866.961843645
0x75c7288848292c21b1e1326d2dc8fc1f9f9142ac11e34682f7615169943ebe8cRequest Random N...57950782022-11-30 4:28:231 day 1 hr ago0x971f312729066c8b72a022e2676452dc09cb2ced IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.119430385749 4,866.962213211
0xbe7dd67ce050d16c77a25246f3ba5833477528789a41286579fd53b58ce959c3Mint Mystery Box57949942022-11-30 4:20:221 day 1 hr ago0x3a5265f61bd7d0c6a6f6334fa8fd941d6ca35789 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.1216755796550
0x6dd7d0bf50f5450e2362ece8e6d7175f23b9f4c1788328f73c5aadeea5da1aeeSet Approval For...57940992022-11-30 2:54:571 day 3 hrs ago0x971f312729066c8b72a022e2676452dc09cb2ced IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.231532168992 4,868.007421743
0x1d198ed1f35f7fb065185f2c8a2c1b06db3d98e2fd0eb05c2641fb793524254cMint Mystery Box57940642022-11-30 2:51:351 day 3 hrs ago0x3a5265f61bd7d0c6a6f6334fa8fd941d6ca35789 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.1216766566990
0xd2e317e862457cc51c0d9338c4dc793121b1d1f09068d1876deaf6ce3cd41107Mint Mystery Box57940562022-11-30 2:50:501 day 3 hrs ago0x3a5265f61bd7d0c6a6f6334fa8fd941d6ca35789 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.1216766635280
0xbe32b7f9225b532941414b925d2dce1d1870309f8bdd3e6988d7590ed501e7f2Request Random N...57917262022-11-29 23:08:051 day 6 hrs ago0x3a5265f61bd7d0c6a6f6334fa8fd941d6ca35789 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.119583670602 4,873.208794246
0x0695917b04f79c8c99540614af537e9810e96b0c92752d03097d9f01243f6480Request Random N...57917232022-11-29 23:07:481 day 6 hrs ago0x3a5265f61bd7d0c6a6f6334fa8fd941d6ca35789 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.119580056608 4,873.061518755
0x7183a305a0b3aeec44bced47d1ebc5176603f412a1db43ac11fe034f6571f675Request Random N...57746722022-11-28 20:01:022 days 9 hrs ago0xfb954737c1538f64a993effa0995be6d69246a82 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.1194167592610
0xf02e4291e591c0167ab53b324619b4eae07c883fd191e6e65de98c8a3a280e17Request Random N...57731802022-11-28 17:38:422 days 12 hrs ago0xfb954737c1538f64a993effa0995be6d69246a82 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab32 CRO0.1194184405760
0x55517a875ba5edd68d2d916d9048a18a2252343becf81cc72b5e57199c2faaabSet Paused57719522022-11-28 15:41:262 days 14 hrs ago0x8391771796fc174386f396caa4156a473b29edfd IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.159348380345 4,867.531549801
0xf840afdbf723ec442e5fd3073ac0e11106cb4536de2b3ae0bd9d29d95c02283eMint Mystery Box57665622022-11-28 7:06:582 days 22 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.1607595902660
0x6f9e909961505e37493b1edb14f5b2ada275e0f110b4ac439027169090c1bdf8Mint Mystery Box57663592022-11-28 6:47:362 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460959557490
0x7554698c5c408986853519bea392f882ff028284b6e7ab8c3ab544d4da03886aMint Mystery Box57663412022-11-28 6:45:502 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460960635080
0x009fea87f91ac598606d16582e4c2f2e810d4d25e6212e37c584092a56375e8dMint Mystery Box57662422022-11-28 6:36:222 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460966723420
0xd64c24140d29b0ddc58d907dc91e270c1d1147edbf2c6ae2720975b39dae8222Mint Mystery Box57661152022-11-28 6:24:172 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460974866850
0x4f81c8c2943940e61acb829671143269e4292b0acf57aead2773f1d890c410caMint Mystery Box57661032022-11-28 6:23:092 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460975500260
0x4b30f4c0024b84efc81017634a551d442b5ee87e1f888c77ef1060edf8e54f96Mint Mystery Box57661022022-11-28 6:23:032 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460975500260
0xe2dc92212df994725e2251b358efe079cce1a3429c4a948a265520ab28413795Mint Mystery Box57661012022-11-28 6:22:572 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460975627260
0x7265c5dd2d251bb3d56e0d5e23d919fce40fa1e000c567c11dc9cfe20b5c478cMint Mystery Box57660952022-11-28 6:22:242 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460976053530
0x44178a03d3de7010a506e20afc17175efa03cb30ce9850743239764cf12b8c54Mint Mystery Box57660932022-11-28 6:22:122 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460976177880
0xfb099355844211789840b89a7db68c75fec7b7818b47b1a74eb0b6c12d5c1628Mint Mystery Box57660852022-11-28 6:21:272 days 23 hrs ago0x63a6afd857e541b731c90f153a81539e06d295c5 IN  0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30 CRO0.6460976611450
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x2638d13c03fe6098fe4c81ac004c048e4b7fe990a48994e45579b7b39467300a57648172022-11-28 4:20:183 days 1 hr ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30xf486fea942c2394fe03ed324d67345df9982725f1.352507468909805 CRO
0x2638d13c03fe6098fe4c81ac004c048e4b7fe990a48994e45579b7b39467300a57648172022-11-28 4:20:183 days 1 hr ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.352507468909805 CRO
0x2638d13c03fe6098fe4c81ac004c048e4b7fe990a48994e45579b7b39467300a57648172022-11-28 4:20:183 days 1 hr ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0x39563882d683f6f37643d91934c0b7cce38e6975132ec6cbed1c73550148ff4d57637592022-11-28 2:39:163 days 3 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x634a5dc4cda63ea8d0699d9387cdcfffc6408b841.352700377610951 CRO
0x39563882d683f6f37643d91934c0b7cce38e6975132ec6cbed1c73550148ff4d57637592022-11-28 2:39:163 days 3 hrs ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.352700377610951 CRO
0x39563882d683f6f37643d91934c0b7cce38e6975132ec6cbed1c73550148ff4d57637592022-11-28 2:39:163 days 3 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0x4fda7747fba7a711dc72f0327b76a911ffa2fc34519fb3900e3627c5d09f313457627522022-11-28 1:02:513 days 4 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x9e0c5efe418c2ef8b804ce50bcaf62159e0fb2ad1.352494818086396 CRO
0x4fda7747fba7a711dc72f0327b76a911ffa2fc34519fb3900e3627c5d09f313457627522022-11-28 1:02:513 days 4 hrs ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.352494818086396 CRO
0x4fda7747fba7a711dc72f0327b76a911ffa2fc34519fb3900e3627c5d09f313457627522022-11-28 1:02:513 days 4 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0x820eb820ce9fa2f1a650044741f8b407657553b6a86b7fdc1f53a1cd812513cd57624192022-11-28 0:31:033 days 5 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x63a6afd857e541b731c90f153a81539e06d295c51.35269202925189 CRO
0x820eb820ce9fa2f1a650044741f8b407657553b6a86b7fdc1f53a1cd812513cd57624192022-11-28 0:31:033 days 5 hrs ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.35269202925189 CRO
0x820eb820ce9fa2f1a650044741f8b407657553b6a86b7fdc1f53a1cd812513cd57624192022-11-28 0:31:033 days 5 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0x0dc61fc1f9360f20b53bb531d7511a40a4c419db3c568fd430b9bf7b7d4e6f9057624112022-11-28 0:30:183 days 5 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x63a6afd857e541b731c90f153a81539e06d295c51.35269220186461 CRO
0x0dc61fc1f9360f20b53bb531d7511a40a4c419db3c568fd430b9bf7b7d4e6f9057624112022-11-28 0:30:183 days 5 hrs ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.35269220186461 CRO
0x0dc61fc1f9360f20b53bb531d7511a40a4c419db3c568fd430b9bf7b7d4e6f9057624112022-11-28 0:30:183 days 5 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0xbce277bf1be4637dcfebd2a9ae9c0f84a308111e972e7c3b38114ad0ddc9d47b57614472022-11-27 22:58:083 days 7 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x1b9a3d4c1581004f604ed70bbdb6d2038bf7cdf11.352486871408615 CRO
0xbce277bf1be4637dcfebd2a9ae9c0f84a308111e972e7c3b38114ad0ddc9d47b57614472022-11-27 22:58:083 days 7 hrs ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.352486871408615 CRO
0xbce277bf1be4637dcfebd2a9ae9c0f84a308111e972e7c3b38114ad0ddc9d47b57614472022-11-27 22:58:083 days 7 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0x56dc30d180ae5e50fb60febae1060cbcf86707fd5756c7997fb2b9b3d6b5e12957592122022-11-27 19:24:303 days 10 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x0175029133873c3c855ab955c368060409b9d5271.352473203924561 CRO
0x56dc30d180ae5e50fb60febae1060cbcf86707fd5756c7997fb2b9b3d6b5e12957592122022-11-27 19:24:303 days 10 hrs ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.352473203924561 CRO
0x56dc30d180ae5e50fb60febae1060cbcf86707fd5756c7997fb2b9b3d6b5e12957592122022-11-27 19:24:303 days 10 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0x25d18fd2d06b7a9d8762300b9117114c516512f1783e642b095f42d49e509aee57588672022-11-27 18:51:323 days 11 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x3a5265f61bd7d0c6a6f6334fa8fd941d6ca357891.352670541537677 CRO
0x25d18fd2d06b7a9d8762300b9117114c516512f1783e642b095f42d49e509aee57588672022-11-27 18:51:323 days 11 hrs ago 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab31.352670541537677 CRO
0x25d18fd2d06b7a9d8762300b9117114c516512f1783e642b095f42d49e509aee57588672022-11-27 18:51:323 days 11 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab3 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d32 CRO
0x1825c3cb63fa4c61d7f27343c087a7685464ba3b8d183f8386322b6a0c291d4457555222022-11-27 13:31:543 days 16 hrs ago 0xabfc2af96f1ce3b898124e26e3bb8e1e23f2bab30x0175029133873c3c855ab955c368060409b9d5271.35245069242609 CRO
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MysteryBox

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-09-27
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    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);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed 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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/[email protected]/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/[email protected]/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    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");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    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");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: witnet-solidity-bridge/contracts/interfaces/IWitnetRequest.sol



pragma solidity >=0.7.0 <0.9.0;

/// @title The Witnet Data Request basic interface.
/// @author The Witnet Foundation.
interface IWitnetRequest {
    /// A `IWitnetRequest` is constructed around a `bytes` value containing 
    /// a well-formed Witnet Data Request using Protocol Buffers.
    function bytecode() external view returns (bytes memory);

    /// Returns SHA256 hash of Witnet Data Request as CBOR-encoded bytes.
    function hash() external view returns (bytes32);
}

// File: witnet-solidity-bridge/contracts/libs/Witnet.sol



pragma solidity >=0.7.0 <0.9.0;
pragma experimental ABIEncoderV2;


library Witnet {

    /// @notice Witnet function that computes the hash of a CBOR-encoded Data Request.
    /// @param _bytecode CBOR-encoded RADON.
    function hash(bytes memory _bytecode) internal pure returns (bytes32) {
        return sha256(_bytecode);
    }

    /// Struct containing both request and response data related to every query posted to the Witnet Request Board
    struct Query {
        Request request;
        Response response;
        address from;      // Address from which the request was posted.
    }

    /// Possible status of a Witnet query.
    enum QueryStatus {
        Unknown,
        Posted,
        Reported,
        Deleted
    }

    /// Data kept in EVM-storage for every Request posted to the Witnet Request Board.
    struct Request {
        IWitnetRequest addr;    // The contract containing the Data Request which execution has been requested.
        address requester;      // Address from which the request was posted.
        bytes32 hash;           // Hash of the Data Request whose execution has been requested.
        uint256 gasprice;       // Minimum gas price the DR resolver should pay on the solving tx.
        uint256 reward;         // Escrowed reward to be paid to the DR resolver.
    }

    /// Data kept in EVM-storage containing Witnet-provided response metadata and result.
    struct Response {
        address reporter;       // Address from which the result was reported.
        uint256 timestamp;      // Timestamp of the Witnet-provided result.
        bytes32 drTxHash;       // Hash of the Witnet transaction that solved the queried Data Request.
        bytes   cborBytes;      // Witnet-provided result CBOR-bytes to the queried Data Request.
    }

    /// Data struct containing the Witnet-provided result to a Data Request.
    struct Result {
        bool success;           // Flag stating whether the request could get solved successfully, or not.
        CBOR value;             // Resulting value, in CBOR-serialized bytes.
    }

    /// Data struct following the RFC-7049 standard: Concise Binary Object Representation.
    struct CBOR {
        Buffer buffer;
        uint8 initialByte;
        uint8 majorType;
        uint8 additionalInformation;
        uint64 len;
        uint64 tag;
    }

    /// Iterable bytes buffer.
    struct Buffer {
        bytes data;
        uint32 cursor;
    }

    /// Witnet error codes table.
    enum ErrorCodes {
        // 0x00: Unknown error. Something went really bad!
        Unknown,
        // Script format errors
        /// 0x01: At least one of the source scripts is not a valid CBOR-encoded value.
        SourceScriptNotCBOR,
        /// 0x02: The CBOR value decoded from a source script is not an Array.
        SourceScriptNotArray,
        /// 0x03: The Array value decoded form a source script is not a valid Data Request.
        SourceScriptNotRADON,
        /// Unallocated
        ScriptFormat0x04,
        ScriptFormat0x05,
        ScriptFormat0x06,
        ScriptFormat0x07,
        ScriptFormat0x08,
        ScriptFormat0x09,
        ScriptFormat0x0A,
        ScriptFormat0x0B,
        ScriptFormat0x0C,
        ScriptFormat0x0D,
        ScriptFormat0x0E,
        ScriptFormat0x0F,
        // Complexity errors
        /// 0x10: The request contains too many sources.
        RequestTooManySources,
        /// 0x11: The script contains too many calls.
        ScriptTooManyCalls,
        /// Unallocated
        Complexity0x12,
        Complexity0x13,
        Complexity0x14,
        Complexity0x15,
        Complexity0x16,
        Complexity0x17,
        Complexity0x18,
        Complexity0x19,
        Complexity0x1A,
        Complexity0x1B,
        Complexity0x1C,
        Complexity0x1D,
        Complexity0x1E,
        Complexity0x1F,
        // Operator errors
        /// 0x20: The operator does not exist.
        UnsupportedOperator,
        /// Unallocated
        Operator0x21,
        Operator0x22,
        Operator0x23,
        Operator0x24,
        Operator0x25,
        Operator0x26,
        Operator0x27,
        Operator0x28,
        Operator0x29,
        Operator0x2A,
        Operator0x2B,
        Operator0x2C,
        Operator0x2D,
        Operator0x2E,
        Operator0x2F,
        // Retrieval-specific errors
        /// 0x30: At least one of the sources could not be retrieved, but returned HTTP error.
        HTTP,
        /// 0x31: Retrieval of at least one of the sources timed out.
        RetrievalTimeout,
        /// Unallocated
        Retrieval0x32,
        Retrieval0x33,
        Retrieval0x34,
        Retrieval0x35,
        Retrieval0x36,
        Retrieval0x37,
        Retrieval0x38,
        Retrieval0x39,
        Retrieval0x3A,
        Retrieval0x3B,
        Retrieval0x3C,
        Retrieval0x3D,
        Retrieval0x3E,
        Retrieval0x3F,
        // Math errors
        /// 0x40: Math operator caused an underflow.
        Underflow,
        /// 0x41: Math operator caused an overflow.
        Overflow,
        /// 0x42: Tried to divide by zero.
        DivisionByZero,
        /// Unallocated
        Math0x43,
        Math0x44,
        Math0x45,
        Math0x46,
        Math0x47,
        Math0x48,
        Math0x49,
        Math0x4A,
        Math0x4B,
        Math0x4C,
        Math0x4D,
        Math0x4E,
        Math0x4F,
        // Other errors
        /// 0x50: Received zero reveals
        NoReveals,
        /// 0x51: Insufficient consensus in tally precondition clause
        InsufficientConsensus,
        /// 0x52: Received zero commits
        InsufficientCommits,
        /// 0x53: Generic error during tally execution
        TallyExecution,
        /// Unallocated
        OtherError0x54,
        OtherError0x55,
        OtherError0x56,
        OtherError0x57,
        OtherError0x58,
        OtherError0x59,
        OtherError0x5A,
        OtherError0x5B,
        OtherError0x5C,
        OtherError0x5D,
        OtherError0x5E,
        OtherError0x5F,
        /// 0x60: Invalid reveal serialization (malformed reveals are converted to this value)
        MalformedReveal,
        /// Unallocated
        OtherError0x61,
        OtherError0x62,
        OtherError0x63,
        OtherError0x64,
        OtherError0x65,
        OtherError0x66,
        OtherError0x67,
        OtherError0x68,
        OtherError0x69,
        OtherError0x6A,
        OtherError0x6B,
        OtherError0x6C,
        OtherError0x6D,
        OtherError0x6E,
        OtherError0x6F,
        // Access errors
        /// 0x70: Tried to access a value from an index using an index that is out of bounds
        ArrayIndexOutOfBounds,
        /// 0x71: Tried to access a value from a map using a key that does not exist
        MapKeyNotFound,
        /// Unallocated
        OtherError0x72,
        OtherError0x73,
        OtherError0x74,
        OtherError0x75,
        OtherError0x76,
        OtherError0x77,
        OtherError0x78,
        OtherError0x79,
        OtherError0x7A,
        OtherError0x7B,
        OtherError0x7C,
        OtherError0x7D,
        OtherError0x7E,
        OtherError0x7F,
        OtherError0x80,
        OtherError0x81,
        OtherError0x82,
        OtherError0x83,
        OtherError0x84,
        OtherError0x85,
        OtherError0x86,
        OtherError0x87,
        OtherError0x88,
        OtherError0x89,
        OtherError0x8A,
        OtherError0x8B,
        OtherError0x8C,
        OtherError0x8D,
        OtherError0x8E,
        OtherError0x8F,
        OtherError0x90,
        OtherError0x91,
        OtherError0x92,
        OtherError0x93,
        OtherError0x94,
        OtherError0x95,
        OtherError0x96,
        OtherError0x97,
        OtherError0x98,
        OtherError0x99,
        OtherError0x9A,
        OtherError0x9B,
        OtherError0x9C,
        OtherError0x9D,
        OtherError0x9E,
        OtherError0x9F,
        OtherError0xA0,
        OtherError0xA1,
        OtherError0xA2,
        OtherError0xA3,
        OtherError0xA4,
        OtherError0xA5,
        OtherError0xA6,
        OtherError0xA7,
        OtherError0xA8,
        OtherError0xA9,
        OtherError0xAA,
        OtherError0xAB,
        OtherError0xAC,
        OtherError0xAD,
        OtherError0xAE,
        OtherError0xAF,
        OtherError0xB0,
        OtherError0xB1,
        OtherError0xB2,
        OtherError0xB3,
        OtherError0xB4,
        OtherError0xB5,
        OtherError0xB6,
        OtherError0xB7,
        OtherError0xB8,
        OtherError0xB9,
        OtherError0xBA,
        OtherError0xBB,
        OtherError0xBC,
        OtherError0xBD,
        OtherError0xBE,
        OtherError0xBF,
        OtherError0xC0,
        OtherError0xC1,
        OtherError0xC2,
        OtherError0xC3,
        OtherError0xC4,
        OtherError0xC5,
        OtherError0xC6,
        OtherError0xC7,
        OtherError0xC8,
        OtherError0xC9,
        OtherError0xCA,
        OtherError0xCB,
        OtherError0xCC,
        OtherError0xCD,
        OtherError0xCE,
        OtherError0xCF,
        OtherError0xD0,
        OtherError0xD1,
        OtherError0xD2,
        OtherError0xD3,
        OtherError0xD4,
        OtherError0xD5,
        OtherError0xD6,
        OtherError0xD7,
        OtherError0xD8,
        OtherError0xD9,
        OtherError0xDA,
        OtherError0xDB,
        OtherError0xDC,
        OtherError0xDD,
        OtherError0xDE,
        OtherError0xDF,
        // Bridge errors: errors that only belong in inter-client communication
        /// 0xE0: Requests that cannot be parsed must always get this error as their result.
        /// However, this is not a valid result in a Tally transaction, because invalid requests
        /// are never included into blocks and therefore never get a Tally in response.
        BridgeMalformedRequest,
        /// 0xE1: Witnesses exceeds 100
        BridgePoorIncentives,
        /// 0xE2: The request is rejected on the grounds that it may cause the submitter to spend or stake an
        /// amount of value that is unjustifiably high when compared with the reward they will be getting
        BridgeOversizedResult,
        /// Unallocated
        OtherError0xE3,
        OtherError0xE4,
        OtherError0xE5,
        OtherError0xE6,
        OtherError0xE7,
        OtherError0xE8,
        OtherError0xE9,
        OtherError0xEA,
        OtherError0xEB,
        OtherError0xEC,
        OtherError0xED,
        OtherError0xEE,
        OtherError0xEF,
        OtherError0xF0,
        OtherError0xF1,
        OtherError0xF2,
        OtherError0xF3,
        OtherError0xF4,
        OtherError0xF5,
        OtherError0xF6,
        OtherError0xF7,
        OtherError0xF8,
        OtherError0xF9,
        OtherError0xFA,
        OtherError0xFB,
        OtherError0xFC,
        OtherError0xFD,
        OtherError0xFE,
        // This should not exist:
        /// 0xFF: Some tally error is not intercepted but should
        UnhandledIntercept
    }
}

// File: witnet-solidity-bridge/contracts/interfaces/IWitnetRandomness.sol



pragma solidity >=0.7.0 <0.9.0;


/// @title The Witnet Randomness generator interface.
/// @author Witnet Foundation.
interface IWitnetRandomness {

    /// Thrown every time a new WitnetRandomnessRequest gets succesfully posted to the WitnetRequestBoard.
    /// @param from Address from which the randomize() function was called. 
    /// @param prevBlock Block number in which a randomness request got posted just before this one. 0 if none.
    /// @param witnetQueryId Unique query id assigned to this request by the WRB.
    /// @param witnetRequestHash SHA-256 hash of the WitnetRandomnessRequest actual bytecode just posted to the WRB.
    event Randomized(
        address indexed from,
        uint256 indexed prevBlock,
        uint256 witnetQueryId,
        bytes32 witnetRequestHash
    );

    /// Returns amount of wei required to be paid as a fee when requesting randomization with a 
    /// transaction gas price as the one given.
    function estimateRandomizeFee(uint256 _gasPrice) external view returns (uint256);

    /// Retrieves data of a randomization request that got successfully posted to the WRB within a given block.
    /// @dev Returns zero values if no randomness request was actually posted within a given block.
    /// @param _block Block number whose randomness request is being queried for.
    /// @return _from Address from which the latest randomness request was posted.
    /// @return _id Unique request identifier as provided by the WRB.
    /// @return _fee Request's total paid fee.
    /// @return _prevBlock Block number in which a randomness request got posted just before this one. 0 if none.
    /// @return _nextBlock Block number in which a randomness request got posted just after this one, 0 if none.
    function getRandomizeData(uint256 _block)
        external view returns (address _from, uint256 _id, uint256 _fee, uint256 _prevBlock, uint256 _nextBlock);

    /// Retrieves the randomness generated upon solving a request that was posted within a given block,
    /// if any, or to the _first_ request posted after that block, otherwise. Should the intended 
    /// request happen to be finalized with errors on the Witnet oracle network side, this function 
    /// will recursively try to return randomness from the next non-faulty randomization request found 
    /// in storage, if any. 
    /// @dev Fails if:
    /// @dev   i.   no `randomize()` was not called in either the given block, or afterwards.
    /// @dev   ii.  a request posted in/after given block does exist, but no result has been provided yet.
    /// @dev   iii. all requests in/after the given block were solved with errors.
    /// @param _block Block number from which the search will start.
    function getRandomnessAfter(uint256 _block) external view returns (bytes32); 

    /// Tells what is the number of the next block in which a randomization request was posted after the given one. 
    /// @param _block Block number from which the search will start.
    /// @return Number of the first block found after the given one, or `0` otherwise.
    function getRandomnessNextBlock(uint256 _block) external view returns (uint256); 

    /// Gets previous block in which a randomness request was posted before the given one.
    /// @param _block Block number from which the search will start.
    /// @return First block found before the given one, or `0` otherwise.
    function getRandomnessPrevBlock(uint256 _block) external view returns (uint256);

    /// Returns `true` only when the randomness request that got posted within given block was already
    /// reported back from the Witnet oracle, either successfully or with an error of any kind.
    function isRandomized(uint256 _block) external view returns (bool);

    /// Returns latest block in which a randomness request got sucessfully posted to the WRB.
    function latestRandomizeBlock() external view returns (uint256);

    /// Generates a pseudo-random number uniformly distributed within the range [0 .. _range), by using 
    /// the given `_nonce` value and the randomness returned by `getRandomnessAfter(_block)`. 
    /// @dev Fails under same conditions as `getRandomnessAfter(uint256)` may do.
    /// @param _range Range within which the uniformly-distributed random number will be generated.
    /// @param _nonce Nonce value enabling multiple random numbers from the same randomness value.
    /// @param _block Block number from which the search will start.
    function random(uint32 _range, uint256 _nonce, uint256 _block) external view returns (uint32);

    /// Generates a pseudo-random number uniformly distributed within the range [0 .. _range), by using 
    /// the given `_nonce` value and the given `_seed` as a source of entropy.
    /// @param _range Range within which the uniformly-distributed random number will be generated.
    /// @param _nonce Nonce value enabling multiple random numbers from the same randomness value.
    /// @param _seed Seed value used as entropy source.
    function random(uint32 _range, uint256 _nonce, bytes32 _seed) external pure returns (uint32);

    /// Requests the Witnet oracle to generate an EVM-agnostic and trustless source of randomness. 
    /// Only one randomness request per block will be actually posted to the WRB. Should there 
    /// already be a posted request within current block, it will try to upgrade Witnet fee of current's 
    /// block randomness request according to current gas price. In both cases, all unused funds shall 
    /// be transfered back to the tx sender.
    /// @return _usedFunds Amount of funds actually used from those provided by the tx sender.
    function randomize() external payable returns (uint256 _usedFunds);

    /// Increases Witnet fee related to a pending-to-be-solved randomness request, as much as it
    /// may be required in proportion to how much bigger the current tx gas price is with respect the 
    /// highest gas price that was paid in either previous fee upgrades, or when the given randomness 
    /// request was posted. All unused funds shall be transferred back to the tx sender.
    /// @return _usedFunds Amount of dunds actually used from those provided by the tx sender.
    function upgradeRandomizeFee(uint256 _block) external payable returns (uint256 _usedFunds);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: Mysterybox.sol


pragma solidity >=0.6.0 <0.9.0;

///@title Witnet Randomness interface.
///@author Witnet
///@notice used to generate randomness.



///@title OpenZeppelin ERC721URIStorage Smart Contract.
///@author OpenZeppelin
///@notice used to set the Metadata of Mystery box NFTs.




///@title OpenZeppelin Counters Smart Contract.
///@author OpenZeppelin
///@notice  used for Token IDs of the Mystery box NFTs.




///@title THNDR Mysery Box NFT
///@author Brian Pistar
///@notice A Dapp for minting Mystery box NFTs, that can be claimed for IRL Merchandise pieces.


  interface IThndrNFT {
            function balanceOf(address) external view returns (uint256);
    }

contract MysteryBox is ERC721, ERC721URIStorage{

    IThndrNFT thndrNFT;
    bool public paused;

    /// @dev 4 strings, each of them leading to the Metadata of each box. When a user mints the box,
    /// based on the witnet randomness, one of these is assigned to the minted NFT.
    string  commonBoxUri = "ipfs://QmZAaXsyeeEYwmwf3zwHuK5j6KvAXsJK1GmU7YEXtoMaif/0.json";
    string  rareBoxUri = "ipfs://QmZAaXsyeeEYwmwf3zwHuK5j6KvAXsJK1GmU7YEXtoMaif/1.json";
    string epicBoxUri = "ipfs://QmZAaXsyeeEYwmwf3zwHuK5j6KvAXsJK1GmU7YEXtoMaif/2.json";
    string legendaryBoxUri = "ipfs://QmZAaXsyeeEYwmwf3zwHuK5j6KvAXsJK1GmU7YEXtoMaif/3.json";

    /// @dev the address of the $THNDR ERC-20 token, which will be used as payment for minting the Boxes.
    IERC20 public thndrAddress;
    /// @dev the prize for the box NFT, in $THNDR.
    uint256 public boxPrice = 4200 * 10 ** 18;


///@dev Using counters for Token IDs for the Mystery box NFTs.
 using Counters for Counters.Counter; 
 Counters.Counter private _tokenIds;

    /// @dev integer for storage of the random number generated.
    /// @dev witnet = randomness oracle made by witnet, used to request verifiable randomness for the mystery boxes.
    IWitnetRandomness immutable public witnet;
    

    /// @notice A Struct to keep track of each user wallet,
    /// of blocknumber at which the user requested randomness,
    /// and whether or not they can request the Mystery box NFT.
    struct User {
        address userWallet;
        uint blockNumber;
        bool canRequestBox;
        uint32 userRandomness;
    }
    /// Mapping used to manage multiple users using the dapp.
    mapping (address => User) public Users;
    /// address used to manage functions that should only be accessible to the contract deployer
    address private owner;
    constructor (IWitnetRandomness _witnetRandomness, address _thndrAddress, address _Thndrnftaddress) ERC721("Thunder Mystery box", "MYSTERY") {
        owner = msg.sender;
        assert(address(_witnetRandomness) != address(0));
        witnet = _witnetRandomness;
        thndrAddress = IERC20(_thndrAddress);
        thndrNFT = IThndrNFT(_Thndrnftaddress);

    }
    
    receive () external payable {}






    ///@notice Function for minting the MysteryBox NFT. 
    ///@dev Users[msg.sender].canRequestBox makes sure the user requested a random number before trying to mint.
    ///@dev (witnet.isRandomized(Users[msg.sender].blockNumber makes sure the Randomness has been fetched by witnet prior to minting.
    ///@dev randomness will be a number between 0-3, based on the Number, different Metadata is assigned to the NFT.
    ///@dev canRequestBox is set to false at the end, to make usre user cannot claim two boxes from the same randomness result.

    function mintMysteryBox(uint amount) external {
        require(amount < 11, "10 Boxes per txn max dear.");
         require(paused == false, "Contract is paused");
         require(thndrNFT.balanceOf(msg.sender) > 0, "You dont own the THNDR NFT, go buy one on Crosea!");
         require(Users[msg.sender].canRequestBox == true);
        require(witnet.isRandomized(Users[msg.sender].blockNumber) == true, "Wait for a couple minutes my dear.");
        uint thndrAmount = boxPrice*amount;
        thndrAddress.transferFrom(msg.sender, address(this), thndrAmount);
        Users[msg.sender].userRandomness = witnet.random(420000, 0, Users[msg.sender].blockNumber);
        Users[msg.sender].canRequestBox = false;
        for (uint i = 0; i<amount; i++) {
           uint randomNumber =
           uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, i, msg.sender, Users[msg.sender].userRandomness))) % 100;
        

        if (randomNumber == 0 || randomNumber == 1 || randomNumber == 2 || randomNumber == 3 || randomNumber == 4 || randomNumber == 5 || randomNumber == 6 || randomNumber == 7 || randomNumber == 8 || randomNumber == 9 || randomNumber == 10 || randomNumber == 11 || randomNumber == 12 || randomNumber == 13 || randomNumber == 14 || randomNumber == 15 || randomNumber == 16 || randomNumber == 17 || randomNumber == 18 || randomNumber == 19 || randomNumber == 20 || randomNumber == 21 || randomNumber == 22 || randomNumber == 23 || randomNumber == 24 || randomNumber == 25 || randomNumber == 26 || randomNumber == 27 || randomNumber == 28 || randomNumber == 29 || randomNumber == 30 || randomNumber == 31 || randomNumber == 32 || randomNumber == 33 || randomNumber == 34 || randomNumber == 35 || randomNumber == 36 || randomNumber == 37 || randomNumber == 38 || randomNumber == 39 || randomNumber == 40 || randomNumber == 41 || randomNumber == 42 || randomNumber == 43 || randomNumber == 44 || randomNumber == 45 || randomNumber == 46 || randomNumber == 47 || randomNumber == 48 || randomNumber == 49 || randomNumber == 50 || randomNumber == 51 || randomNumber == 52 || randomNumber == 53 || randomNumber == 54 || randomNumber == 55 || randomNumber == 56 || randomNumber == 57 || randomNumber == 58 || randomNumber == 59) {
            _tokenIds.increment();
             uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, commonBoxUri);
            
        } else if (randomNumber == 60 || randomNumber == 61 || randomNumber == 62 || randomNumber == 63 || randomNumber == 64 || randomNumber == 65 || randomNumber == 66 || randomNumber == 67 || randomNumber == 68 || randomNumber == 69 || randomNumber == 70 || randomNumber == 71 || randomNumber == 72 || randomNumber == 73 || randomNumber == 74 || randomNumber == 75 || randomNumber == 76 || randomNumber == 77 || randomNumber == 78 || randomNumber == 79 || randomNumber == 80 || randomNumber == 81 || randomNumber == 82 || randomNumber == 83 || randomNumber == 84) {
            _tokenIds.increment();
             uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, rareBoxUri);
          
        }
        else if (randomNumber == 85 || randomNumber == 86 || randomNumber == 87 || randomNumber == 88 || randomNumber == 89 || randomNumber == 90 || randomNumber == 91 || randomNumber == 92 || randomNumber == 93 || randomNumber == 94 || randomNumber == 95 || randomNumber == 96) {
            _tokenIds.increment();
             uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
            _setTokenURI(newItemId, epicBoxUri);
            
        }
        else if (randomNumber == 97 || randomNumber == 98 || randomNumber == 99) {
            _tokenIds.increment();
             uint256 newItemId = _tokenIds.current();
            _safeMint(msg.sender, newItemId);
            _setTokenURI(newItemId, legendaryBoxUri);
           
        }
        }
    }
    


    ///@notice Function for requesting the random number, prior to minting a MysteryBox NFT.
    ///@dev The Users struct is updated with the information of current user.
    ///@dev function uses the witnet.randomize function, if the user pays too much for the randomness request, the excess funds are returned to him.

    function requestRandomNumber() external payable  {
    
        require(paused == false, "Contract is paused");
        require(thndrNFT.balanceOf(msg.sender) > 0, "You dont own the THNDR NFT, go buy one on Crosea!");
        Users[msg.sender].userWallet = msg.sender;
        Users[msg.sender].blockNumber = block.number;
        Users[msg.sender].canRequestBox = true;

        uint _usedFunds = witnet.randomize{ value: msg.value }();
        if (_usedFunds < msg.value) {
            payable(msg.sender).transfer(msg.value - _usedFunds);
        }

    }
 ///@notice Function use for checking whether the Randomization process is complete, and the user can mint the NFT.
 ///@return bool representing whether the randomness is ready. False = user needs to wait, True = user can mint the NFT.
    function isRandomized() public view returns (bool) {
        return witnet.isRandomized(Users[msg.sender].blockNumber);
    }


    modifier onlyOwner() {
    require(msg.sender == owner);
    _;
}
    /// This line has to be here in order for the _setTokenURI function to work
     function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
    /// this one has to be here as well
 function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function withdrawThndr(address _address) public onlyOwner {
        thndrAddress.transfer(_address, thndrAddress.balanceOf(address(this)));
    }


    function changeBoxPrice(uint _newPrice) public onlyOwner {
        boxPrice = _newPrice;
    }

    function setPaused(bool _paused) public onlyOwner {
        paused = _paused;
    }
   
}

Contract ABI

[{"inputs":[{"internalType":"contract IWitnetRandomness","name":"_witnetRandomness","type":"address"},{"internalType":"address","name":"_thndrAddress","type":"address"},{"internalType":"address","name":"_Thndrnftaddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":"address","name":"","type":"address"}],"name":"Users","outputs":[{"internalType":"address","name":"userWallet","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bool","name":"canRequestBox","type":"bool"},{"internalType":"uint32","name":"userRandomness","type":"uint32"}],"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":[],"name":"boxPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"changeBoxPrice","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":"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":"isRandomized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintMysteryBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestRandomNumber","outputs":[],"stateMutability":"payable","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":"bool","name":"_paused","type":"bool"}],"name":"setPaused","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thndrAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"withdrawThndr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"witnet","outputs":[{"internalType":"contract IWitnetRandomness","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526040518060600160405280603c815260200162004bc6603c91396008908051906020019062000035929190620002f0565b506040518060600160405280603c815260200162004b8a603c91396009908051906020019062000067929190620002f0565b506040518060600160405280603c815260200162004c02603c9139600a908051906020019062000099929190620002f0565b506040518060600160405280603c815260200162004c3e603c9139600b9080519060200190620000cb929190620002f0565b5068e3aeb5737240a00000600d55348015620000e657600080fd5b5060405162004c7a38038062004c7a83398181016040528101906200010c9190620003ce565b6040518060400160405280601381526020017f5468756e646572204d79737465727920626f78000000000000000000000000008152506040518060400160405280600781526020017f4d59535445525900000000000000000000000000000000000000000000000000815250816000908051906020019062000190929190620002f0565b508060019080519060200190620001a9929190620002f0565b50505033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200022e576200022d620004a8565b5b8273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200053f565b828054620002fe9062000472565b90600052602060002090601f0160209004810192826200032257600085556200036e565b82601f106200033d57805160ff19168380011785556200036e565b828001600101855582156200036e579182015b828111156200036d57825182559160200191906001019062000350565b5b5090506200037d919062000381565b5090565b5b808211156200039c57600081600090555060010162000382565b5090565b600081519050620003b1816200050b565b92915050565b600081519050620003c88162000525565b92915050565b600080600060608486031215620003ea57620003e962000506565b5b6000620003fa86828701620003b7565b93505060206200040d86828701620003a0565b92505060406200042086828701620003a0565b9150509250925092565b6000620004378262000452565b9050919050565b60006200044b826200042a565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200048b57607f821691505b60208210811415620004a257620004a1620004d7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b62000516816200042a565b81146200052257600080fd5b50565b62000530816200043e565b81146200053c57600080fd5b50565b60805160601c6146106200057a600039600081816109a201528181610a8d01528181610e9d01528181611188015261137901526146106000f3fe60806040526004361061014f5760003560e01c806370a08231116100b6578063a64828581161006f578063a648285814610491578063adaa365e146104bc578063b88d4fde146104e5578063c87b56dd1461050e578063ce967d811461054b578063e985e9c51461057457610156565b806370a082311461038d5780638678a7b2146103ca578063896b4d40146103d457806395d89b41146103fd57806399b956a014610428578063a22cb4651461046857610156565b806323b872dd1161010857806323b872dd1461027d57806342842e0e146102a657806346d1d21a146102cf5780635c975abb146102fa5780636352211e1461032557806363a344691461036257610156565b806301ffc9a71461015b5780630331eb051461019857806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806316c38b3c1461025457610156565b3661015657005b600080fd5b34801561016757600080fd5b50610182600480360381019061017d919061336f565b6105b1565b60405161018f919061396f565b60405180910390f35b3480156101a457600080fd5b506101ad610693565b6040516101ba919061398a565b60405180910390f35b3480156101cf57600080fd5b506101d86106b9565b6040516101e591906139f7565b60405180910390f35b3480156101fa57600080fd5b50610215600480360381019061021091906133c9565b61074b565b6040516102229190613863565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d91906132d5565b610791565b005b34801561026057600080fd5b5061027b60048036038101906102769190613315565b6108a9565b005b34801561028957600080fd5b506102a4600480360381019061029f91906131bf565b610920565b005b3480156102b257600080fd5b506102cd60048036038101906102c891906131bf565b610980565b005b3480156102db57600080fd5b506102e46109a0565b6040516102f191906139a5565b60405180910390f35b34801561030657600080fd5b5061030f6109c4565b60405161031c919061396f565b60405180910390f35b34801561033157600080fd5b5061034c600480360381019061034791906133c9565b6109d7565b6040516103599190613863565b60405180910390f35b34801561036e57600080fd5b50610377610a89565b604051610384919061396f565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190613152565b610b7b565b6040516103c19190613c19565b60405180910390f35b6103d2610c33565b005b3480156103e057600080fd5b506103fb60048036038101906103f691906133c9565b610f9c565b005b34801561040957600080fd5b50610412611d10565b60405161041f91906139f7565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190613152565b611da2565b60405161045f949392919061392a565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190613295565b611e0f565b005b34801561049d57600080fd5b506104a6611e25565b6040516104b39190613c19565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de91906133c9565b611e2b565b005b3480156104f157600080fd5b5061050c60048036038101906105079190613212565b611e8f565b005b34801561051a57600080fd5b50610535600480360381019061053091906133c9565b611ef1565b60405161054291906139f7565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613152565b611f03565b005b34801561058057600080fd5b5061059b6004803603810190610596919061317f565b6120ba565b6040516105a8919061396f565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061068c575061068b8261214e565b5b9050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600080546106c890613f14565b80601f01602080910402602001604051908101604052809291908181526020018280546106f490613f14565b80156107415780601f1061071657610100808354040283529160200191610741565b820191906000526020600020905b81548152906001019060200180831161072457829003601f168201915b5050505050905090565b6000610756826121b8565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061079c826109d7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561080d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080490613b99565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082c612203565b73ffffffffffffffffffffffffffffffffffffffff16148061085b575061085a81610855612203565b6120ba565b5b61089a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089190613b19565b60405180910390fd5b6108a4838361220b565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461090357600080fd5b80600760146101000a81548160ff02191690831515021790555050565b61093161092b612203565b826122c4565b610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790613bd9565b60405180910390fd5b61097b838383612359565b505050565b61099b83838360405180602001604052806000815250611e8f565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600760149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790613b79565b60405180910390fd5b80915050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639bc86fec600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518263ffffffff1660e01b8152600401610b269190613c19565b60206040518083038186803b158015610b3e57600080fd5b505afa158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190613342565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390613ad9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60001515600760149054906101000a900460ff16151514610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090613bb9565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610ce69190613863565b60206040518083038186803b158015610cfe57600080fd5b505afa158015610d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3691906133f6565b11610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90613b59565b60405180910390fd5b33600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555043600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff02191690831515021790555060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663699b328a346040518263ffffffff1660e01b81526004016020604051808303818588803b158015610f0357600080fd5b505af1158015610f17573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610f3c91906133f6565b905034811015610f99573373ffffffffffffffffffffffffffffffffffffffff166108fc8234610f6c9190613dae565b9081150290604051600060405180830381858888f19350505050158015610f97573d6000803e3d6000fd5b505b50565b600b8110610fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd690613a79565b60405180910390fd5b60001515600760149054906101000a900460ff16151514611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102c90613bb9565b60405180910390fd5b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016110929190613863565b60206040518083038186803b1580156110aa57600080fd5b505afa1580156110be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e291906133f6565b11611122576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111990613b59565b60405180910390fd5b60011515600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900460ff1615151461118257600080fd5b600115157f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639bc86fec600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518263ffffffff1660e01b81526004016112219190613c19565b60206040518083038186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112719190613342565b1515146112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa90613bf9565b60405180910390fd5b600081600d546112c39190613d54565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016113249392919061387e565b602060405180830381600087803b15801561133e57600080fd5b505af1158015611352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113769190613342565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166324cbbfc1620668a06000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518463ffffffff1660e01b815260040161141a939291906139c0565b60206040518083038186803b15801561143257600080fd5b505afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a9190613423565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160016101000a81548163ffffffff021916908363ffffffff1602179055506000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548160ff02191690831515021790555060005b82811015611d0b576000606444428433600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160019054906101000a900463ffffffff1660405160200161159f959493929190613804565b6040516020818303038152906040528051906020012060001c6115c29190614000565b905060008114806115d35750600181145b806115de5750600281145b806115e95750600381145b806115f45750600481145b806115ff5750600581145b8061160a5750600681145b806116155750600781145b806116205750600881145b8061162b5750600981145b806116365750600a81145b806116415750600b81145b8061164c5750600c81145b806116575750600d81145b806116625750600e81145b8061166d5750600f81145b806116785750601081145b806116835750601181145b8061168e5750601281145b806116995750601381145b806116a45750601481145b806116af5750601581145b806116ba5750601681145b806116c55750601781145b806116d05750601881145b806116db5750601981145b806116e65750601a81145b806116f15750601b81145b806116fc5750601c81145b806117075750601d81145b806117125750601e81145b8061171d5750601f81145b806117285750602081145b806117335750602181145b8061173e5750602281145b806117495750602381145b806117545750602481145b8061175f5750602581145b8061176a5750602681145b806117755750602781145b806117805750602881145b8061178b5750602981145b806117965750602a81145b806117a15750602b81145b806117ac5750602c81145b806117b75750602d81145b806117c25750602e81145b806117cd5750602f81145b806117d85750603081145b806117e35750603181145b806117ee5750603281145b806117f95750603381145b806118045750603481145b8061180f5750603581145b8061181a5750603681145b806118255750603781145b806118305750603881145b8061183b5750603981145b806118465750603a81145b806118515750603b81145b1561191257611860600e6125c0565b600061186c600e6125d6565b905061187833826125e4565b61190c816008805461188990613f14565b80601f01602080910402602001604051908101604052809291908181526020018280546118b590613f14565b80156119025780601f106118d757610100808354040283529160200191611902565b820191906000526020600020905b8154815290600101906020018083116118e557829003601f168201915b50505050506127be565b50611cf7565b603c8114806119215750603d81145b8061192c5750603e81145b806119375750603f81145b806119425750604081145b8061194d5750604181145b806119585750604281145b806119635750604381145b8061196e5750604481145b806119795750604581145b806119845750604681145b8061198f5750604781145b8061199a5750604881145b806119a55750604981145b806119b05750604a81145b806119bb5750604b81145b806119c65750604c81145b806119d15750604d81145b806119dc5750604e81145b806119e75750604f81145b806119f25750605081145b806119fd5750605181145b80611a085750605281145b80611a135750605381145b80611a1e5750605481145b15611adf57611a2d600e6125c0565b6000611a39600e6125d6565b9050611a4533826125e4565b611ad98160098054611a5690613f14565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8290613f14565b8015611acf5780601f10611aa457610100808354040283529160200191611acf565b820191906000526020600020905b815481529060010190602001808311611ab257829003601f168201915b50505050506127be565b50611cf6565b6055811480611aee5750605681145b80611af95750605781145b80611b045750605881145b80611b0f5750605981145b80611b1a5750605a81145b80611b255750605b81145b80611b305750605c81145b80611b3b5750605d81145b80611b465750605e81145b80611b515750605f81145b80611b5c5750606081145b15611c1d57611b6b600e6125c0565b6000611b77600e6125d6565b9050611b8333826125e4565b611c1781600a8054611b9490613f14565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc090613f14565b8015611c0d5780601f10611be257610100808354040283529160200191611c0d565b820191906000526020600020905b815481529060010190602001808311611bf057829003601f168201915b50505050506127be565b50611cf5565b6061811480611c2c5750606281145b80611c375750606381145b15611cf457611c46600e6125c0565b6000611c52600e6125d6565b9050611c5e3382612832565b611cf281600b8054611c6f90613f14565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9b90613f14565b8015611ce85780601f10611cbd57610100808354040283529160200191611ce8565b820191906000526020600020905b815481529060010190602001808311611ccb57829003601f168201915b50505050506127be565b505b5b5b5b508080611d0390613f77565b915050611528565b505050565b606060018054611d1f90613f14565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4b90613f14565b8015611d985780601f10611d6d57610100808354040283529160200191611d98565b820191906000526020600020905b815481529060010190602001808311611d7b57829003601f168201915b5050505050905090565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900460ff16908060020160019054906101000a900463ffffffff16905084565b611e21611e1a612203565b8383612850565b5050565b600d5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e8557600080fd5b80600d8190555050565b611ea0611e9a612203565b836122c4565b611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690613bd9565b60405180910390fd5b611eeb848484846129bd565b50505050565b6060611efc82612a19565b9050919050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f5d57600080fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ff79190613863565b60206040518083038186803b15801561200f57600080fd5b505afa158015612023573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204791906133f6565b6040518363ffffffff1660e01b8152600401612064929190613901565b602060405180830381600087803b15801561207e57600080fd5b505af1158015612092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b69190613342565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121c181612b2c565b612200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f790613b79565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661227e836109d7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806122d0836109d7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612312575061231181856120ba565b5b8061235057508373ffffffffffffffffffffffffffffffffffffffff166123388461074b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612379826109d7565b73ffffffffffffffffffffffffffffffffffffffff16146123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690613a39565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690613a99565b60405180910390fd5b61244a838383612b98565b61245560008261220b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a59190613dae565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124fc9190613ccd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bb838383612b9d565b505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612654576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264b90613b39565b60405180910390fd5b61265d81612b2c565b1561269d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269490613a59565b60405180910390fd5b6126a960008383612b98565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126f99190613ccd565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127ba60008383612b9d565b5050565b6127c782612b2c565b612806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fd90613af9565b60405180910390fd5b8060066000848152602001908152602001600020908051906020019061282d929190612f97565b505050565b61284c828260405180602001604052806000815250612ba2565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b690613ab9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129b0919061396f565b60405180910390a3505050565b6129c8848484612359565b6129d484848484612bfd565b612a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0a90613a19565b60405180910390fd5b50505050565b6060612a24826121b8565b6000600660008481526020019081526020016000208054612a4490613f14565b80601f0160208091040260200160405190810160405280929190818152602001828054612a7090613f14565b8015612abd5780601f10612a9257610100808354040283529160200191612abd565b820191906000526020600020905b815481529060010190602001808311612aa057829003601f168201915b505050505090506000612ace612d94565b9050600081511415612ae4578192505050612b27565b600082511115612b19578082604051602001612b019291906137e0565b60405160208183030381529060405292505050612b27565b612b2284612dab565b925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b612bac83836125e4565b612bb96000848484612bfd565b612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90613a19565b60405180910390fd5b505050565b6000612c1e8473ffffffffffffffffffffffffffffffffffffffff16612e13565b15612d87578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c47612203565b8786866040518563ffffffff1660e01b8152600401612c6994939291906138b5565b602060405180830381600087803b158015612c8357600080fd5b505af1925050508015612cb457506040513d601f19601f82011682018060405250810190612cb1919061339c565b60015b612d37573d8060008114612ce4576040519150601f19603f3d011682016040523d82523d6000602084013e612ce9565b606091505b50600081511415612d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2690613a19565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d8c565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060612db6826121b8565b6000612dc0612d94565b90506000815111612de05760405180602001604052806000815250612e0b565b80612dea84612e36565b604051602001612dfb9291906137e0565b6040516020818303038152906040525b915050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606000821415612e7e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f92565b600082905060005b60008214612eb0578080612e9990613f77565b915050600a82612ea99190613d23565b9150612e86565b60008167ffffffffffffffff811115612ecc57612ecb6140ed565b5b6040519080825280601f01601f191660200182016040528015612efe5781602001600182028036833780820191505090505b5090505b60008514612f8b57600182612f179190613dae565b9150600a85612f269190614000565b6030612f329190613ccd565b60f81b818381518110612f4857612f476140be565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f849190613d23565b9450612f02565b8093505050505b919050565b828054612fa390613f14565b90600052602060002090601f016020900481019282612fc5576000855561300c565b82601f10612fde57805160ff191683800117855561300c565b8280016001018555821561300c579182015b8281111561300b578251825591602001919060010190612ff0565b5b509050613019919061301d565b5090565b5b8082111561303657600081600090555060010161301e565b5090565b600061304d61304884613c59565b613c34565b90508281526020810184848401111561306957613068614121565b5b613074848285613ed2565b509392505050565b60008135905061308b81614567565b92915050565b6000813590506130a08161457e565b92915050565b6000815190506130b58161457e565b92915050565b6000813590506130ca81614595565b92915050565b6000815190506130df81614595565b92915050565b600082601f8301126130fa576130f961411c565b5b813561310a84826020860161303a565b91505092915050565b600081359050613122816145ac565b92915050565b600081519050613137816145ac565b92915050565b60008151905061314c816145c3565b92915050565b6000602082840312156131685761316761412b565b5b60006131768482850161307c565b91505092915050565b600080604083850312156131965761319561412b565b5b60006131a48582860161307c565b92505060206131b58582860161307c565b9150509250929050565b6000806000606084860312156131d8576131d761412b565b5b60006131e68682870161307c565b93505060206131f78682870161307c565b925050604061320886828701613113565b9150509250925092565b6000806000806080858703121561322c5761322b61412b565b5b600061323a8782880161307c565b945050602061324b8782880161307c565b935050604061325c87828801613113565b925050606085013567ffffffffffffffff81111561327d5761327c614126565b5b613289878288016130e5565b91505092959194509250565b600080604083850312156132ac576132ab61412b565b5b60006132ba8582860161307c565b92505060206132cb85828601613091565b9150509250929050565b600080604083850312156132ec576132eb61412b565b5b60006132fa8582860161307c565b925050602061330b85828601613113565b9150509250929050565b60006020828403121561332b5761332a61412b565b5b600061333984828501613091565b91505092915050565b6000602082840312156133585761335761412b565b5b6000613366848285016130a6565b91505092915050565b6000602082840312156133855761338461412b565b5b6000613393848285016130bb565b91505092915050565b6000602082840312156133b2576133b161412b565b5b60006133c0848285016130d0565b91505092915050565b6000602082840312156133df576133de61412b565b5b60006133ed84828501613113565b91505092915050565b60006020828403121561340c5761340b61412b565b5b600061341a84828501613128565b91505092915050565b6000602082840312156134395761343861412b565b5b60006134478482850161313d565b91505092915050565b61345981613de2565b82525050565b61347061346b82613de2565b613fc0565b82525050565b61347f81613df4565b82525050565b600061349082613c8a565b61349a8185613ca0565b93506134aa818560208601613ee1565b6134b381614130565b840191505092915050565b6134c781613e66565b82525050565b6134d681613e78565b82525050565b6134e581613e8a565b82525050565b6134f481613e9c565b82525050565b600061350582613c95565b61350f8185613cb1565b935061351f818560208601613ee1565b61352881614130565b840191505092915050565b600061353e82613c95565b6135488185613cc2565b9350613558818560208601613ee1565b80840191505092915050565b6000613571603283613cb1565b915061357c8261415b565b604082019050919050565b6000613594602583613cb1565b915061359f826141aa565b604082019050919050565b60006135b7601c83613cb1565b91506135c2826141f9565b602082019050919050565b60006135da601a83613cb1565b91506135e582614222565b602082019050919050565b60006135fd602483613cb1565b91506136088261424b565b604082019050919050565b6000613620601983613cb1565b915061362b8261429a565b602082019050919050565b6000613643602983613cb1565b915061364e826142c3565b604082019050919050565b6000613666602e83613cb1565b915061367182614312565b604082019050919050565b6000613689603e83613cb1565b915061369482614361565b604082019050919050565b60006136ac602083613cb1565b91506136b7826143b0565b602082019050919050565b60006136cf603183613cb1565b91506136da826143d9565b604082019050919050565b60006136f2601883613cb1565b91506136fd82614428565b602082019050919050565b6000613715602183613cb1565b915061372082614451565b604082019050919050565b6000613738601283613cb1565b9150613743826144a0565b602082019050919050565b600061375b602e83613cb1565b9150613766826144c9565b604082019050919050565b600061377e602283613cb1565b915061378982614518565b604082019050919050565b61379d81613e4c565b82525050565b6137b46137af82613e4c565b613fe4565b82525050565b6137c381613e56565b82525050565b6137da6137d582613e56565b613fee565b82525050565b60006137ec8285613533565b91506137f88284613533565b91508190509392505050565b600061381082886137a3565b60208201915061382082876137a3565b60208201915061383082866137a3565b602082019150613840828561345f565b60148201915061385082846137c9565b6004820191508190509695505050505050565b60006020820190506138786000830184613450565b92915050565b60006060820190506138936000830186613450565b6138a06020830185613450565b6138ad6040830184613794565b949350505050565b60006080820190506138ca6000830187613450565b6138d76020830186613450565b6138e46040830185613794565b81810360608301526138f68184613485565b905095945050505050565b60006040820190506139166000830185613450565b6139236020830184613794565b9392505050565b600060808201905061393f6000830187613450565b61394c6020830186613794565b6139596040830185613476565b61396660608301846137ba565b95945050505050565b60006020820190506139846000830184613476565b92915050565b600060208201905061399f60008301846134be565b92915050565b60006020820190506139ba60008301846134cd565b92915050565b60006060820190506139d560008301866134eb565b6139e260208301856134dc565b6139ef6040830184613794565b949350505050565b60006020820190508181036000830152613a1181846134fa565b905092915050565b60006020820190508181036000830152613a3281613564565b9050919050565b60006020820190508181036000830152613a5281613587565b9050919050565b60006020820190508181036000830152613a72816135aa565b9050919050565b60006020820190508181036000830152613a92816135cd565b9050919050565b60006020820190508181036000830152613ab2816135f0565b9050919050565b60006020820190508181036000830152613ad281613613565b9050919050565b60006020820190508181036000830152613af281613636565b9050919050565b60006020820190508181036000830152613b1281613659565b9050919050565b60006020820190508181036000830152613b328161367c565b9050919050565b60006020820190508181036000830152613b528161369f565b9050919050565b60006020820190508181036000830152613b72816136c2565b9050919050565b60006020820190508181036000830152613b92816136e5565b9050919050565b60006020820190508181036000830152613bb281613708565b9050919050565b60006020820190508181036000830152613bd28161372b565b9050919050565b60006020820190508181036000830152613bf28161374e565b9050919050565b60006020820190508181036000830152613c1281613771565b9050919050565b6000602082019050613c2e6000830184613794565b92915050565b6000613c3e613c4f565b9050613c4a8282613f46565b919050565b6000604051905090565b600067ffffffffffffffff821115613c7457613c736140ed565b5b613c7d82614130565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613cd882613e4c565b9150613ce383613e4c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d1857613d17614031565b5b828201905092915050565b6000613d2e82613e4c565b9150613d3983613e4c565b925082613d4957613d48614060565b5b828204905092915050565b6000613d5f82613e4c565b9150613d6a83613e4c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613da357613da2614031565b5b828202905092915050565b6000613db982613e4c565b9150613dc483613e4c565b925082821015613dd757613dd6614031565b5b828203905092915050565b6000613ded82613e2c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6000613e7182613eae565b9050919050565b6000613e8382613eae565b9050919050565b6000613e9582613e4c565b9050919050565b6000613ea782613e56565b9050919050565b6000613eb982613ec0565b9050919050565b6000613ecb82613e2c565b9050919050565b82818337600083830152505050565b60005b83811015613eff578082015181840152602081019050613ee4565b83811115613f0e576000848401525b50505050565b60006002820490506001821680613f2c57607f821691505b60208210811415613f4057613f3f61408f565b5b50919050565b613f4f82614130565b810181811067ffffffffffffffff82111715613f6e57613f6d6140ed565b5b80604052505050565b6000613f8282613e4c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613fb557613fb4614031565b5b600182019050919050565b6000613fcb82613fd2565b9050919050565b6000613fdd8261414e565b9050919050565b6000819050919050565b6000613ff982614141565b9050919050565b600061400b82613e4c565b915061401683613e4c565b92508261402657614025614060565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01b9050919050565b60008160601b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f313020426f786573207065722074786e206d617820646561722e000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f596f7520646f6e74206f776e207468652054484e4452204e46542c20676f206260008201527f7579206f6e65206f6e2043726f73656121000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f436f6e7472616374206973207061757365640000000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5761697420666f72206120636f75706c65206d696e75746573206d792064656160008201527f722e000000000000000000000000000000000000000000000000000000000000602082015250565b61457081613de2565b811461457b57600080fd5b50565b61458781613df4565b811461459257600080fd5b50565b61459e81613e00565b81146145a957600080fd5b50565b6145b581613e4c565b81146145c057600080fd5b50565b6145cc81613e56565b81146145d757600080fd5b5056fea2646970667358221220ccbe3e7ceab3805792c69e079e3066ded79d7325f1ce212376d7548600df164c64736f6c63430008070033697066733a2f2f516d5a416158737965654559776d7766337a7748754b356a364b764158734a4b31476d5537594558746f4d6169662f312e6a736f6e697066733a2f2f516d5a416158737965654559776d7766337a7748754b356a364b764158734a4b31476d5537594558746f4d6169662f302e6a736f6e697066733a2f2f516d5a416158737965654559776d7766337a7748754b356a364b764158734a4b31476d5537594558746f4d6169662f322e6a736f6e697066733a2f2f516d5a416158737965654559776d7766337a7748754b356a364b764158734a4b31476d5537594558746f4d6169662f332e6a736f6e0000000000000000000000003737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3000000000000000000000000e71d72436f290cd98cc29c9ef0e15c88ce57b35900000000000000000000000020aaf55ce6784e2b43a6a143f664cd9602b04848

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

0000000000000000000000003737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3000000000000000000000000e71d72436f290cd98cc29c9ef0e15c88ce57b35900000000000000000000000020aaf55ce6784e2b43a6a143f664cd9602b04848

-----Decoded View---------------
Arg [0] : _witnetRandomness (address): 0x3737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3
Arg [1] : _thndrAddress (address): 0xe71d72436f290cd98cc29c9ef0e15c88ce57b359
Arg [2] : _Thndrnftaddress (address): 0x20aaf55ce6784e2b43a6a143f664cd9602b04848

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003737be6fcff5b3b0f9dcc9a9ae1da56561d0d0d3
Arg [1] : 000000000000000000000000e71d72436f290cd98cc29c9ef0e15c88ce57b359
Arg [2] : 00000000000000000000000020aaf55ce6784e2b43a6a143f664cd9602b04848


Deployed ByteCode Sourcemap

60878:9068:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23609:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61647:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24536:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26049:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25566:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69853:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26749:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27156:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62112:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60959:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24247:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68936:127;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23978:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68120:571;;;:::i;:::-;;63723:4056;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24705:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62565:38;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;26292:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61732:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69749:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27412:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69229:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69592:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26518:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23609:305;23711:4;23763:25;23748:40;;;:11;:40;;;;:105;;;;23820:33;23805:48;;;:11;:48;;;;23748:105;:158;;;;23870:36;23894:11;23870:23;:36::i;:::-;23748:158;23728:178;;23609:305;;;:::o;61647:26::-;;;;;;;;;;;;;:::o;24536:100::-;24590:13;24623:5;24616:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24536:100;:::o;26049:171::-;26125:7;26145:23;26160:7;26145:14;:23::i;:::-;26188:15;:24;26204:7;26188:24;;;;;;;;;;;;;;;;;;;;;26181:31;;26049:171;;;:::o;25566:417::-;25647:13;25663:23;25678:7;25663:14;:23::i;:::-;25647:39;;25711:5;25705:11;;:2;:11;;;;25697:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25805:5;25789:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25814:37;25831:5;25838:12;:10;:12::i;:::-;25814:16;:37::i;:::-;25789:62;25767:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;25954:21;25963:2;25967:7;25954:8;:21::i;:::-;25636:347;25566:417;;:::o;69853:85::-;69123:5;;;;;;;;;;;69109:19;;:10;:19;;;69101:28;;;;;;69923:7:::1;69914:6;;:16;;;;;;;;;;;;;;;;;;69853:85:::0;:::o;26749:336::-;26944:41;26963:12;:10;:12::i;:::-;26977:7;26944:18;:41::i;:::-;26936:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;27049:28;27059:4;27065:2;27069:7;27049:9;:28::i;:::-;26749:336;;;:::o;27156:185::-;27294:39;27311:4;27317:2;27321:7;27294:39;;;;;;;;;;;;:16;:39::i;:::-;27156:185;;;:::o;62112:41::-;;;:::o;60959:18::-;;;;;;;;;;;;;:::o;24247:222::-;24319:7;24339:13;24355:7;:16;24363:7;24355:16;;;;;;;;;;;;;;;;;;;;;24339:32;;24407:1;24390:19;;:5;:19;;;;24382:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;24456:5;24449:12;;;24247:222;;;:::o;68936:127::-;68981:4;69005:6;:19;;;69025:5;:17;69031:10;69025:17;;;;;;;;;;;;;;;:29;;;69005:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68998:57;;68936:127;:::o;23978:207::-;24050:7;24095:1;24078:19;;:5;:19;;;;24070:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24161:9;:16;24171:5;24161:16;;;;;;;;;;;;;;;;24154:23;;23978:207;;;:::o;68120:571::-;68204:5;68194:15;;:6;;;;;;;;;;;:15;;;68186:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;68284:1;68251:8;;;;;;;;;;;:18;;;68270:10;68251:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;68243:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;68381:10;68350:5;:17;68356:10;68350:17;;;;;;;;;;;;;;;:28;;;:41;;;;;;;;;;;;;;;;;;68434:12;68402:5;:17;68408:10;68402:17;;;;;;;;;;;;;;;:29;;:44;;;;68491:4;68457:5;:17;68463:10;68457:17;;;;;;;;;;;;;;;:31;;;:38;;;;;;;;;;;;;;;;;;68508:15;68526:6;:16;;;68551:9;68526:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68508:56;;68592:9;68579:10;:22;68575:107;;;68626:10;68618:28;;:52;68659:10;68647:9;:22;;;;:::i;:::-;68618:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68575:107;68169:522;68120:571::o;63723:4056::-;63797:2;63788:6;:11;63780:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;63860:5;63850:15;;:6;;;;;;;;;;;:15;;;63842:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63941:1;63908:8;;;;;;;;;;;:18;;;63927:10;63908:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;63900:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;64051:4;64016:39;;:5;:17;64022:10;64016:17;;;;;;;;;;;;;;;:31;;;;;;;;;;;;:39;;;64008:48;;;;;;64129:4;64075:58;;:6;:19;;;64095:5;:17;64101:10;64095:17;;;;;;;;;;;;;;;:29;;;64075:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;64067:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;64183:16;64211:6;64202:8;;:15;;;;:::i;:::-;64183:34;;64228:12;;;;;;;;;;;:25;;;64254:10;64274:4;64281:11;64228:65;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64339:6;:13;;;64353:6;64361:1;64364:5;:17;64370:10;64364:17;;;;;;;;;;;;;;;:29;;;64339:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64304:5;:17;64310:10;64304:17;;;;;;;;;;;;;;;:32;;;:90;;;;;;;;;;;;;;;;;;64439:5;64405;:17;64411:10;64405:17;;;;;;;;;;;;;;;:31;;;:39;;;;;;;;;;;;;;;;;;64460:6;64455:3317;64474:6;64472:1;:8;64455:3317;;;64501:17;64653:3;64565:16;64583:15;64600:1;64603:10;64615:5;:17;64621:10;64615:17;;;;;;;;;;;;;;;:32;;;;;;;;;;;;64548:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64538:111;;;;;;64533:117;;:123;;;;:::i;:::-;64501:155;;64699:1;64683:12;:17;:38;;;;64720:1;64704:12;:17;64683:38;:59;;;;64741:1;64725:12;:17;64683:59;:80;;;;64762:1;64746:12;:17;64683:80;:101;;;;64783:1;64767:12;:17;64683:101;:122;;;;64804:1;64788:12;:17;64683:122;:143;;;;64825:1;64809:12;:17;64683:143;:164;;;;64846:1;64830:12;:17;64683:164;:185;;;;64867:1;64851:12;:17;64683:185;:206;;;;64888:1;64872:12;:17;64683:206;:228;;;;64909:2;64893:12;:18;64683:228;:250;;;;64931:2;64915:12;:18;64683:250;:272;;;;64953:2;64937:12;:18;64683:272;:294;;;;64975:2;64959:12;:18;64683:294;:316;;;;64997:2;64981:12;:18;64683:316;:338;;;;65019:2;65003:12;:18;64683:338;:360;;;;65041:2;65025:12;:18;64683:360;:382;;;;65063:2;65047:12;:18;64683:382;:404;;;;65085:2;65069:12;:18;64683:404;:426;;;;65107:2;65091:12;:18;64683:426;:448;;;;65129:2;65113:12;:18;64683:448;:470;;;;65151:2;65135:12;:18;64683:470;:492;;;;65173:2;65157:12;:18;64683:492;:514;;;;65195:2;65179:12;:18;64683:514;:536;;;;65217:2;65201:12;:18;64683:536;:558;;;;65239:2;65223:12;:18;64683:558;:580;;;;65261:2;65245:12;:18;64683:580;:602;;;;65283:2;65267:12;:18;64683:602;:624;;;;65305:2;65289:12;:18;64683:624;:646;;;;65327:2;65311:12;:18;64683:646;:668;;;;65349:2;65333:12;:18;64683:668;:690;;;;65371:2;65355:12;:18;64683:690;:712;;;;65393:2;65377:12;:18;64683:712;:734;;;;65415:2;65399:12;:18;64683:734;:756;;;;65437:2;65421:12;:18;64683:756;:778;;;;65459:2;65443:12;:18;64683:778;:800;;;;65481:2;65465:12;:18;64683:800;:822;;;;65503:2;65487:12;:18;64683:822;:844;;;;65525:2;65509:12;:18;64683:844;:866;;;;65547:2;65531:12;:18;64683:866;:888;;;;65569:2;65553:12;:18;64683:888;:910;;;;65591:2;65575:12;:18;64683:910;:932;;;;65613:2;65597:12;:18;64683:932;:954;;;;65635:2;65619:12;:18;64683:954;:976;;;;65657:2;65641:12;:18;64683:976;:998;;;;65679:2;65663:12;:18;64683:998;:1020;;;;65701:2;65685:12;:18;64683:1020;:1042;;;;65723:2;65707:12;:18;64683:1042;:1064;;;;65745:2;65729:12;:18;64683:1064;:1086;;;;65767:2;65751:12;:18;64683:1086;:1108;;;;65789:2;65773:12;:18;64683:1108;:1130;;;;65811:2;65795:12;:18;64683:1130;:1152;;;;65833:2;65817:12;:18;64683:1152;:1174;;;;65855:2;65839:12;:18;64683:1174;:1196;;;;65877:2;65861:12;:18;64683:1196;:1218;;;;65899:2;65883:12;:18;64683:1218;:1240;;;;65921:2;65905:12;:18;64683:1240;:1262;;;;65943:2;65927:12;:18;64683:1262;:1284;;;;65965:2;65949:12;:18;64683:1284;:1306;;;;65987:2;65971:12;:18;64683:1306;64679:3082;;;66006:21;:9;:19;:21::i;:::-;66043:17;66063:19;:9;:17;:19::i;:::-;66043:39;;66097:28;66103:10;66115:9;66097:5;:28::i;:::-;66140:37;66153:9;66164:12;66140:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:37::i;:::-;65991:212;64679:3082;;;66229:2;66213:12;:18;:40;;;;66251:2;66235:12;:18;66213:40;:62;;;;66273:2;66257:12;:18;66213:62;:84;;;;66295:2;66279:12;:18;66213:84;:106;;;;66317:2;66301:12;:18;66213:106;:128;;;;66339:2;66323:12;:18;66213:128;:150;;;;66361:2;66345:12;:18;66213:150;:172;;;;66383:2;66367:12;:18;66213:172;:194;;;;66405:2;66389:12;:18;66213:194;:216;;;;66427:2;66411:12;:18;66213:216;:238;;;;66449:2;66433:12;:18;66213:238;:260;;;;66471:2;66455:12;:18;66213:260;:282;;;;66493:2;66477:12;:18;66213:282;:304;;;;66515:2;66499:12;:18;66213:304;:326;;;;66537:2;66521:12;:18;66213:326;:348;;;;66559:2;66543:12;:18;66213:348;:370;;;;66581:2;66565:12;:18;66213:370;:392;;;;66603:2;66587:12;:18;66213:392;:414;;;;66625:2;66609:12;:18;66213:414;:436;;;;66647:2;66631:12;:18;66213:436;:458;;;;66669:2;66653:12;:18;66213:458;:480;;;;66691:2;66675:12;:18;66213:480;:502;;;;66713:2;66697:12;:18;66213:502;:524;;;;66735:2;66719:12;:18;66213:524;:546;;;;66757:2;66741:12;:18;66213:546;66209:1552;;;66776:21;:9;:19;:21::i;:::-;66813:17;66833:19;:9;:17;:19::i;:::-;66813:39;;66867:28;66873:10;66885:9;66867:5;:28::i;:::-;66910:35;66923:9;66934:10;66910:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:35::i;:::-;66761:208;66209:1552;;;67004:2;66988:12;:18;:40;;;;67026:2;67010:12;:18;66988:40;:62;;;;67048:2;67032:12;:18;66988:62;:84;;;;67070:2;67054:12;:18;66988:84;:106;;;;67092:2;67076:12;:18;66988:106;:128;;;;67114:2;67098:12;:18;66988:128;:150;;;;67136:2;67120:12;:18;66988:150;:172;;;;67158:2;67142:12;:18;66988:172;:194;;;;67180:2;67164:12;:18;66988:194;:216;;;;67202:2;67186:12;:18;66988:216;:238;;;;67224:2;67208:12;:18;66988:238;:260;;;;67246:2;67230:12;:18;66988:260;66984:777;;;67265:21;:9;:19;:21::i;:::-;67302:17;67322:19;:9;:17;:19::i;:::-;67302:39;;67356:28;67362:10;67374:9;67356:5;:28::i;:::-;67399:35;67412:9;67423:10;67399:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:35::i;:::-;67250:210;66984:777;;;67495:2;67479:12;:18;:40;;;;67517:2;67501:12;:18;67479:40;:62;;;;67539:2;67523:12;:18;67479:62;67475:286;;;67558:21;:9;:19;:21::i;:::-;67595:17;67615:19;:9;:17;:19::i;:::-;67595:39;;67649:32;67659:10;67671:9;67649;:32::i;:::-;67696:40;67709:9;67720:15;67696:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;:40::i;:::-;67543:218;67475:286;66984:777;66209:1552;64679:3082;64487:3285;64482:3;;;;;:::i;:::-;;;;64455:3317;;;;63769:4010;63723:4056;:::o;24705:104::-;24761:13;24794:7;24787:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24705:104;:::o;62565:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26292:155::-;26387:52;26406:12;:10;:12::i;:::-;26420:8;26430;26387:18;:52::i;:::-;26292:155;;:::o;61732:41::-;;;;:::o;69749:96::-;69123:5;;;;;;;;;;;69109:19;;:10;:19;;;69101:28;;;;;;69828:9:::1;69817:8;:20;;;;69749:96:::0;:::o;27412:323::-;27586:41;27605:12;:10;:12::i;:::-;27619:7;27586:18;:41::i;:::-;27578:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;27689:38;27703:4;27709:2;27713:7;27722:4;27689:13;:38::i;:::-;27412:323;;;;:::o;69229:196::-;69356:13;69394:23;69409:7;69394:14;:23::i;:::-;69387:30;;69229:196;;;:::o;69592:147::-;69123:5;;;;;;;;;;;69109:19;;:10;:19;;;69101:28;;;;;;69661:12:::1;;;;;;;;;;;:21;;;69683:8;69693:12;;;;;;;;;;;:22;;;69724:4;69693:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69661:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69592:147:::0;:::o;26518:164::-;26615:4;26639:18;:25;26658:5;26639:25;;;;;;;;;;;;;;;:35;26665:8;26639:35;;;;;;;;;;;;;;;;;;;;;;;;;26632:42;;26518:164;;;;:::o;16333:157::-;16418:4;16457:25;16442:40;;;:11;:40;;;;16435:47;;16333:157;;;:::o;34024:135::-;34106:16;34114:7;34106;:16::i;:::-;34098:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;34024:135;:::o;4706:98::-;4759:7;4786:10;4779:17;;4706:98;:::o;33303:174::-;33405:2;33378:15;:24;33394:7;33378:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33461:7;33457:2;33423:46;;33432:23;33447:7;33432:14;:23::i;:::-;33423:46;;;;;;;;;;;;33303:174;;:::o;29536:264::-;29629:4;29646:13;29662:23;29677:7;29662:14;:23::i;:::-;29646:39;;29715:5;29704:16;;:7;:16;;;:52;;;;29724:32;29741:5;29748:7;29724:16;:32::i;:::-;29704:52;:87;;;;29784:7;29760:31;;:20;29772:7;29760:11;:20::i;:::-;:31;;;29704:87;29696:96;;;29536:264;;;;:::o;32559:625::-;32718:4;32691:31;;:23;32706:7;32691:14;:23::i;:::-;:31;;;32683:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32797:1;32783:16;;:2;:16;;;;32775:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32853:39;32874:4;32880:2;32884:7;32853:20;:39::i;:::-;32957:29;32974:1;32978:7;32957:8;:29::i;:::-;33018:1;32999:9;:15;33009:4;32999:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33047:1;33030:9;:13;33040:2;33030:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33078:2;33059:7;:16;33067:7;33059:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33117:7;33113:2;33098:27;;33107:4;33098:27;;;;;;;;;;;;33138:38;33158:4;33164:2;33168:7;33138:19;:38::i;:::-;32559:625;;;:::o;1047:127::-;1154:1;1136:7;:14;;;:19;;;;;;;;;;;1047:127;:::o;925:114::-;990:7;1017;:14;;;1010:21;;925:114;;;:::o;31134:439::-;31228:1;31214:16;;:2;:16;;;;31206:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31287:16;31295:7;31287;:16::i;:::-;31286:17;31278:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31349:45;31378:1;31382:2;31386:7;31349:20;:45::i;:::-;31424:1;31407:9;:13;31417:2;31407:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31455:2;31436:7;:16;31444:7;31436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31500:7;31496:2;31475:33;;31492:1;31475:33;;;;;;;;;;;;31521:44;31549:1;31553:2;31557:7;31521:19;:44::i;:::-;31134:439;;:::o;38103:217::-;38203:16;38211:7;38203;:16::i;:::-;38195:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;38303:9;38281:10;:19;38292:7;38281:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;38103:217;;:::o;30142:110::-;30218:26;30228:2;30232:7;30218:26;;;;;;;;;;;;:9;:26::i;:::-;30142:110;;:::o;33620:315::-;33775:8;33766:17;;:5;:17;;;;33758:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;33862:8;33824:18;:25;33843:5;33824:25;;;;;;;;;;;;;;;:35;33850:8;33824:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33908:8;33886:41;;33901:5;33886:41;;;33918:8;33886:41;;;;;;:::i;:::-;;;;;;;;33620:315;;;:::o;28616:313::-;28772:28;28782:4;28788:2;28792:7;28772:9;:28::i;:::-;28819:47;28842:4;28848:2;28852:7;28861:4;28819:22;:47::i;:::-;28811:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28616:313;;;;:::o;37323:624::-;37396:13;37422:23;37437:7;37422:14;:23::i;:::-;37458;37484:10;:19;37495:7;37484:19;;;;;;;;;;;37458:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37514:18;37535:10;:8;:10::i;:::-;37514:31;;37643:1;37627:4;37621:18;:23;37617:72;;;37668:9;37661:16;;;;;;37617:72;37819:1;37799:9;37793:23;:27;37789:108;;;37868:4;37874:9;37851:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37837:48;;;;;;37789:108;37916:23;37931:7;37916:14;:23::i;:::-;37909:30;;;;37323:624;;;;:::o;29242:127::-;29307:4;29359:1;29331:30;;:7;:16;29339:7;29331:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29324:37;;29242:127;;;:::o;36148:126::-;;;;:::o;36659:125::-;;;;:::o;30479:319::-;30608:18;30614:2;30618:7;30608:5;:18::i;:::-;30659:53;30690:1;30694:2;30698:7;30707:4;30659:22;:53::i;:::-;30637:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;30479:319;;;:::o;34723:853::-;34877:4;34898:15;:2;:13;;;:15::i;:::-;34894:675;;;34950:2;34934:36;;;34971:12;:10;:12::i;:::-;34985:4;34991:7;35000:4;34934:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34930:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35192:1;35175:6;:13;:18;35171:328;;;35218:60;;;;;;;;;;:::i;:::-;;;;;;;;35171:328;35449:6;35443:13;35434:6;35430:2;35426:15;35419:38;34930:584;35066:41;;;35056:51;;;:6;:51;;;;35049:58;;;;;34894:675;35553:4;35546:11;;34723:853;;;;;;;:::o;25410:94::-;25461:13;25487:9;;;;;;;;;;;;;;25410:94;:::o;24880:281::-;24953:13;24979:23;24994:7;24979:14;:23::i;:::-;25015:21;25039:10;:8;:10::i;:::-;25015:34;;25091:1;25073:7;25067:21;:25;:86;;;;;;;;;;;;;;;;;25119:7;25128:18;:7;:16;:18::i;:::-;25102:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25067:86;25060:93;;;24880:281;;;:::o;6159:326::-;6219:4;6476:1;6454:7;:19;;;:23;6447:30;;6159:326;;;:::o;1954:723::-;2010:13;2240:1;2231:5;:10;2227:53;;;2258:10;;;;;;;;;;;;;;;;;;;;;2227:53;2290:12;2305:5;2290:20;;2321:14;2346:78;2361:1;2353:4;:9;2346:78;;2379:8;;;;;:::i;:::-;;;;2410:2;2402:10;;;;;:::i;:::-;;;2346:78;;;2434:19;2466:6;2456:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2434:39;;2484:154;2500:1;2491:5;:10;2484:154;;2528:1;2518:11;;;;;:::i;:::-;;;2595:2;2587:5;:10;;;;:::i;:::-;2574:2;:24;;;;:::i;:::-;2561:39;;2544:6;2551;2544:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2624:2;2615:11;;;;;:::i;:::-;;;2484:154;;;2662:6;2648:21;;;;;1954:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;761:5;792:6;786:13;777:22;;808:30;832:5;808:30;:::i;:::-;707:137;;;;:::o;850:::-;895:5;933:6;920:20;911:29;;949:32;975:5;949:32;:::i;:::-;850:137;;;;:::o;993:141::-;1049:5;1080:6;1074:13;1065:22;;1096:32;1122:5;1096:32;:::i;:::-;993:141;;;;:::o;1153:338::-;1208:5;1257:3;1250:4;1242:6;1238:17;1234:27;1224:122;;1265:79;;:::i;:::-;1224:122;1382:6;1369:20;1407:78;1481:3;1473:6;1466:4;1458:6;1454:17;1407:78;:::i;:::-;1398:87;;1214:277;1153:338;;;;:::o;1497:139::-;1543:5;1581:6;1568:20;1559:29;;1597:33;1624:5;1597:33;:::i;:::-;1497:139;;;;:::o;1642:143::-;1699:5;1730:6;1724:13;1715:22;;1746:33;1773:5;1746:33;:::i;:::-;1642:143;;;;:::o;1791:141::-;1847:5;1878:6;1872:13;1863:22;;1894:32;1920:5;1894:32;:::i;:::-;1791:141;;;;:::o;1938:329::-;1997:6;2046:2;2034:9;2025:7;2021:23;2017:32;2014:119;;;2052:79;;:::i;:::-;2014:119;2172:1;2197:53;2242:7;2233:6;2222:9;2218:22;2197:53;:::i;:::-;2187:63;;2143:117;1938:329;;;;:::o;2273:474::-;2341:6;2349;2398:2;2386:9;2377:7;2373:23;2369:32;2366:119;;;2404:79;;:::i;:::-;2366:119;2524:1;2549:53;2594:7;2585:6;2574:9;2570:22;2549:53;:::i;:::-;2539:63;;2495:117;2651:2;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2622:118;2273:474;;;;;:::o;2753:619::-;2830:6;2838;2846;2895:2;2883:9;2874:7;2870:23;2866:32;2863:119;;;2901:79;;:::i;:::-;2863:119;3021:1;3046:53;3091:7;3082:6;3071:9;3067:22;3046:53;:::i;:::-;3036:63;;2992:117;3148:2;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3119:118;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2753:619;;;;;:::o;3378:943::-;3473:6;3481;3489;3497;3546:3;3534:9;3525:7;3521:23;3517:33;3514:120;;;3553:79;;:::i;:::-;3514:120;3673:1;3698:53;3743:7;3734:6;3723:9;3719:22;3698:53;:::i;:::-;3688:63;;3644:117;3800:2;3826:53;3871:7;3862:6;3851:9;3847:22;3826:53;:::i;:::-;3816:63;;3771:118;3928:2;3954:53;3999:7;3990:6;3979:9;3975:22;3954:53;:::i;:::-;3944:63;;3899:118;4084:2;4073:9;4069:18;4056:32;4115:18;4107:6;4104:30;4101:117;;;4137:79;;:::i;:::-;4101:117;4242:62;4296:7;4287:6;4276:9;4272:22;4242:62;:::i;:::-;4232:72;;4027:287;3378:943;;;;;;;:::o;4327:468::-;4392:6;4400;4449:2;4437:9;4428:7;4424:23;4420:32;4417:119;;;4455:79;;:::i;:::-;4417:119;4575:1;4600:53;4645:7;4636:6;4625:9;4621:22;4600:53;:::i;:::-;4590:63;;4546:117;4702:2;4728:50;4770:7;4761:6;4750:9;4746:22;4728:50;:::i;:::-;4718:60;;4673:115;4327:468;;;;;:::o;4801:474::-;4869:6;4877;4926:2;4914:9;4905:7;4901:23;4897:32;4894:119;;;4932:79;;:::i;:::-;4894:119;5052:1;5077:53;5122:7;5113:6;5102:9;5098:22;5077:53;:::i;:::-;5067:63;;5023:117;5179:2;5205:53;5250:7;5241:6;5230:9;5226:22;5205:53;:::i;:::-;5195:63;;5150:118;4801:474;;;;;:::o;5281:323::-;5337:6;5386:2;5374:9;5365:7;5361:23;5357:32;5354:119;;;5392:79;;:::i;:::-;5354:119;5512:1;5537:50;5579:7;5570:6;5559:9;5555:22;5537:50;:::i;:::-;5527:60;;5483:114;5281:323;;;;:::o;5610:345::-;5677:6;5726:2;5714:9;5705:7;5701:23;5697:32;5694:119;;;5732:79;;:::i;:::-;5694:119;5852:1;5877:61;5930:7;5921:6;5910:9;5906:22;5877:61;:::i;:::-;5867:71;;5823:125;5610:345;;;;:::o;5961:327::-;6019:6;6068:2;6056:9;6047:7;6043:23;6039:32;6036:119;;;6074:79;;:::i;:::-;6036:119;6194:1;6219:52;6263:7;6254:6;6243:9;6239:22;6219:52;:::i;:::-;6209:62;;6165:116;5961:327;;;;:::o;6294:349::-;6363:6;6412:2;6400:9;6391:7;6387:23;6383:32;6380:119;;;6418:79;;:::i;:::-;6380:119;6538:1;6563:63;6618:7;6609:6;6598:9;6594:22;6563:63;:::i;:::-;6553:73;;6509:127;6294:349;;;;:::o;6649:329::-;6708:6;6757:2;6745:9;6736:7;6732:23;6728:32;6725:119;;;6763:79;;:::i;:::-;6725:119;6883:1;6908:53;6953:7;6944:6;6933:9;6929:22;6908:53;:::i;:::-;6898:63;;6854:117;6649:329;;;;:::o;6984:351::-;7054:6;7103:2;7091:9;7082:7;7078:23;7074:32;7071:119;;;7109:79;;:::i;:::-;7071:119;7229:1;7254:64;7310:7;7301:6;7290:9;7286:22;7254:64;:::i;:::-;7244:74;;7200:128;6984:351;;;;:::o;7341:349::-;7410:6;7459:2;7447:9;7438:7;7434:23;7430:32;7427:119;;;7465:79;;:::i;:::-;7427:119;7585:1;7610:63;7665:7;7656:6;7645:9;7641:22;7610:63;:::i;:::-;7600:73;;7556:127;7341:349;;;;:::o;7696:118::-;7783:24;7801:5;7783:24;:::i;:::-;7778:3;7771:37;7696:118;;:::o;7820:157::-;7925:45;7945:24;7963:5;7945:24;:::i;:::-;7925:45;:::i;:::-;7920:3;7913:58;7820:157;;:::o;7983:109::-;8064:21;8079:5;8064:21;:::i;:::-;8059:3;8052:34;7983:109;;:::o;8098:360::-;8184:3;8212:38;8244:5;8212:38;:::i;:::-;8266:70;8329:6;8324:3;8266:70;:::i;:::-;8259:77;;8345:52;8390:6;8385:3;8378:4;8371:5;8367:16;8345:52;:::i;:::-;8422:29;8444:6;8422:29;:::i;:::-;8417:3;8413:39;8406:46;;8188:270;8098:360;;;;:::o;8464:161::-;8566:52;8612:5;8566:52;:::i;:::-;8561:3;8554:65;8464:161;;:::o;8631:183::-;8744:63;8801:5;8744:63;:::i;:::-;8739:3;8732:76;8631:183;;:::o;8820:147::-;8915:45;8954:5;8915:45;:::i;:::-;8910:3;8903:58;8820:147;;:::o;8973:155::-;9072:49;9115:5;9072:49;:::i;:::-;9067:3;9060:62;8973:155;;:::o;9134:364::-;9222:3;9250:39;9283:5;9250:39;:::i;:::-;9305:71;9369:6;9364:3;9305:71;:::i;:::-;9298:78;;9385:52;9430:6;9425:3;9418:4;9411:5;9407:16;9385:52;:::i;:::-;9462:29;9484:6;9462:29;:::i;:::-;9457:3;9453:39;9446:46;;9226:272;9134:364;;;;:::o;9504:377::-;9610:3;9638:39;9671:5;9638:39;:::i;:::-;9693:89;9775:6;9770:3;9693:89;:::i;:::-;9686:96;;9791:52;9836:6;9831:3;9824:4;9817:5;9813:16;9791:52;:::i;:::-;9868:6;9863:3;9859:16;9852:23;;9614:267;9504:377;;;;:::o;9887:366::-;10029:3;10050:67;10114:2;10109:3;10050:67;:::i;:::-;10043:74;;10126:93;10215:3;10126:93;:::i;:::-;10244:2;10239:3;10235:12;10228:19;;9887:366;;;:::o;10259:::-;10401:3;10422:67;10486:2;10481:3;10422:67;:::i;:::-;10415:74;;10498:93;10587:3;10498:93;:::i;:::-;10616:2;10611:3;10607:12;10600:19;;10259:366;;;:::o;10631:::-;10773:3;10794:67;10858:2;10853:3;10794:67;:::i;:::-;10787:74;;10870:93;10959:3;10870:93;:::i;:::-;10988:2;10983:3;10979:12;10972:19;;10631:366;;;:::o;11003:::-;11145:3;11166:67;11230:2;11225:3;11166:67;:::i;:::-;11159:74;;11242:93;11331:3;11242:93;:::i;:::-;11360:2;11355:3;11351:12;11344:19;;11003:366;;;:::o;11375:::-;11517:3;11538:67;11602:2;11597:3;11538:67;:::i;:::-;11531:74;;11614:93;11703:3;11614:93;:::i;:::-;11732:2;11727:3;11723:12;11716:19;;11375:366;;;:::o;11747:::-;11889:3;11910:67;11974:2;11969:3;11910:67;:::i;:::-;11903:74;;11986:93;12075:3;11986:93;:::i;:::-;12104:2;12099:3;12095:12;12088:19;;11747:366;;;:::o;12119:::-;12261:3;12282:67;12346:2;12341:3;12282:67;:::i;:::-;12275:74;;12358:93;12447:3;12358:93;:::i;:::-;12476:2;12471:3;12467:12;12460:19;;12119:366;;;:::o;12491:::-;12633:3;12654:67;12718:2;12713:3;12654:67;:::i;:::-;12647:74;;12730:93;12819:3;12730:93;:::i;:::-;12848:2;12843:3;12839:12;12832:19;;12491:366;;;:::o;12863:::-;13005:3;13026:67;13090:2;13085:3;13026:67;:::i;:::-;13019:74;;13102:93;13191:3;13102:93;:::i;:::-;13220:2;13215:3;13211:12;13204:19;;12863:366;;;:::o;13235:::-;13377:3;13398:67;13462:2;13457:3;13398:67;:::i;:::-;13391:74;;13474:93;13563:3;13474:93;:::i;:::-;13592:2;13587:3;13583:12;13576:19;;13235:366;;;:::o;13607:::-;13749:3;13770:67;13834:2;13829:3;13770:67;:::i;:::-;13763:74;;13846:93;13935:3;13846:93;:::i;:::-;13964:2;13959:3;13955:12;13948:19;;13607:366;;;:::o;13979:::-;14121:3;14142:67;14206:2;14201:3;14142:67;:::i;:::-;14135:74;;14218:93;14307:3;14218:93;:::i;:::-;14336:2;14331:3;14327:12;14320:19;;13979:366;;;:::o;14351:::-;14493:3;14514:67;14578:2;14573:3;14514:67;:::i;:::-;14507:74;;14590:93;14679:3;14590:93;:::i;:::-;14708:2;14703:3;14699:12;14692:19;;14351:366;;;:::o;14723:::-;14865:3;14886:67;14950:2;14945:3;14886:67;:::i;:::-;14879:74;;14962:93;15051:3;14962:93;:::i;:::-;15080:2;15075:3;15071:12;15064:19;;14723:366;;;:::o;15095:::-;15237:3;15258:67;15322:2;15317:3;15258:67;:::i;:::-;15251:74;;15334:93;15423:3;15334:93;:::i;:::-;15452:2;15447:3;15443:12;15436:19;;15095:366;;;:::o;15467:::-;15609:3;15630:67;15694:2;15689:3;15630:67;:::i;:::-;15623:74;;15706:93;15795:3;15706:93;:::i;:::-;15824:2;15819:3;15815:12;15808:19;;15467:366;;;:::o;15839:118::-;15926:24;15944:5;15926:24;:::i;:::-;15921:3;15914:37;15839:118;;:::o;15963:157::-;16068:45;16088:24;16106:5;16088:24;:::i;:::-;16068:45;:::i;:::-;16063:3;16056:58;15963:157;;:::o;16126:115::-;16211:23;16228:5;16211:23;:::i;:::-;16206:3;16199:36;16126:115;;:::o;16247:153::-;16350:43;16369:23;16386:5;16369:23;:::i;:::-;16350:43;:::i;:::-;16345:3;16338:56;16247:153;;:::o;16406:435::-;16586:3;16608:95;16699:3;16690:6;16608:95;:::i;:::-;16601:102;;16720:95;16811:3;16802:6;16720:95;:::i;:::-;16713:102;;16832:3;16825:10;;16406:435;;;;;:::o;16847:815::-;17069:3;17084:75;17155:3;17146:6;17084:75;:::i;:::-;17184:2;17179:3;17175:12;17168:19;;17197:75;17268:3;17259:6;17197:75;:::i;:::-;17297:2;17292:3;17288:12;17281:19;;17310:75;17381:3;17372:6;17310:75;:::i;:::-;17410:2;17405:3;17401:12;17394:19;;17423:75;17494:3;17485:6;17423:75;:::i;:::-;17523:2;17518:3;17514:12;17507:19;;17536:73;17605:3;17596:6;17536:73;:::i;:::-;17634:1;17629:3;17625:11;17618:18;;17653:3;17646:10;;16847:815;;;;;;;;:::o;17668:222::-;17761:4;17799:2;17788:9;17784:18;17776:26;;17812:71;17880:1;17869:9;17865:17;17856:6;17812:71;:::i;:::-;17668:222;;;;:::o;17896:442::-;18045:4;18083:2;18072:9;18068:18;18060:26;;18096:71;18164:1;18153:9;18149:17;18140:6;18096:71;:::i;:::-;18177:72;18245:2;18234:9;18230:18;18221:6;18177:72;:::i;:::-;18259;18327:2;18316:9;18312:18;18303:6;18259:72;:::i;:::-;17896:442;;;;;;:::o;18344:640::-;18539:4;18577:3;18566:9;18562:19;18554:27;;18591:71;18659:1;18648:9;18644:17;18635:6;18591:71;:::i;:::-;18672:72;18740:2;18729:9;18725:18;18716:6;18672:72;:::i;:::-;18754;18822:2;18811:9;18807:18;18798:6;18754:72;:::i;:::-;18873:9;18867:4;18863:20;18858:2;18847:9;18843:18;18836:48;18901:76;18972:4;18963:6;18901:76;:::i;:::-;18893:84;;18344:640;;;;;;;:::o;18990:332::-;19111:4;19149:2;19138:9;19134:18;19126:26;;19162:71;19230:1;19219:9;19215:17;19206:6;19162:71;:::i;:::-;19243:72;19311:2;19300:9;19296:18;19287:6;19243:72;:::i;:::-;18990:332;;;;;:::o;19328:537::-;19497:4;19535:3;19524:9;19520:19;19512:27;;19549:71;19617:1;19606:9;19602:17;19593:6;19549:71;:::i;:::-;19630:72;19698:2;19687:9;19683:18;19674:6;19630:72;:::i;:::-;19712:66;19774:2;19763:9;19759:18;19750:6;19712:66;:::i;:::-;19788:70;19854:2;19843:9;19839:18;19830:6;19788:70;:::i;:::-;19328:537;;;;;;;:::o;19871:210::-;19958:4;19996:2;19985:9;19981:18;19973:26;;20009:65;20071:1;20060:9;20056:17;20047:6;20009:65;:::i;:::-;19871:210;;;;:::o;20087:252::-;20195:4;20233:2;20222:9;20218:18;20210:26;;20246:86;20329:1;20318:9;20314:17;20305:6;20246:86;:::i;:::-;20087:252;;;;:::o;20345:274::-;20464:4;20502:2;20491:9;20487:18;20479:26;;20515:97;20609:1;20598:9;20594:17;20585:6;20515:97;:::i;:::-;20345:274;;;;:::o;20625:482::-;20794:4;20832:2;20821:9;20817:18;20809:26;;20845:83;20925:1;20914:9;20910:17;20901:6;20845:83;:::i;:::-;20938:80;21014:2;21003:9;20999:18;20990:6;20938:80;:::i;:::-;21028:72;21096:2;21085:9;21081:18;21072:6;21028:72;:::i;:::-;20625:482;;;;;;:::o;21113:313::-;21226:4;21264:2;21253:9;21249:18;21241:26;;21313:9;21307:4;21303:20;21299:1;21288:9;21284:17;21277:47;21341:78;21414:4;21405:6;21341:78;:::i;:::-;21333:86;;21113:313;;;;:::o;21432:419::-;21598:4;21636:2;21625:9;21621:18;21613:26;;21685:9;21679:4;21675:20;21671:1;21660:9;21656:17;21649:47;21713:131;21839:4;21713:131;:::i;:::-;21705:139;;21432:419;;;:::o;21857:::-;22023:4;22061:2;22050:9;22046:18;22038:26;;22110:9;22104:4;22100:20;22096:1;22085:9;22081:17;22074:47;22138:131;22264:4;22138:131;:::i;:::-;22130:139;;21857:419;;;:::o;22282:::-;22448:4;22486:2;22475:9;22471:18;22463:26;;22535:9;22529:4;22525:20;22521:1;22510:9;22506:17;22499:47;22563:131;22689:4;22563:131;:::i;:::-;22555:139;;22282:419;;;:::o;22707:::-;22873:4;22911:2;22900:9;22896:18;22888:26;;22960:9;22954:4;22950:20;22946:1;22935:9;22931:17;22924:47;22988:131;23114:4;22988:131;:::i;:::-;22980:139;;22707:419;;;:::o;23132:::-;23298:4;23336:2;23325:9;23321:18;23313:26;;23385:9;23379:4;23375:20;23371:1;23360:9;23356:17;23349:47;23413:131;23539:4;23413:131;:::i;:::-;23405:139;;23132:419;;;:::o;23557:::-;23723:4;23761:2;23750:9;23746:18;23738:26;;23810:9;23804:4;23800:20;23796:1;23785:9;23781:17;23774:47;23838:131;23964:4;23838:131;:::i;:::-;23830:139;;23557:419;;;:::o;23982:::-;24148:4;24186:2;24175:9;24171:18;24163:26;;24235:9;24229:4;24225:20;24221:1;24210:9;24206:17;24199:47;24263:131;24389:4;24263:131;:::i;:::-;24255:139;;23982:419;;;:::o;24407:::-;24573:4;24611:2;24600:9;24596:18;24588:26;;24660:9;24654:4;24650:20;24646:1;24635:9;24631:17;24624:47;24688:131;24814:4;24688:131;:::i;:::-;24680:139;;24407:419;;;:::o;24832:::-;24998:4;25036:2;25025:9;25021:18;25013:26;;25085:9;25079:4;25075:20;25071:1;25060:9;25056:17;25049:47;25113:131;25239:4;25113:131;:::i;:::-;25105:139;;24832:419;;;:::o;25257:::-;25423:4;25461:2;25450:9;25446:18;25438:26;;25510:9;25504:4;25500:20;25496:1;25485:9;25481:17;25474:47;25538:131;25664:4;25538:131;:::i;:::-;25530:139;;25257:419;;;:::o;25682:::-;25848:4;25886:2;25875:9;25871:18;25863:26;;25935:9;25929:4;25925:20;25921:1;25910:9;25906:17;25899:47;25963:131;26089:4;25963:131;:::i;:::-;25955:139;;25682:419;;;:::o;26107:::-;26273:4;26311:2;26300:9;26296:18;26288:26;;26360:9;26354:4;26350:20;26346:1;26335:9;26331:17;26324:47;26388:131;26514:4;26388:131;:::i;:::-;26380:139;;26107:419;;;:::o;26532:::-;26698:4;26736:2;26725:9;26721:18;26713:26;;26785:9;26779:4;26775:20;26771:1;26760:9;26756:17;26749:47;26813:131;26939:4;26813:131;:::i;:::-;26805:139;;26532:419;;;:::o;26957:::-;27123:4;27161:2;27150:9;27146:18;27138:26;;27210:9;27204:4;27200:20;27196:1;27185:9;27181:17;27174:47;27238:131;27364:4;27238:131;:::i;:::-;27230:139;;26957:419;;;:::o;27382:::-;27548:4;27586:2;27575:9;27571:18;27563:26;;27635:9;27629:4;27625:20;27621:1;27610:9;27606:17;27599:47;27663:131;27789:4;27663:131;:::i;:::-;27655:139;;27382:419;;;:::o;27807:::-;27973:4;28011:2;28000:9;27996:18;27988:26;;28060:9;28054:4;28050:20;28046:1;28035:9;28031:17;28024:47;28088:131;28214:4;28088:131;:::i;:::-;28080:139;;27807:419;;;:::o;28232:222::-;28325:4;28363:2;28352:9;28348:18;28340:26;;28376:71;28444:1;28433:9;28429:17;28420:6;28376:71;:::i;:::-;28232:222;;;;:::o;28460:129::-;28494:6;28521:20;;:::i;:::-;28511:30;;28550:33;28578:4;28570:6;28550:33;:::i;:::-;28460:129;;;:::o;28595:75::-;28628:6;28661:2;28655:9;28645:19;;28595:75;:::o;28676:307::-;28737:4;28827:18;28819:6;28816:30;28813:56;;;28849:18;;:::i;:::-;28813:56;28887:29;28909:6;28887:29;:::i;:::-;28879:37;;28971:4;28965;28961:15;28953:23;;28676:307;;;:::o;28989:98::-;29040:6;29074:5;29068:12;29058:22;;28989:98;;;:::o;29093:99::-;29145:6;29179:5;29173:12;29163:22;;29093:99;;;:::o;29198:168::-;29281:11;29315:6;29310:3;29303:19;29355:4;29350:3;29346:14;29331:29;;29198:168;;;;:::o;29372:169::-;29456:11;29490:6;29485:3;29478:19;29530:4;29525:3;29521:14;29506:29;;29372:169;;;;:::o;29547:148::-;29649:11;29686:3;29671:18;;29547:148;;;;:::o;29701:305::-;29741:3;29760:20;29778:1;29760:20;:::i;:::-;29755:25;;29794:20;29812:1;29794:20;:::i;:::-;29789:25;;29948:1;29880:66;29876:74;29873:1;29870:81;29867:107;;;29954:18;;:::i;:::-;29867:107;29998:1;29995;29991:9;29984:16;;29701:305;;;;:::o;30012:185::-;30052:1;30069:20;30087:1;30069:20;:::i;:::-;30064:25;;30103:20;30121:1;30103:20;:::i;:::-;30098:25;;30142:1;30132:35;;30147:18;;:::i;:::-;30132:35;30189:1;30186;30182:9;30177:14;;30012:185;;;;:::o;30203:348::-;30243:7;30266:20;30284:1;30266:20;:::i;:::-;30261:25;;30300:20;30318:1;30300:20;:::i;:::-;30295:25;;30488:1;30420:66;30416:74;30413:1;30410:81;30405:1;30398:9;30391:17;30387:105;30384:131;;;30495:18;;:::i;:::-;30384:131;30543:1;30540;30536:9;30525:20;;30203:348;;;;:::o;30557:191::-;30597:4;30617:20;30635:1;30617:20;:::i;:::-;30612:25;;30651:20;30669:1;30651:20;:::i;:::-;30646:25;;30690:1;30687;30684:8;30681:34;;;30695:18;;:::i;:::-;30681:34;30740:1;30737;30733:9;30725:17;;30557:191;;;;:::o;30754:96::-;30791:7;30820:24;30838:5;30820:24;:::i;:::-;30809:35;;30754:96;;;:::o;30856:90::-;30890:7;30933:5;30926:13;30919:21;30908:32;;30856:90;;;:::o;30952:149::-;30988:7;31028:66;31021:5;31017:78;31006:89;;30952:149;;;:::o;31107:126::-;31144:7;31184:42;31177:5;31173:54;31162:65;;31107:126;;;:::o;31239:77::-;31276:7;31305:5;31294:16;;31239:77;;;:::o;31322:93::-;31358:7;31398:10;31391:5;31387:22;31376:33;;31322:93;;;:::o;31421:141::-;31486:9;31519:37;31550:5;31519:37;:::i;:::-;31506:50;;31421:141;;;:::o;31568:152::-;31644:9;31677:37;31708:5;31677:37;:::i;:::-;31664:50;;31568:152;;;:::o;31726:121::-;31784:9;31817:24;31835:5;31817:24;:::i;:::-;31804:37;;31726:121;;;:::o;31853:124::-;31915:9;31948:23;31965:5;31948:23;:::i;:::-;31935:36;;31853:124;;;:::o;31983:126::-;32033:9;32066:37;32097:5;32066:37;:::i;:::-;32053:50;;31983:126;;;:::o;32115:113::-;32165:9;32198:24;32216:5;32198:24;:::i;:::-;32185:37;;32115:113;;;:::o;32234:154::-;32318:6;32313:3;32308;32295:30;32380:1;32371:6;32366:3;32362:16;32355:27;32234:154;;;:::o;32394:307::-;32462:1;32472:113;32486:6;32483:1;32480:13;32472:113;;;32571:1;32566:3;32562:11;32556:18;32552:1;32547:3;32543:11;32536:39;32508:2;32505:1;32501:10;32496:15;;32472:113;;;32603:6;32600:1;32597:13;32594:101;;;32683:1;32674:6;32669:3;32665:16;32658:27;32594:101;32443:258;32394:307;;;:::o;32707:320::-;32751:6;32788:1;32782:4;32778:12;32768:22;;32835:1;32829:4;32825:12;32856:18;32846:81;;32912:4;32904:6;32900:17;32890:27;;32846:81;32974:2;32966:6;32963:14;32943:18;32940:38;32937:84;;;32993:18;;:::i;:::-;32937:84;32758:269;32707:320;;;:::o;33033:281::-;33116:27;33138:4;33116:27;:::i;:::-;33108:6;33104:40;33246:6;33234:10;33231:22;33210:18;33198:10;33195:34;33192:62;33189:88;;;33257:18;;:::i;:::-;33189:88;33297:10;33293:2;33286:22;33076:238;33033:281;;:::o;33320:233::-;33359:3;33382:24;33400:5;33382:24;:::i;:::-;33373:33;;33428:66;33421:5;33418:77;33415:103;;;33498:18;;:::i;:::-;33415:103;33545:1;33538:5;33534:13;33527:20;;33320:233;;;:::o;33559:100::-;33598:7;33627:26;33647:5;33627:26;:::i;:::-;33616:37;;33559:100;;;:::o;33665:94::-;33704:7;33733:20;33747:5;33733:20;:::i;:::-;33722:31;;33665:94;;;:::o;33765:79::-;33804:7;33833:5;33822:16;;33765:79;;;:::o;33850:94::-;33888:7;33917:21;33932:5;33917:21;:::i;:::-;33906:32;;33850:94;;;:::o;33950:176::-;33982:1;33999:20;34017:1;33999:20;:::i;:::-;33994:25;;34033:20;34051:1;34033:20;:::i;:::-;34028:25;;34072:1;34062:35;;34077:18;;:::i;:::-;34062:35;34118:1;34115;34111:9;34106:14;;33950:176;;;;:::o;34132:180::-;34180:77;34177:1;34170:88;34277:4;34274:1;34267:15;34301:4;34298:1;34291:15;34318:180;34366:77;34363:1;34356:88;34463:4;34460:1;34453:15;34487:4;34484:1;34477:15;34504:180;34552:77;34549:1;34542:88;34649:4;34646:1;34639:15;34673:4;34670:1;34663:15;34690:180;34738:77;34735:1;34728:88;34835:4;34832:1;34825:15;34859:4;34856:1;34849:15;34876:180;34924:77;34921:1;34914:88;35021:4;35018:1;35011:15;35045:4;35042:1;35035:15;35062:117;35171:1;35168;35161:12;35185:117;35294:1;35291;35284:12;35308:117;35417:1;35414;35407:12;35431:117;35540:1;35537;35530:12;35554:102;35595:6;35646:2;35642:7;35637:2;35630:5;35626:14;35622:28;35612:38;;35554:102;;;:::o;35662:96::-;35696:8;35745:5;35740:3;35736:15;35715:36;;35662:96;;;:::o;35764:94::-;35797:8;35845:5;35841:2;35837:14;35816:35;;35764:94;;;:::o;35864:237::-;36004:34;36000:1;35992:6;35988:14;35981:58;36073:20;36068:2;36060:6;36056:15;36049:45;35864:237;:::o;36107:224::-;36247:34;36243:1;36235:6;36231:14;36224:58;36316:7;36311:2;36303:6;36299:15;36292:32;36107:224;:::o;36337:178::-;36477:30;36473:1;36465:6;36461:14;36454:54;36337:178;:::o;36521:176::-;36661:28;36657:1;36649:6;36645:14;36638:52;36521:176;:::o;36703:223::-;36843:34;36839:1;36831:6;36827:14;36820:58;36912:6;36907:2;36899:6;36895:15;36888:31;36703:223;:::o;36932:175::-;37072:27;37068:1;37060:6;37056:14;37049:51;36932:175;:::o;37113:228::-;37253:34;37249:1;37241:6;37237:14;37230:58;37322:11;37317:2;37309:6;37305:15;37298:36;37113:228;:::o;37347:233::-;37487:34;37483:1;37475:6;37471:14;37464:58;37556:16;37551:2;37543:6;37539:15;37532:41;37347:233;:::o;37586:249::-;37726:34;37722:1;37714:6;37710:14;37703:58;37795:32;37790:2;37782:6;37778:15;37771:57;37586:249;:::o;37841:182::-;37981:34;37977:1;37969:6;37965:14;37958:58;37841:182;:::o;38029:236::-;38169:34;38165:1;38157:6;38153:14;38146:58;38238:19;38233:2;38225:6;38221:15;38214:44;38029:236;:::o;38271:174::-;38411:26;38407:1;38399:6;38395:14;38388:50;38271:174;:::o;38451:220::-;38591:34;38587:1;38579:6;38575:14;38568:58;38660:3;38655:2;38647:6;38643:15;38636:28;38451:220;:::o;38677:168::-;38817:20;38813:1;38805:6;38801:14;38794:44;38677:168;:::o;38851:233::-;38991:34;38987:1;38979:6;38975:14;38968:58;39060:16;39055:2;39047:6;39043:15;39036:41;38851:233;:::o;39090:221::-;39230:34;39226:1;39218:6;39214:14;39207:58;39299:4;39294:2;39286:6;39282:15;39275:29;39090:221;:::o;39317:122::-;39390:24;39408:5;39390:24;:::i;:::-;39383:5;39380:35;39370:63;;39429:1;39426;39419:12;39370:63;39317:122;:::o;39445:116::-;39515:21;39530:5;39515:21;:::i;:::-;39508:5;39505:32;39495:60;;39551:1;39548;39541:12;39495:60;39445:116;:::o;39567:120::-;39639:23;39656:5;39639:23;:::i;:::-;39632:5;39629:34;39619:62;;39677:1;39674;39667:12;39619:62;39567:120;:::o;39693:122::-;39766:24;39784:5;39766:24;:::i;:::-;39759:5;39756:35;39746:63;;39805:1;39802;39795:12;39746:63;39693:122;:::o;39821:120::-;39893:23;39910:5;39893:23;:::i;:::-;39886:5;39883:34;39873:62;;39931:1;39928;39921:12;39873:62;39821:120;:::o

Swarm Source

ipfs://ccbe3e7ceab3805792c69e079e3066ded79d7325f1ce212376d7548600df164c
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.