ETH Price: $2,453.48 (-2.29%)

Token

Pyramid Of Incineration (POI)
 

Overview

Max Total Supply

5,000 POI

Holders

1,666

Market

Volume (24H)

0.0092 ETH

Min Price (24H)

$22.57 @ 0.009200 ETH

Max Price (24H)

$22.57 @ 0.009200 ETH
Balance
1 POI
0xd34334D9cc95FceBAB14A752cAc05F994b6d5ed5
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

This ancient pyramid will be a host for your questing rewards which will in turn allow you to participate in the great burn. Your pyramids final level will determine the final burn reward.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
QuirkiesDiamond

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 20 : Diamond.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

/******************************************************************************\
* Diamond Contract Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
*
* Implementation of a diamond.
* @team https://twitter.com/quirkiesnft
* @url https://quirkies.io/
* @author GrizzlyDesign 
* @url https://twitter.com/grizzlywebdev
/******************************************************************************/

/*
..........................................................................................
...............,:;;;:,....................................................................
...........,+?#@@@@@@#%,..................................................................
........,+%@@@S%%?+;#@@;..............................................:*?%%?;,............
.......+#@@%*?S#%++?@@%,.............................................;@@@SS#@@%:..........
.....,?@@S:*%%*+;?@@@+...............................................S@@:+*.:?@@%:........
.....:@@@%+**?S#@@@@@%:............,,,:::::,,,,......................%@@,+@S*,,%@@;.......
.....,?#@@@@@@@@?;,:%@@+.....,:+?%##@@@@@@@@@@##S%*+:,..............,+@@S,*@@@*.*@@;......
.......,;;;::?@@*....*@@?,:*S@@@@@#S%?*++++++++*?%#@@@#%+:,.......:?#@@@@S::%@@;.?@#,.....
..............*@@%:...;#@#@@@S?+:,,................,:+?S@@#%;,..:?@@#*+*#@@?::*?;;@@:.....
...............:%@@+,:*@@#?;,...........................,;?#@#??@@#*,...:@@@@S***#@#,.....
.................;#@#@@%;,.................................,;S@@#+,....;%@@%%#@@@@%:......
................,*@@@?:.....................................:?S+,...,+S@@%;...,::,........
...............;#@@?,......................................*%;....,*#@@?:.................
.............,?@@S:........................................,....:?#@@%,...................
............,S@@?,............................................:%%;:#@#:...................
...........,#@@*..............................................::...:@@S,..................
..........,S@@?.....................................................*@@+..................
..........*@@S,.....................................................,@@#,.................
.........,#@@;......,*%+.............................................S@@:.................
.........;@@#,......,@@@+:*SS+.............::,...,:,.................?@@+.................
.........*@@?........*@@@@@@S+............:@@#;:?@@%.................?@@*.................
.........*@@*.....,+%@@@@@*:...............+#@@@@@%:.................S@@;.................
.........;@@S;...,#@@#%#@@?................,%@@@@*..................:@@@,.................
.........?@@+,....;+:,.:#@#,.....,:,.....,*#@@S@@@*,................%@@?..................
........;@@?............,:,....;S@@#:....:#@S;.;S@S,...............+@@#,..................
........:@@S,..:S%+:..........;@@@@@?.....,,.....,,............,*,;@@@;...................
.........?@@#%?#@@@@%:........;@@@@@*...........................*#@@@;....................
..........;S#@@#%;:#@@?;.......::,::,...............,,,,,,.......%@@;.....................
............,,,,..*@@%+,.....................,..,;?S@@@@@#?;.....?@#,.....................
.................;@@*.......;,..............,?%*#@@#%??S@@?:....+@@?......................
.................?@@,......%S,................;@@#;,....*@@@%?%#@@%,......................
.................?@@+.....+@,.......*+.........%@@,......,+%#@@#%;........................
.................:#@@*,...+#........#?........,#@@,.........,,,,..........................
..................,?#@@S%%#@?,.....,#%.......:S@@*........................................
....................,;*%SSS@@@%***%@@@S+:::+%@@#+.........................................
...........................:*S#@@@#%*S@@@@@@@%+,..........................................
..............................,,,,....,:;;;:,.............................................
..........................................................................................
*/

import {LibDiamond} from "./libraries/LibDiamond.sol";
import {IDiamondCut} from "./interfaces/IDiamondCut.sol";
import {IDiamondLoupe} from "./interfaces/IDiamondLoupe.sol";
import {IERC173} from "./interfaces/IERC173.sol";
import "@flair-sdk/contracts/src/access/ownable/OwnableStorage.sol";
import "@flair-sdk/contracts/src/token/common/metadata/MetadataStorage.sol";
import "@flair-sdk/contracts/src/token/common/metadata/TokenMetadataStorage.sol";
import "./libraries/PyramidStorage.sol";
import "@flair-sdk/contracts/src/finance/royalty/RoyaltyEnforcementStorage.sol";
import "@flair-sdk/contracts/src/token/ERC721/extensions/supply/ERC721SupplyStorage.sol";
import "@flair-sdk/contracts/src/finance/royalty/RoyaltyStorage.sol";
import "@flair-sdk/contracts/src/introspection/ERC165Storage.sol";

contract QuirkiesDiamond {
    using OwnableStorage for OwnableStorage.Layout;
    using MetadataStorage for MetadataStorage.Layout;
    using PyramidStorage for PyramidStorage.Layout;
    using TokenMetadataStorage for TokenMetadataStorage.Layout;
    using RoyaltyEnforcementStorage for RoyaltyEnforcementStorage.Layout;
    using RoyaltyStorage for RoyaltyStorage.Layout;
    using ERC721SupplyStorage for ERC721SupplyStorage.Layout;
    using ERC165Storage for ERC165Storage.Layout;

    constructor(
        address _contractOwner,
        address _diamondCutFacet,
        string memory _name,
        string memory _symbol,
        string memory _contractURI,
        string memory _baseURI,
        string memory _uriSuffix,
        uint256 _maxSupply,
        address _royaltyRecipient,
        uint16 _bps
    ) payable {
        // set owner
        OwnableStorage.layout().setOwner(_contractOwner);

        // set metadata
        MetadataStorage.layout().name = _name;
        MetadataStorage.layout().symbol = _symbol;

        // set contract URI
        PyramidStorage.layout().contractURI = _contractURI;

        // set BaseURI
        TokenMetadataStorage.layout().baseURI = _baseURI;
        TokenMetadataStorage.layout().uriSuffix = _uriSuffix;

        // set Max Supply
        ERC721SupplyStorage.layout().maxSupply = _maxSupply;

        // set royalty enforcement
        RoyaltyEnforcementStorage.layout().enforceRoyalties = true;

        // set default royalty
        IRoyaltyInternal.TokenRoyalty memory royalty = IRoyaltyInternal
            .TokenRoyalty({recipient: _royaltyRecipient, bps: _bps});
        RoyaltyStorage.layout().defaultRoyalty = royalty;

        // set supported interfaces
        ERC165Storage.layout().setSupportedInterface(0x01ffc9a7, true);
        ERC165Storage.layout().setSupportedInterface(0x1f931c1c, true);
        ERC165Storage.layout().setSupportedInterface(0x48e2b093, true);
        ERC165Storage.layout().setSupportedInterface(0x2a848091, true);
        ERC165Storage.layout().setSupportedInterface(0x8153916a, true);
        ERC165Storage.layout().setSupportedInterface(0xb45a3c0e, true);
        ERC165Storage.layout().setSupportedInterface(0x80ac58cd, true);
        ERC165Storage.layout().setSupportedInterface(0xcdbde6dc, true);
        ERC165Storage.layout().setSupportedInterface(0xf69e0366, true);
        ERC165Storage.layout().setSupportedInterface(0x459bd11c, true);
        ERC165Storage.layout().setSupportedInterface(0xc82b5d4d, true);
        ERC165Storage.layout().setSupportedInterface(0xffa6b6b8, true);
        ERC165Storage.layout().setSupportedInterface(0x5b5e139f, true);
        ERC165Storage.layout().setSupportedInterface(0x93254542, true);
        ERC165Storage.layout().setSupportedInterface(0x1f0b49eb, true);
        ERC165Storage.layout().setSupportedInterface(0x7f5828d0, true);
        ERC165Storage.layout().setSupportedInterface(0x06ad59bc, true);
        ERC165Storage.layout().setSupportedInterface(0xbe561268, true);
        ERC165Storage.layout().setSupportedInterface(0x52ef6f9a, true);
        ERC165Storage.layout().setSupportedInterface(0x3f963a7f, true);
        ERC165Storage.layout().setSupportedInterface(0x2a55205a, true);
        ERC165Storage.layout().setSupportedInterface(0x821be678, true);
        ERC165Storage.layout().setSupportedInterface(0xb7799584, true);
        ERC165Storage.layout().setSupportedInterface(0xd5a06d4c, true);
        ERC165Storage.layout().setSupportedInterface(0xc7627428, true);
        ERC165Storage.layout().setSupportedInterface(0x150b7a02, true);
        ERC165Storage.layout().setSupportedInterface(0x49064906, true);

        // Add the diamondCut external function from the diamondCutFacet
        IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1);
        bytes4[] memory functionSelectors = new bytes4[](1);
        functionSelectors[0] = IDiamondCut.diamondCut.selector;
        cut[0] = IDiamondCut.FacetCut({
            facetAddress: _diamondCutFacet,
            action: IDiamondCut.FacetCutAction.Add,
            functionSelectors: functionSelectors
        });
        LibDiamond.diamondCut(cut, address(0), "");
    }

    // Find facet for function that is called and execute the
    // function if a facet is found and return any value.
    fallback() external payable {
        LibDiamond.DiamondStorage storage ds;
        bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION;
        // get diamond storage
        assembly {
            ds.slot := position
        }
        // get facet from function selector
        address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;
        require(facet != address(0), "Diamond: Function does not exist");
        // Execute external function from facet using delegatecall and return any value.
        assembly {
            // copy function selector and any arguments
            calldatacopy(0, 0, calldatasize())
            // execute function call using the facet
            let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
            // get any return value
            returndatacopy(0, 0, returndatasize())
            // return any return value or error back to the caller
            switch result
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    receive() external payable {}
}

File 2 of 20 : OwnableStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

library OwnableStorage {
    struct Layout {
        address owner;
    }

    bytes32 internal constant STORAGE_SLOT = keccak256("openzeppelin.contracts.storage.Ownable");

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }

    function setOwner(Layout storage l, address owner) internal {
        l.owner = owner;
    }
}

File 3 of 20 : IRoyalty.sol
// SPDX-License-Identifier: AGPL-3.0

pragma solidity ^0.8.15;

import "@manifoldxyz/royalty-registry-solidity/contracts/specs/IEIP2981.sol";
import "@manifoldxyz/royalty-registry-solidity/contracts/specs/IRarible.sol";
import "@manifoldxyz/royalty-registry-solidity/contracts/specs/IFoundation.sol";

import "./IRoyaltyInternal.sol";

interface IRoyalty is IEIP2981, IRaribleV1, IRaribleV2, IFoundation, IRoyaltyInternal {
    /**
     * @dev Default royalty for all tokens without a specific royalty.
     */
    function defaultRoyalty() external view returns (TokenRoyalty memory);

    /**
     * @dev Get the number of token specific overrides.  Used to enumerate over all configurations
     */
    function getTokenRoyaltiesCount() external view returns (uint256);

    /**
     * @dev Get a token royalty configuration by index.  Use in conjunction with getTokenRoyaltiesCount to get all per token configurations
     */
    function getTokenRoyaltyByIndex(uint256 index) external view returns (TokenRoyaltyConfig memory);
}

File 4 of 20 : IRoyaltyInternal.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

interface IRoyaltyInternal {
    event TokenRoyaltyRemoved(uint256 tokenId);
    event TokenRoyaltySet(uint256 tokenId, address recipient, uint16 bps);
    event DefaultRoyaltySet(address recipient, uint16 bps);

    struct TokenRoyalty {
        address recipient;
        uint16 bps;
    }

    struct TokenRoyaltyConfig {
        uint256 tokenId;
        address recipient;
        uint16 bps;
    }
}

File 5 of 20 : RoyaltyEnforcementStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

library RoyaltyEnforcementStorage {
    bytes32 internal constant STORAGE_SLOT = keccak256("v2.flair.contracts.storage.RoyaltyEnforcement");

    struct Layout {
        bool enforceRoyalties;
    }

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }
}

File 6 of 20 : RoyaltyStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";

import "./IRoyaltyInternal.sol";
import "./IRoyalty.sol";

library RoyaltyStorage {
    using EnumerableSet for EnumerableSet.UintSet;

    struct Layout {
        IRoyaltyInternal.TokenRoyalty defaultRoyalty;
        mapping(uint256 => IRoyaltyInternal.TokenRoyalty) tokenRoyalties;
        EnumerableSet.UintSet tokensWithRoyalties;
    }

    bytes32 internal constant STORAGE_SLOT = keccak256("v2.flair.contracts.storage.Royalty");

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }
}

File 7 of 20 : ERC165Storage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

library ERC165Storage {
    struct Layout {
        mapping(bytes4 => bool) supportedInterfaces;
    }

    bytes32 internal constant STORAGE_SLOT = keccak256("openzeppelin.contracts.storage.ERC165");

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }

    function isSupportedInterface(Layout storage l, bytes4 interfaceId) internal view returns (bool) {
        return l.supportedInterfaces[interfaceId];
    }

    function setSupportedInterface(
        Layout storage l,
        bytes4 interfaceId,
        bool status
    ) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        l.supportedInterfaces[interfaceId] = status;
    }
}

File 8 of 20 : MetadataStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

library MetadataStorage {
    bytes32 internal constant STORAGE_SLOT = keccak256("v2.flair.contracts.storage.Metadata");

    struct Layout {
        string name;
        string symbol;
        bool nameAndSymbolLocked;
    }

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }
}

File 9 of 20 : TokenMetadataStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

library TokenMetadataStorage {
    bytes32 internal constant STORAGE_SLOT = keccak256("v2.flair.contracts.storage.TokenMetadata");

    struct Layout {
        string baseURI;
        bool baseURILocked;
        string fallbackURI;
        bool fallbackURILocked;
        string uriSuffix;
        bool uriSuffixLocked;
        uint256 lastUnlockedTokenId;
        mapping(uint256 => string) tokenURIs;
    }

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }
}

File 10 of 20 : ERC721SupplyStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

library ERC721SupplyStorage {
    struct Layout {
        // The next token ID to be minted.
        uint256 currentIndex;
        // The number of tokens burned.
        uint256 burnCounter;
        // Maximum possible supply of tokens.
        uint256 maxSupply;
    }

    bytes32 internal constant STORAGE_SLOT = keccak256("v2.flair.contracts.storage.ERC721Supply");

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }
}

File 11 of 20 : IEIP2981.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * EIP-2981
 */
interface IEIP2981 {
    /**
     * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
     *
     * => 0x2a55205a = 0x2a55205a
     */
    function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);
}

File 12 of 20 : IFoundation.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IFoundation {
    /*
     *  bytes4(keccak256('getFees(uint256)')) == 0xd5a06d4c
     *
     *  => 0xd5a06d4c = 0xd5a06d4c
     */
    function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);
}

interface IFoundationTreasuryNode {
    function getFoundationTreasury() external view returns (address payable);
}

interface IFoundationTreasury {
    function isAdmin(address account) external view returns (bool);
}

File 13 of 20 : IRarible.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IRaribleV1 {
    /*
     * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f
     * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
     *
     * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584
     */
    function getFeeBps(uint256 id) external view returns (uint[] memory);
    function getFeeRecipients(uint256 id) external view returns (address payable[] memory);
}


interface IRaribleV2 {
    /*
     *  bytes4(keccak256('getRaribleV2Royalties(uint256)')) == 0xcad96cca
     */
    struct Part {
        address payable account;
        uint96 value;
    }
    function getRaribleV2Royalties(uint256 id) external view returns (Part[] memory);
}

File 14 of 20 : EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

File 15 of 20 : IDiamondCut.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/

interface IDiamondCut {
    enum FacetCutAction {
        Add,
        Replace,
        Remove
    }
    // Add=0, Replace=1, Remove=2

    struct FacetCut {
        address facetAddress;
        FacetCutAction action;
        bytes4[] functionSelectors;
    }

    /// @notice Add/replace/remove any number of functions and optionally execute
    ///         a function with delegatecall
    /// @param _diamondCut Contains the facet addresses and function selectors
    /// @param _init The address of the contract or facet to execute _calldata
    /// @param _calldata A function call, including function selector and arguments
    ///                  _calldata is executed with delegatecall on _init
    function diamondCut(
        FacetCut[] calldata _diamondCut,
        address _init,
        bytes calldata _calldata
    ) external;

    event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
}

File 16 of 20 : IDiamondLoupe.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/

// A loupe is a small magnifying glass used to look at diamonds.
// These functions look at diamonds
interface IDiamondLoupe {
    /// These functions are expected to be called frequently
    /// by tools.

    struct Facet {
        address facetAddress;
        bytes4[] functionSelectors;
    }

    /// @notice Gets all facet addresses and their four byte function selectors.
    /// @return facets_ Facet
    function facets() external view returns (Facet[] memory facets_);

    /// @notice Gets all the function selectors supported by a specific facet.
    /// @param _facet The facet address.
    /// @return facetFunctionSelectors_
    function facetFunctionSelectors(
        address _facet
    ) external view returns (bytes4[] memory facetFunctionSelectors_);

    /// @notice Get all the facet addresses used by a diamond.
    /// @return facetAddresses_
    function facetAddresses()
        external
        view
        returns (address[] memory facetAddresses_);

    /// @notice Gets the facet that supports the given selector.
    /// @dev If facet is not found return address(0).
    /// @param _functionSelector The function selector.
    /// @return facetAddress_ The facet address.
    function facetAddress(
        bytes4 _functionSelector
    ) external view returns (address facetAddress_);
}

File 17 of 20 : IERC173.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

import "./IERC173Events.sol";

/**
 * @title Contract ownership standard interface
 * @dev see https://eips.ethereum.org/EIPS/eip-173
 */
interface IERC173 is IERC173Events {
    /**
     * @notice get the ERC173 contract owner
     * @return conrtact owner
     */
    function owner() external view returns (address);

    /**
     * @notice transfer contract ownership to new account
     * @param account address of new owner
     */
    function transferOwnership(address account) external;
}

File 18 of 20 : IERC173Events.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

/**
 * @title Contract ownership standard interface (event only)
 * @dev see https://eips.ethereum.org/EIPS/eip-173
 */
interface IERC173Events {
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );
}

File 19 of 20 : LibDiamond.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/******************************************************************************\
* Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
/******************************************************************************/
import {IDiamondCut} from "../interfaces/IDiamondCut.sol";

// Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
// The loupe functions are required by the EIP2535 Diamonds standard

error InitializationFunctionReverted(
    address _initializationContractAddress,
    bytes _calldata
);

library LibDiamond {
    bytes32 constant DIAMOND_STORAGE_POSITION =
        keccak256("diamond.standard.diamond.storage");

    struct FacetAddressAndPosition {
        address facetAddress;
        uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
    }

    struct FacetFunctionSelectors {
        bytes4[] functionSelectors;
        uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
    }

    struct DiamondStorage {
        // maps function selector to the facet address and
        // the position of the selector in the facetFunctionSelectors.selectors array
        mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
        // maps facet addresses to function selectors
        mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
        // facet addresses
        address[] facetAddresses;
    }

    function diamondStorage()
        internal
        pure
        returns (DiamondStorage storage ds)
    {
        bytes32 position = DIAMOND_STORAGE_POSITION;
        assembly {
            ds.slot := position
        }
    }

    event DiamondCut(
        IDiamondCut.FacetCut[] _diamondCut,
        address _init,
        bytes _calldata
    );

    // Internal function version of diamondCut
    function diamondCut(
        IDiamondCut.FacetCut[] memory _diamondCut,
        address _init,
        bytes memory _calldata
    ) internal {
        for (
            uint256 facetIndex;
            facetIndex < _diamondCut.length;
            facetIndex++
        ) {
            IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
            if (action == IDiamondCut.FacetCutAction.Add) {
                addFunctions(
                    _diamondCut[facetIndex].facetAddress,
                    _diamondCut[facetIndex].functionSelectors
                );
            } else if (action == IDiamondCut.FacetCutAction.Replace) {
                replaceFunctions(
                    _diamondCut[facetIndex].facetAddress,
                    _diamondCut[facetIndex].functionSelectors
                );
            } else if (action == IDiamondCut.FacetCutAction.Remove) {
                removeFunctions(
                    _diamondCut[facetIndex].facetAddress,
                    _diamondCut[facetIndex].functionSelectors
                );
            } else {
                revert("LibDiamondCut: Incorrect FacetCutAction");
            }
        }
        emit DiamondCut(_diamondCut, _init, _calldata);
        initializeDiamondCut(_init, _calldata);
    }

    function addFunctions(
        address _facetAddress,
        bytes4[] memory _functionSelectors
    ) internal {
        require(
            _functionSelectors.length > 0,
            "LibDiamondCut: No selectors in facet to cut"
        );
        DiamondStorage storage ds = diamondStorage();
        require(
            _facetAddress != address(0),
            "LibDiamondCut: Add facet can't be address(0)"
        );
        uint96 selectorPosition = uint96(
            ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
        );
        // add new facet address if it does not exist
        if (selectorPosition == 0) {
            addFacet(ds, _facetAddress);
        }
        for (
            uint256 selectorIndex;
            selectorIndex < _functionSelectors.length;
            selectorIndex++
        ) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds
                .selectorToFacetAndPosition[selector]
                .facetAddress;
            require(
                oldFacetAddress == address(0),
                "LibDiamondCut: Can't add function that already exists"
            );
            addFunction(ds, selector, selectorPosition, _facetAddress);
            selectorPosition++;
        }
    }

    function replaceFunctions(
        address _facetAddress,
        bytes4[] memory _functionSelectors
    ) internal {
        require(
            _functionSelectors.length > 0,
            "LibDiamondCut: No selectors in facet to cut"
        );
        DiamondStorage storage ds = diamondStorage();
        require(
            _facetAddress != address(0),
            "LibDiamondCut: Add facet can't be address(0)"
        );
        uint96 selectorPosition = uint96(
            ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
        );
        // add new facet address if it does not exist
        if (selectorPosition == 0) {
            addFacet(ds, _facetAddress);
        }
        for (
            uint256 selectorIndex;
            selectorIndex < _functionSelectors.length;
            selectorIndex++
        ) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds
                .selectorToFacetAndPosition[selector]
                .facetAddress;
            require(
                oldFacetAddress != _facetAddress,
                "LibDiamondCut: Can't replace function with same function"
            );
            removeFunction(ds, oldFacetAddress, selector);
            addFunction(ds, selector, selectorPosition, _facetAddress);
            selectorPosition++;
        }
    }

    function removeFunctions(
        address _facetAddress,
        bytes4[] memory _functionSelectors
    ) internal {
        require(
            _functionSelectors.length > 0,
            "LibDiamondCut: No selectors in facet to cut"
        );
        DiamondStorage storage ds = diamondStorage();
        // if function does not exist then do nothing and return
        require(
            _facetAddress == address(0),
            "LibDiamondCut: Remove facet address must be address(0)"
        );
        for (
            uint256 selectorIndex;
            selectorIndex < _functionSelectors.length;
            selectorIndex++
        ) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds
                .selectorToFacetAndPosition[selector]
                .facetAddress;
            removeFunction(ds, oldFacetAddress, selector);
        }
    }

    function addFacet(
        DiamondStorage storage ds,
        address _facetAddress
    ) internal {
        enforceHasContractCode(
            _facetAddress,
            "LibDiamondCut: New facet has no code"
        );
        ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds
            .facetAddresses
            .length;
        ds.facetAddresses.push(_facetAddress);
    }

    function addFunction(
        DiamondStorage storage ds,
        bytes4 _selector,
        uint96 _selectorPosition,
        address _facetAddress
    ) internal {
        ds
            .selectorToFacetAndPosition[_selector]
            .functionSelectorPosition = _selectorPosition;
        ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(
            _selector
        );
        ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
    }

    function removeFunction(
        DiamondStorage storage ds,
        address _facetAddress,
        bytes4 _selector
    ) internal {
        require(
            _facetAddress != address(0),
            "LibDiamondCut: Can't remove function that doesn't exist"
        );
        // an immutable function is a function defined directly in a diamond
        require(
            _facetAddress != address(this),
            "LibDiamondCut: Can't remove immutable function"
        );
        // replace selector with last selector, then delete last selector
        uint256 selectorPosition = ds
            .selectorToFacetAndPosition[_selector]
            .functionSelectorPosition;
        uint256 lastSelectorPosition = ds
            .facetFunctionSelectors[_facetAddress]
            .functionSelectors
            .length - 1;
        // if not the same then replace _selector with lastSelector
        if (selectorPosition != lastSelectorPosition) {
            bytes4 lastSelector = ds
                .facetFunctionSelectors[_facetAddress]
                .functionSelectors[lastSelectorPosition];
            ds.facetFunctionSelectors[_facetAddress].functionSelectors[
                    selectorPosition
                ] = lastSelector;
            ds
                .selectorToFacetAndPosition[lastSelector]
                .functionSelectorPosition = uint96(selectorPosition);
        }
        // delete the last selector
        ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
        delete ds.selectorToFacetAndPosition[_selector];

        // if no more selectors for facet address then delete the facet address
        if (lastSelectorPosition == 0) {
            // replace facet address with last facet address and delete last facet address
            uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
            uint256 facetAddressPosition = ds
                .facetFunctionSelectors[_facetAddress]
                .facetAddressPosition;
            if (facetAddressPosition != lastFacetAddressPosition) {
                address lastFacetAddress = ds.facetAddresses[
                    lastFacetAddressPosition
                ];
                ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                ds
                    .facetFunctionSelectors[lastFacetAddress]
                    .facetAddressPosition = facetAddressPosition;
            }
            ds.facetAddresses.pop();
            delete ds
                .facetFunctionSelectors[_facetAddress]
                .facetAddressPosition;
        }
    }

    function initializeDiamondCut(
        address _init,
        bytes memory _calldata
    ) internal {
        if (_init == address(0)) {
            return;
        }
        enforceHasContractCode(
            _init,
            "LibDiamondCut: _init address has no code"
        );
        (bool success, bytes memory error) = _init.delegatecall(_calldata);
        if (!success) {
            if (error.length > 0) {
                // bubble up error
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(error)
                    revert(add(32, error), returndata_size)
                }
            } else {
                revert InitializationFunctionReverted(_init, _calldata);
            }
        }
    }

    function enforceHasContractCode(
        address _contract,
        string memory _errorMessage
    ) internal view {
        uint256 contractSize;
        assembly {
            contractSize := extcodesize(_contract)
        }
        require(contractSize > 0, _errorMessage);
    }
}

File 20 of 20 : PyramidStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

library PyramidStorage {
    struct TokenSlot {
        uint16 tokenId;
        bool occupied;
    }

    struct Layout {
        mapping(uint16 => TokenSlot[4]) pyramidToSlots;
        mapping(bytes32 => bool) usedMessages;
        address itemsContract;
        address applicationAddress;
        string contractURI;
    }

    bytes32 internal constant STORAGE_SLOT =
        keccak256("grizzly.contracts.storage.Pyramid");

    function layout() internal pure returns (Layout storage l) {
        bytes32 slot = STORAGE_SLOT;
        assembly {
            l.slot := slot
        }
    }

    function setItemsContract(
        Layout storage l,
        address _itemsContract
    ) internal {
        l.itemsContract = _itemsContract;
    }

    function setApplicationAddress(
        Layout storage l,
        address _applicationAddress
    ) internal {
        l.applicationAddress = _applicationAddress;
    }

    function setContractURI(
        Layout storage l,
        string memory _contractURI
    ) internal {
        l.contractURI = _contractURI;
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_contractOwner","type":"address"},{"internalType":"address","name":"_diamondCutFacet","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"string","name":"_uriSuffix","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint16","name":"_bps","type":"uint16"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]

60806040526040516200568338038062005683833981810160405281019062000029919062002361565b620000578a62000043620009cf60201b620001671760201c565b620009fc60201b620001941790919060201c565b876200006d62000a4360201b620001db1760201c565b60000190816200007e919062002733565b50866200009562000a4360201b620001db1760201c565b6001019081620000a6919062002733565b5085620000bd62000a7060201b620002081760201c565b6004019081620000ce919062002733565b5084620000e562000a9d60201b620002351760201c565b6000019081620000f6919062002733565b50836200010d62000a9d60201b620002351760201c565b60040190816200011e919062002733565b50826200013562000aca60201b620002621760201c565b6002018190555060016200015362000af760201b6200028f1760201c565b60000160006101000a81548160ff021916908315150217905550600060405180604001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff16815250905080620001b662000b2460201b620002bc1760201c565b60000160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff1602179055509050506200025e6301ffc9a760e01b60016200024962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b62000296631f931c1c60e01b60016200028162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620002ce6348e2b09360e01b6001620002b962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b62000306632a84809160e01b6001620002f162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200033e638153916a60e01b60016200032962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200037663b45a3c0e60e01b60016200036162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620003ae6380ac58cd60e01b60016200039962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620003e663cdbde6dc60e01b6001620003d162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200041e63f69e036660e01b60016200040962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200045663459bd11c60e01b60016200044162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200048e63c82b5d4d60e01b60016200047962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620004c663ffa6b6b860e01b6001620004b162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620004fe635b5e139f60e01b6001620004e962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b62000536639325454260e01b60016200052162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200056e631f0b49eb60e01b60016200055962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620005a6637f5828d060e01b60016200059162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620005de6306ad59bc60e01b6001620005c962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200061663be56126860e01b60016200060162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200064e6352ef6f9a60e01b60016200063962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b62000686633f963a7f60e01b60016200067162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620006be632a55205a60e01b6001620006a962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620006f663821be67860e01b6001620006e162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200072e63b779958460e01b60016200071962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200076663d5a06d4c60e01b60016200075162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200079e63c762742860e01b60016200078962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b620007d663150b7a0260e01b6001620007c162000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6200080e634906490660e01b6001620007f962000b5160201b620002e91760201c565b62000b7e60201b62000316179092919060201c565b6000600167ffffffffffffffff8111156200082e576200082d62002183565b5b6040519080825280602002602001820160405280156200086b57816020015b62000857620020a3565b8152602001906001900390816200084d5790505b5090506000600167ffffffffffffffff8111156200088e576200088d62002183565b5b604051908082528060200260200182016040528015620008bd5781602001602082028036833780820191505090505b509050631f931c1c60e01b81600081518110620008df57620008de6200281a565b5b60200260200101907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152505060405180606001604052808d73ffffffffffffffffffffffffffffffffffffffff1681526020016000600281111562000969576200096862002849565b5b815260200182815250826000815181106200098957620009886200281a565b5b6020026020010181905250620009bc8260006040518060200160405280600081525062000c5960201b620003ee1760201c565b5050505050505050505050505062003321565b6000807fc0ea367cb0174dd5521cd2372c76f8c13e6c1f832c71f1d6e0cbc185c9cc8ed490508091505090565b808260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000807f70612f47e27b43eb7f87867b7b8f899a5e08503dcccf1bf322c9eef06483a1fc90508091505090565b6000807f28410b8d07a385aff8eb33686a835d0d735720435533fcd095378d7aea1cd08990508091505090565b6000807f021fe373f7e014154d4f551c37c047b9ed9093c774291911030896b9b2dfef5f90508091505090565b6000807faa3a0910ce5fb062d392dc5a532ff9d50bb9d0f614a8eda1a3ec786de0b761f390508091505090565b6000807f9c1f08fc16fa10f59a3ac18a8c5596ea456f2d66793744df41c7c3e4eb21979090508091505090565b6000807fad41a88d044cfe4c318a78970a1f122259b5b1a56fdee398e17d1e83109ea07590508091505090565b6000807fff923f4a67695a9cdd5da4b8580a5a20edf2183c42aa111dd7fc15dc7bed264090508091505090565b63ffffffff60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160362000be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000be090620028d9565b60405180910390fd5b80836000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60005b835181101562000e8857600084828151811062000c7e5762000c7d6200281a565b5b60200260200101516020015190506000600281111562000ca35762000ca262002849565b5b81600281111562000cb95762000cb862002849565b5b0362000d195762000d1385838151811062000cd95762000cd86200281a565b5b60200260200101516000015186848151811062000cfb5762000cfa6200281a565b5b60200260200101516040015162000edd60201b60201c565b62000e71565b6001600281111562000d305762000d2f62002849565b5b81600281111562000d465762000d4562002849565b5b0362000da65762000da085838151811062000d665762000d656200281a565b5b60200260200101516000015186848151811062000d885762000d876200281a565b5b6020026020010151604001516200117f60201b60201c565b62000e70565b60028081111562000dbc5762000dbb62002849565b5b81600281111562000dd25762000dd162002849565b5b0362000e325762000e2c85838151811062000df25762000df16200281a565b5b60200260200101516000015186848151811062000e145762000e136200281a565b5b6020026020010151604001516200143360201b60201c565b62000e6f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e669062002971565b60405180910390fd5b5b5b50808062000e7f90620029c2565b91505062000c5c565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405162000ebe9392919062002cff565b60405180910390a162000ed88282620015db60201b60201c565b505050565b600081511162000f24576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f1b9062002dc0565b60405180910390fd5b600062000f366200170f60201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000faa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000fa19062002e58565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff160362001020576200101f82856200173c60201b60201c565b5b60005b8351811015620011785760008482815181106200104557620010446200281a565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146200113c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620011339062002ef0565b60405180910390fd5b620011508583868a6200182060201b60201c565b83806200115d9062002f2a565b945050505080806200116f90620029c2565b91505062001023565b5050505050565b6000815111620011c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620011bd9062002dc0565b60405180910390fd5b6000620011d86200170f60201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036200124c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012439062002e58565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff1603620012c257620012c182856200173c60201b60201c565b5b60005b83518110156200142c576000848281518110620012e757620012e66200281a565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620013dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620013d49062002fd9565b60405180910390fd5b620013f0858284620019cd60201b60201c565b620014048583868a6200182060201b60201c565b8380620014119062002f2a565b945050505080806200142390620029c2565b915050620012c5565b5050505050565b60008151116200147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014719062002dc0565b60405180910390fd5b60006200148c6200170f60201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462001500576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014f79062003071565b60405180910390fd5b60005b8251811015620015d55760008382815181106200152557620015246200281a565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050620015bd848284620019cd60201b60201c565b50508080620015cc90620029c2565b91505062001503565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156200170b576200163c8260405180606001604052806028815260200162005637602891396200204e60201b60201c565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051620016669190620030d5565b600060405180830381855af49150503d8060008114620016a3576040519150601f19603f3d011682016040523d82523d6000602084013e620016a8565b606091505b5091509150816200170857600081511115620016c75780518082602001fd5b83836040517f192105d7000000000000000000000000000000000000000000000000000000008152600401620016ff929190620030ee565b60405180910390fd5b50505b5050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b62001767816040518060600160405280602481526020016200565f602491396200204e60201b60201c565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362001a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a369062003198565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362001ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001aa79062003230565b60405180910390fd5b6000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050600060018560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905062001b89919062003252565b905080821462001d245760008560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811062001bee5762001bed6200281a565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050808660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001848154811062001c6d5762001c6c6200281a565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c021790555082866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505b8460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000180548062001d7b5762001d7a6200328d565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505060008103620020475760006001866002018054905062001e68919062003252565b905060008660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905081811462001fb057600087600201838154811062001ed65762001ed56200281a565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508088600201838154811062001f1d5762001f1c6200281a565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818860010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b8660020180548062001fc75762001fc66200328d565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000905550505b5050505050565b6000823b90506000811182906200209d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620020949190620032fd565b60405180910390fd5b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160006002811115620020e257620020e162002849565b5b8152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620021308262002103565b9050919050565b620021428162002123565b81146200214e57600080fd5b50565b600081519050620021628162002137565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620021bd8262002172565b810181811067ffffffffffffffff82111715620021df57620021de62002183565b5b80604052505050565b6000620021f4620020ef565b9050620022028282620021b2565b919050565b600067ffffffffffffffff82111562002225576200222462002183565b5b620022308262002172565b9050602081019050919050565b60005b838110156200225d57808201518184015260208101905062002240565b60008484015250505050565b6000620022806200227a8462002207565b620021e8565b9050828152602081018484840111156200229f576200229e6200216d565b5b620022ac8482856200223d565b509392505050565b600082601f830112620022cc57620022cb62002168565b5b8151620022de84826020860162002269565b91505092915050565b6000819050919050565b620022fc81620022e7565b81146200230857600080fd5b50565b6000815190506200231c81620022f1565b92915050565b600061ffff82169050919050565b6200233b8162002322565b81146200234757600080fd5b50565b6000815190506200235b8162002330565b92915050565b6000806000806000806000806000806101408b8d031215620023885762002387620020f9565b5b6000620023988d828e0162002151565b9a50506020620023ab8d828e0162002151565b99505060408b015167ffffffffffffffff811115620023cf57620023ce620020fe565b5b620023dd8d828e01620022b4565b98505060608b015167ffffffffffffffff811115620024015762002400620020fe565b5b6200240f8d828e01620022b4565b97505060808b015167ffffffffffffffff811115620024335762002432620020fe565b5b620024418d828e01620022b4565b96505060a08b015167ffffffffffffffff811115620024655762002464620020fe565b5b620024738d828e01620022b4565b95505060c08b015167ffffffffffffffff811115620024975762002496620020fe565b5b620024a58d828e01620022b4565b94505060e0620024b88d828e016200230b565b935050610100620024cc8d828e0162002151565b925050610120620024e08d828e016200234a565b9150509295989b9194979a5092959850565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200254557607f821691505b6020821081036200255b576200255a620024fd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620025c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262002586565b620025d1868362002586565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620026146200260e6200260884620022e7565b620025e9565b620022e7565b9050919050565b6000819050919050565b6200263083620025f3565b620026486200263f826200261b565b84845462002593565b825550505050565b600090565b6200265f62002650565b6200266c81848462002625565b505050565b5b8181101562002694576200268860008262002655565b60018101905062002672565b5050565b601f821115620026e357620026ad8162002561565b620026b88462002576565b81016020851015620026c8578190505b620026e0620026d78562002576565b83018262002671565b50505b505050565b600082821c905092915050565b60006200270860001984600802620026e8565b1980831691505092915050565b6000620027238383620026f5565b9150826002028217905092915050565b6200273e82620024f2565b67ffffffffffffffff8111156200275a576200275962002183565b5b6200276682546200252c565b6200277382828562002698565b600060209050601f831160018114620027ab576000841562002796578287015190505b620027a2858262002715565b86555062002812565b601f198416620027bb8662002561565b60005b82811015620027e557848901518255600182019150602085019450602081019050620027be565b8683101562002805578489015162002801601f891682620026f5565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600082825260208201905092915050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b6000620028c1601c8362002878565b9150620028ce8262002889565b602082019050919050565b60006020820190508181036000830152620028f481620028b2565b9050919050565b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b60006200295960278362002878565b91506200296682620028fb565b604082019050919050565b600060208201905081810360008301526200298c816200294a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620029cf82620022e7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362002a045762002a0362002993565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62002a468162002123565b82525050565b6003811062002a605762002a5f62002849565b5b50565b600081905062002a738262002a4c565b919050565b600062002a858262002a63565b9050919050565b62002a978162002a78565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62002b008162002ac9565b82525050565b600062002b14838362002af5565b60208301905092915050565b6000602082019050919050565b600062002b3a8262002a9d565b62002b46818562002aa8565b935062002b538362002ab9565b8060005b8381101562002b8a57815162002b6e888262002b06565b975062002b7b8362002b20565b92505060018101905062002b57565b5085935050505092915050565b600060608301600083015162002bb1600086018262002a3b565b50602083015162002bc6602086018262002a8c565b506040830151848203604086015262002be0828262002b2d565b9150508091505092915050565b600062002bfb838362002b97565b905092915050565b6000602082019050919050565b600062002c1d8262002a0f565b62002c29818562002a1a565b93508360208202850162002c3d8562002a2b565b8060005b8581101562002c7f578484038952815162002c5d858262002bed565b945062002c6a8362002c03565b925060208a0199505060018101905062002c41565b50829750879550505050505092915050565b62002c9c8162002123565b82525050565b600081519050919050565b600082825260208201905092915050565b600062002ccb8262002ca2565b62002cd7818562002cad565b935062002ce98185602086016200223d565b62002cf48162002172565b840191505092915050565b6000606082019050818103600083015262002d1b818662002c10565b905062002d2c602083018562002c91565b818103604083015262002d40818462002cbe565b9050949350505050565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b600062002da8602b8362002878565b915062002db58262002d4a565b604082019050919050565b6000602082019050818103600083015262002ddb8162002d99565b9050919050565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b600062002e40602c8362002878565b915062002e4d8262002de2565b604082019050919050565b6000602082019050818103600083015262002e738162002e31565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b600062002ed860358362002878565b915062002ee58262002e7a565b604082019050919050565b6000602082019050818103600083015262002f0b8162002ec9565b9050919050565b60006bffffffffffffffffffffffff82169050919050565b600062002f378262002f12565b91506bffffffffffffffffffffffff820362002f585762002f5762002993565b5b600182019050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b600062002fc160388362002878565b915062002fce8262002f63565b604082019050919050565b6000602082019050818103600083015262002ff48162002fb2565b9050919050565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b60006200305960368362002878565b9150620030668262002ffb565b604082019050919050565b600060208201905081810360008301526200308c816200304a565b9050919050565b600081905092915050565b6000620030ab8262002ca2565b620030b7818562003093565b9350620030c98185602086016200223d565b80840191505092915050565b6000620030e382846200309e565b915081905092915050565b600060408201905062003105600083018562002c91565b818103602083015262003119818462002cbe565b90509392505050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b60006200318060378362002878565b91506200318d8262003122565b604082019050919050565b60006020820190508181036000830152620031b38162003171565b9050919050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e000000000000000000000000000000000000602082015250565b600062003218602e8362002878565b91506200322582620031ba565b604082019050919050565b600060208201905081810360008301526200324b8162003209565b9050919050565b60006200325f82620022e7565b91506200326c83620022e7565b925082820390508181111562003287576200328662002993565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000620032c982620024f2565b620032d5818562002878565b9350620032e78185602086016200223d565b620032f28162002172565b840191505092915050565b60006020820190508181036000830152620033198184620032bc565b905092915050565b61230680620033316000396000f3fe60806040523661000b57005b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013890611788565b60405180910390fd5b3660008037600080366000845af43d6000803e8060008114610162573d6000f35b3d6000fd5b6000807fc0ea367cb0174dd5521cd2372c76f8c13e6c1f832c71f1d6e0cbc185c9cc8ed490508091505090565b808260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000807f70612f47e27b43eb7f87867b7b8f899a5e08503dcccf1bf322c9eef06483a1fc90508091505090565b6000807f28410b8d07a385aff8eb33686a835d0d735720435533fcd095378d7aea1cd08990508091505090565b6000807f021fe373f7e014154d4f551c37c047b9ed9093c774291911030896b9b2dfef5f90508091505090565b6000807faa3a0910ce5fb062d392dc5a532ff9d50bb9d0f614a8eda1a3ec786de0b761f390508091505090565b6000807f9c1f08fc16fa10f59a3ac18a8c5596ea456f2d66793744df41c7c3e4eb21979090508091505090565b6000807fad41a88d044cfe4c318a78970a1f122259b5b1a56fdee398e17d1e83109ea07590508091505090565b6000807fff923f4a67695a9cdd5da4b8580a5a20edf2183c42aa111dd7fc15dc7bed264090508091505090565b63ffffffff60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361037e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610375906117f4565b60405180910390fd5b80836000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60005b83518110156105d257600084828151811061040f5761040e611814565b5b60200260200101516020015190506000600281111561043157610430611843565b5b81600281111561044457610443611843565b5b036104945761048f85838151811061045f5761045e611814565b5b60200260200101516000015186848151811061047e5761047d611814565b5b60200260200101516040015161061d565b6105be565b600160028111156104a8576104a7611843565b5b8160028111156104bb576104ba611843565b5b0361050b576105068583815181106104d6576104d5611814565b5b6020026020010151600001518684815181106104f5576104f4611814565b5b602002602001015160400151610894565b6105bd565b60028081111561051e5761051d611843565b5b81600281111561053157610530611843565b5b036105815761057c85838151811061054c5761054b611814565b5b60200260200101516000015186848151811061056b5761056a611814565b5b602002602001015160400151610b15565b6105bc565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b3906118e4565b60405180910390fd5b5b5b5080806105ca9061193d565b9150506103f1565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161060693929190611ca9565b60405180910390a16106188282610ca0565b505050565b6000815111610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065890611d60565b60405180910390fd5b600061066b610dc2565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d390611df2565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff1603610749576107488285610def565b5b60005b835181101561088d57600084828151811061076a57610769611814565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590611e84565b60405180910390fd5b61086a8583868a610eca565b838061087590611ebc565b945050505080806108859061193d565b91505061074c565b5050505050565b60008151116108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90611d60565b60405180910390fd5b60006108e2610dc2565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094a90611df2565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff16036109c0576109bf8285610def565b5b60005b8351811015610b0e5760008482815181106109e1576109e0611814565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90611f62565b60405180910390fd5b610adf858284611077565b610aeb8583868a610eca565b8380610af690611ebc565b94505050508080610b069061193d565b9150506109c3565b5050505050565b6000815111610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090611d60565b60405180910390fd5b6000610b63610dc2565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90611ff4565b60405180910390fd5b60005b8251811015610c9a576000838281518110610bf557610bf4611814565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610c85848284611077565b50508080610c929061193d565b915050610bd7565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315610dbe57610cf782604051806060016040528060288152602001612285602891396116d9565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610d1f9190612050565b600060405180830381855af49150503d8060008114610d5a576040519150601f19603f3d011682016040523d82523d6000602084013e610d5f565b606091505b509150915081610dbb57600081511115610d7c5780518082602001fd5b83836040517f192105d7000000000000000000000000000000000000000000000000000000008152600401610db2929190612067565b60405180910390fd5b50505b5050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b610e11816040518060600160405280602481526020016122ad602491396116d9565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90612109565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b9061219b565b60405180910390fd5b6000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050600060018560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905061122b91906121bb565b90508082146113bf5760008560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061128c5761128b611814565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050808660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001848154811061130857611307611814565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c021790555082866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505b8460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480611413576114126121ef565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050600081036116d2576000600186600201805490506114fd91906121bb565b905060008660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905081811461163e57600087600201838154811061156757611566611814565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050808860020183815481106115ab576115aa611814565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818860010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b86600201805480611652576116516121ef565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000905550505b5050505050565b6000823b9050600081118290611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c9190612262565b60405180910390fd5b50505050565b600082825260208201905092915050565b7f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f74206578697374600082015250565b600061177260208361172b565b915061177d8261173c565b602082019050919050565b600060208201905081810360008301526117a181611765565b9050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b60006117de601c8361172b565b91506117e9826117a8565b602082019050919050565b6000602082019050818103600083015261180d816117d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b60006118ce60278361172b565b91506118d982611872565b604082019050919050565b600060208201905081810360008301526118fd816118c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600061194882611933565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361197a57611979611904565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119dc826119b1565b9050919050565b6119ec816119d1565b82525050565b60038110611a0357611a02611843565b5b50565b6000819050611a14826119f2565b919050565b6000611a2482611a06565b9050919050565b611a3481611a19565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611a9b81611a66565b82525050565b6000611aad8383611a92565b60208301905092915050565b6000602082019050919050565b6000611ad182611a3a565b611adb8185611a45565b9350611ae683611a56565b8060005b83811015611b17578151611afe8882611aa1565b9750611b0983611ab9565b925050600181019050611aea565b5085935050505092915050565b6000606083016000830151611b3c60008601826119e3565b506020830151611b4f6020860182611a2b565b5060408301518482036040860152611b678282611ac6565b9150508091505092915050565b6000611b808383611b24565b905092915050565b6000602082019050919050565b6000611ba082611985565b611baa8185611990565b935083602082028501611bbc856119a1565b8060005b85811015611bf85784840389528151611bd98582611b74565b9450611be483611b88565b925060208a01995050600181019050611bc0565b50829750879550505050505092915050565b611c13816119d1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c53578082015181840152602081019050611c38565b60008484015250505050565b6000601f19601f8301169050919050565b6000611c7b82611c19565b611c858185611c24565b9350611c95818560208601611c35565b611c9e81611c5f565b840191505092915050565b60006060820190508181036000830152611cc38186611b95565b9050611cd26020830185611c0a565b8181036040830152611ce48184611c70565b9050949350505050565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b6000611d4a602b8361172b565b9150611d5582611cee565b604082019050919050565b60006020820190508181036000830152611d7981611d3d565b9050919050565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b6000611ddc602c8361172b565b9150611de782611d80565b604082019050919050565b60006020820190508181036000830152611e0b81611dcf565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b6000611e6e60358361172b565b9150611e7982611e12565b604082019050919050565b60006020820190508181036000830152611e9d81611e61565b9050919050565b60006bffffffffffffffffffffffff82169050919050565b6000611ec782611ea4565b91506bffffffffffffffffffffffff8203611ee557611ee4611904565b5b600182019050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b6000611f4c60388361172b565b9150611f5782611ef0565b604082019050919050565b60006020820190508181036000830152611f7b81611f3f565b9050919050565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b6000611fde60368361172b565b9150611fe982611f82565b604082019050919050565b6000602082019050818103600083015261200d81611fd1565b9050919050565b600081905092915050565b600061202a82611c19565b6120348185612014565b9350612044818560208601611c35565b80840191505092915050565b600061205c828461201f565b915081905092915050565b600060408201905061207c6000830185611c0a565b818103602083015261208e8184611c70565b90509392505050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b60006120f360378361172b565b91506120fe82612097565b604082019050919050565b60006020820190508181036000830152612122816120e6565b9050919050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e000000000000000000000000000000000000602082015250565b6000612185602e8361172b565b915061219082612129565b604082019050919050565b600060208201905081810360008301526121b481612178565b9050919050565b60006121c682611933565b91506121d183611933565b92508282039050818111156121e9576121e8611904565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b60006122348261221e565b61223e818561172b565b935061224e818560208601611c35565b61225781611c5f565b840191505092915050565b6000602082019050818103600083015261227c8184612229565b90509291505056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a264697066735822122098e5dad8285d2e9a2c455e633ce3418c10194e5b1ec02b7e824e1b6e99511a3564736f6c634300081200334c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465000000000000000000000000a8ba7a46f47c21571f0c61de527186b47d74817400000000000000000000000083affb8bdb6e875b51e640537cce36860578046f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000001388000000000000000000000000c35be11967d522f81ccb3eb053a3ec0a212e5e6b00000000000000000000000000000000000000000000000000000000000002bc0000000000000000000000000000000000000000000000000000000000000017507972616d6964204f6620496e63696e65726174696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000003504f4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d623948675641444d5857724361565747626b6b586f6b454b32614a46764668656d4156506443584578427a582f636f6e74726163742e6a736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d623948675641444d5857724361565747626b6b586f6b454b32614a46764668656d4156506443584578427a582f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040523661000b57005b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013890611788565b60405180910390fd5b3660008037600080366000845af43d6000803e8060008114610162573d6000f35b3d6000fd5b6000807fc0ea367cb0174dd5521cd2372c76f8c13e6c1f832c71f1d6e0cbc185c9cc8ed490508091505090565b808260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000807f70612f47e27b43eb7f87867b7b8f899a5e08503dcccf1bf322c9eef06483a1fc90508091505090565b6000807f28410b8d07a385aff8eb33686a835d0d735720435533fcd095378d7aea1cd08990508091505090565b6000807f021fe373f7e014154d4f551c37c047b9ed9093c774291911030896b9b2dfef5f90508091505090565b6000807faa3a0910ce5fb062d392dc5a532ff9d50bb9d0f614a8eda1a3ec786de0b761f390508091505090565b6000807f9c1f08fc16fa10f59a3ac18a8c5596ea456f2d66793744df41c7c3e4eb21979090508091505090565b6000807fad41a88d044cfe4c318a78970a1f122259b5b1a56fdee398e17d1e83109ea07590508091505090565b6000807fff923f4a67695a9cdd5da4b8580a5a20edf2183c42aa111dd7fc15dc7bed264090508091505090565b63ffffffff60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361037e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610375906117f4565b60405180910390fd5b80836000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b60005b83518110156105d257600084828151811061040f5761040e611814565b5b60200260200101516020015190506000600281111561043157610430611843565b5b81600281111561044457610443611843565b5b036104945761048f85838151811061045f5761045e611814565b5b60200260200101516000015186848151811061047e5761047d611814565b5b60200260200101516040015161061d565b6105be565b600160028111156104a8576104a7611843565b5b8160028111156104bb576104ba611843565b5b0361050b576105068583815181106104d6576104d5611814565b5b6020026020010151600001518684815181106104f5576104f4611814565b5b602002602001015160400151610894565b6105bd565b60028081111561051e5761051d611843565b5b81600281111561053157610530611843565b5b036105815761057c85838151811061054c5761054b611814565b5b60200260200101516000015186848151811061056b5761056a611814565b5b602002602001015160400151610b15565b6105bc565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b3906118e4565b60405180910390fd5b5b5b5080806105ca9061193d565b9150506103f1565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb67383838360405161060693929190611ca9565b60405180910390a16106188282610ca0565b505050565b6000815111610661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065890611d60565b60405180910390fd5b600061066b610dc2565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d390611df2565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff1603610749576107488285610def565b5b60005b835181101561088d57600084828151811061076a57610769611814565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590611e84565b60405180910390fd5b61086a8583868a610eca565b838061087590611ebc565b945050505080806108859061193d565b91505061074c565b5050505050565b60008151116108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90611d60565b60405180910390fd5b60006108e2610dc2565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094a90611df2565b60405180910390fd5b60008160010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905090506000816bffffffffffffffffffffffff16036109c0576109bf8285610def565b5b60005b8351811015610b0e5760008482815181106109e1576109e0611814565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ad4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acb90611f62565b60405180910390fd5b610adf858284611077565b610aeb8583868a610eca565b8380610af690611ebc565b94505050508080610b069061193d565b9150506109c3565b5050505050565b6000815111610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5090611d60565b60405180910390fd5b6000610b63610dc2565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb90611ff4565b60405180910390fd5b60005b8251811015610c9a576000838281518110610bf557610bf4611814565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610c85848284611077565b50508080610c929061193d565b915050610bd7565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315610dbe57610cf782604051806060016040528060288152602001612285602891396116d9565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051610d1f9190612050565b600060405180830381855af49150503d8060008114610d5a576040519150601f19603f3d011682016040523d82523d6000602084013e610d5f565b606091505b509150915081610dbb57600081511115610d7c5780518082602001fd5b83836040517f192105d7000000000000000000000000000000000000000000000000000000008152600401610db2929190612067565b60405180910390fd5b50505b5050565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b610e11816040518060600160405280602481526020016122ad602491396116d9565b81600201805490508260010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600201819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b81846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055508360010160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018390806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555080846000016000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110dd90612109565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b9061219b565b60405180910390fd5b6000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff169050600060018560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018054905061122b91906121bb565b90508082146113bf5760008560010160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001828154811061128c5761128b611814565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b9050808660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001848154811061130857611307611814565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c021790555082866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550505b8460010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480611413576114126121ef565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff02191690555050600081036116d2576000600186600201805490506114fd91906121bb565b905060008660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905081811461163e57600087600201838154811061156757611566611814565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050808860020183815481106115ab576115aa611814565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818860010160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505b86600201805480611652576116516121ef565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558660010160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000905550505b5050505050565b6000823b9050600081118290611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171c9190612262565b60405180910390fd5b50505050565b600082825260208201905092915050565b7f4469616d6f6e643a2046756e6374696f6e20646f6573206e6f74206578697374600082015250565b600061177260208361172b565b915061177d8261173c565b602082019050919050565b600060208201905081810360008301526117a181611765565b9050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b60006117de601c8361172b565b91506117e9826117a8565b602082019050919050565b6000602082019050818103600083015261180d816117d1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4c69624469616d6f6e644375743a20496e636f7272656374204661636574437560008201527f74416374696f6e00000000000000000000000000000000000000000000000000602082015250565b60006118ce60278361172b565b91506118d982611872565b604082019050919050565b600060208201905081810360008301526118fd816118c1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b600061194882611933565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361197a57611979611904565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119dc826119b1565b9050919050565b6119ec816119d1565b82525050565b60038110611a0357611a02611843565b5b50565b6000819050611a14826119f2565b919050565b6000611a2482611a06565b9050919050565b611a3481611a19565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611a9b81611a66565b82525050565b6000611aad8383611a92565b60208301905092915050565b6000602082019050919050565b6000611ad182611a3a565b611adb8185611a45565b9350611ae683611a56565b8060005b83811015611b17578151611afe8882611aa1565b9750611b0983611ab9565b925050600181019050611aea565b5085935050505092915050565b6000606083016000830151611b3c60008601826119e3565b506020830151611b4f6020860182611a2b565b5060408301518482036040860152611b678282611ac6565b9150508091505092915050565b6000611b808383611b24565b905092915050565b6000602082019050919050565b6000611ba082611985565b611baa8185611990565b935083602082028501611bbc856119a1565b8060005b85811015611bf85784840389528151611bd98582611b74565b9450611be483611b88565b925060208a01995050600181019050611bc0565b50829750879550505050505092915050565b611c13816119d1565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611c53578082015181840152602081019050611c38565b60008484015250505050565b6000601f19601f8301169050919050565b6000611c7b82611c19565b611c858185611c24565b9350611c95818560208601611c35565b611c9e81611c5f565b840191505092915050565b60006060820190508181036000830152611cc38186611b95565b9050611cd26020830185611c0a565b8181036040830152611ce48184611c70565b9050949350505050565b7f4c69624469616d6f6e644375743a204e6f2073656c6563746f727320696e206660008201527f6163657420746f20637574000000000000000000000000000000000000000000602082015250565b6000611d4a602b8361172b565b9150611d5582611cee565b604082019050919050565b60006020820190508181036000830152611d7981611d3d565b9050919050565b7f4c69624469616d6f6e644375743a204164642066616365742063616e2774206260008201527f6520616464726573732830290000000000000000000000000000000000000000602082015250565b6000611ddc602c8361172b565b9150611de782611d80565b604082019050919050565b60006020820190508181036000830152611e0b81611dcf565b9050919050565b7f4c69624469616d6f6e644375743a2043616e2774206164642066756e6374696f60008201527f6e207468617420616c7265616479206578697374730000000000000000000000602082015250565b6000611e6e60358361172b565b9150611e7982611e12565b604082019050919050565b60006020820190508181036000830152611e9d81611e61565b9050919050565b60006bffffffffffffffffffffffff82169050919050565b6000611ec782611ea4565b91506bffffffffffffffffffffffff8203611ee557611ee4611904565b5b600182019050919050565b7f4c69624469616d6f6e644375743a2043616e2774207265706c6163652066756e60008201527f6374696f6e20776974682073616d652066756e6374696f6e0000000000000000602082015250565b6000611f4c60388361172b565b9150611f5782611ef0565b604082019050919050565b60006020820190508181036000830152611f7b81611f3f565b9050919050565b7f4c69624469616d6f6e644375743a2052656d6f7665206661636574206164647260008201527f657373206d757374206265206164647265737328302900000000000000000000602082015250565b6000611fde60368361172b565b9150611fe982611f82565b604082019050919050565b6000602082019050818103600083015261200d81611fd1565b9050919050565b600081905092915050565b600061202a82611c19565b6120348185612014565b9350612044818560208601611c35565b80840191505092915050565b600061205c828461201f565b915081905092915050565b600060408201905061207c6000830185611c0a565b818103602083015261208e8184611c70565b90509392505050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f76652066756e6360008201527f74696f6e207468617420646f65736e2774206578697374000000000000000000602082015250565b60006120f360378361172b565b91506120fe82612097565b604082019050919050565b60006020820190508181036000830152612122816120e6565b9050919050565b7f4c69624469616d6f6e644375743a2043616e27742072656d6f766520696d6d7560008201527f7461626c652066756e6374696f6e000000000000000000000000000000000000602082015250565b6000612185602e8361172b565b915061219082612129565b604082019050919050565b600060208201905081810360008301526121b481612178565b9050919050565b60006121c682611933565b91506121d183611933565b92508282039050818111156121e9576121e8611904565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b60006122348261221e565b61223e818561172b565b935061224e818560208601611c35565b61225781611c5f565b840191505092915050565b6000602082019050818103600083015261227c8184612229565b90509291505056fe4c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a204e657720666163657420686173206e6f20636f6465a264697066735822122098e5dad8285d2e9a2c455e633ce3418c10194e5b1ec02b7e824e1b6e99511a3564736f6c63430008120033

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

000000000000000000000000a8ba7a46f47c21571f0c61de527186b47d74817400000000000000000000000083affb8bdb6e875b51e640537cce36860578046f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000001388000000000000000000000000c35be11967d522f81ccb3eb053a3ec0a212e5e6b00000000000000000000000000000000000000000000000000000000000002bc0000000000000000000000000000000000000000000000000000000000000017507972616d6964204f6620496e63696e65726174696f6e0000000000000000000000000000000000000000000000000000000000000000000000000000000003504f4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d623948675641444d5857724361565747626b6b586f6b454b32614a46764668656d4156506443584578427a582f636f6e74726163742e6a736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d623948675641444d5857724361565747626b6b586f6b454b32614a46764668656d4156506443584578427a582f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _contractOwner (address): 0xA8BA7A46f47C21571f0C61DE527186b47D748174
Arg [1] : _diamondCutFacet (address): 0x83aFfb8bDB6e875B51e640537CCe36860578046F
Arg [2] : _name (string): Pyramid Of Incineration
Arg [3] : _symbol (string): POI
Arg [4] : _contractURI (string): ipfs://Qmb9HgVADMXWrCaVWGbkkXokEK2aJFvFhemAVPdCXExBzX/contract.json
Arg [5] : _baseURI (string): ipfs://Qmb9HgVADMXWrCaVWGbkkXokEK2aJFvFhemAVPdCXExBzX/
Arg [6] : _uriSuffix (string): .json
Arg [7] : _maxSupply (uint256): 5000
Arg [8] : _royaltyRecipient (address): 0xC35Be11967d522f81CCb3Eb053a3eC0A212e5e6B
Arg [9] : _bps (uint16): 700

-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 000000000000000000000000a8ba7a46f47c21571f0c61de527186b47d748174
Arg [1] : 00000000000000000000000083affb8bdb6e875b51e640537cce36860578046f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [6] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [7] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [8] : 000000000000000000000000c35be11967d522f81ccb3eb053a3ec0a212e5e6b
Arg [9] : 00000000000000000000000000000000000000000000000000000000000002bc
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [11] : 507972616d6964204f6620496e63696e65726174696f6e000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 504f490000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [15] : 697066733a2f2f516d623948675641444d5857724361565747626b6b586f6b45
Arg [16] : 4b32614a46764668656d4156506443584578427a582f636f6e74726163742e6a
Arg [17] : 736f6e0000000000000000000000000000000000000000000000000000000000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [19] : 697066733a2f2f516d623948675641444d5857724361565747626b6b586f6b45
Arg [20] : 4b32614a46764668656d4156506443584578427a582f00000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [22] : 2e6a736f6e000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.