ETH Price: $3,097.28 (-1.18%)

Token

Giga Garden LSD (GGLSD)
 

Overview

Max Total Supply

689 GGLSD

Holders

288

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
arvindhra.eth
Balance
1 GGLSD
0x8f7d97536a297f3645cf4526705399c6c01d36ca
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GigaGardenLSD

Compiler Version
v0.7.0+commit.9e61f92b

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 7 of 18: GigaGardenLSD.sol
// SPDX-License-Identifier: MIT
// File: contracts/GigaGardenLSD.sol


pragma solidity ^0.7.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./PaymentSplitter.sol";
import "./Whitelist.sol";

/**
 * @title GigaGardenLSD contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */
contract GigaGardenLSD is ERC721, Ownable, PaymentSplitter, Whitelist {
    using SafeMath for uint256;

    string public GGLSD_PROVENANCE = "";

    uint256 public startingIndexBlock;

    uint256 public startingIndex;

    uint256 public constant flowerPrice = 50000000000000000; //0.05 ETH

    uint public constant maxFlowerPurchase = 20;

    uint256 public MAX_FLOWER_SUPPLY;

    uint256 public MAX_PRESALE_FLOWER_SUPPLY;

    bool public saleIsActive = false;

    bool public presaleIsActive = false;

    uint256 public REVEAL_TIMESTAMP;

    constructor(string memory name, string memory symbol, uint256 maxNftSupply, uint256 maxPresaleNftSupply, uint256 saleStart, address[] memory addrs, uint256[] memory shares_, address[] memory wl_addrs) ERC721(name, symbol) PaymentSplitter(addrs,shares_) Whitelist(wl_addrs){
        MAX_FLOWER_SUPPLY = maxNftSupply;
        MAX_PRESALE_FLOWER_SUPPLY = maxPresaleNftSupply;
        REVEAL_TIMESTAMP = saleStart;
    }


    /**
     * Set some Flowers aside for giveaways and promotions
     */
    function reserveFlowers() public onlyOwner {        
        uint supply = totalSupply()+1;
        uint i;
        for (i = 0; i < 120; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    /**
     * DM Samii in Discord that you're standing right behind him.
     */
    function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner {
        REVEAL_TIMESTAMP = revealTimeStamp;
    } 

    /*     
    * Set provenance once it's calculated
    */
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        GGLSD_PROVENANCE = provenanceHash;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }

    /*
    * Pause sale if active, make active if paused
    */
    function flipSaleState() public onlyOwner {
        presaleIsActive = false;
        saleIsActive = !saleIsActive;
    }

    /*
    * Pause sale if active, make active if paused
    */
    function flipPreSaleState() public onlyOwner {
        saleIsActive = false;
        presaleIsActive = !presaleIsActive;
    }
    /**
    * Mints Self Rising Flowers
    */
    function mintFlower(uint numberOfTokens) public payable {
        require(saleIsActive || presaleIsActive, "Sale must be active to mint Flowers");
        if(presaleIsActive && !saleIsActive){
            require(isWhitelisted(msg.sender),"Must be Whitelisted to mint before September 15, 2021 7:00:00 PM GMT");
            require(totalSupply().add(numberOfTokens) <= MAX_PRESALE_FLOWER_SUPPLY, "Purchase would exceed pre-sale max supply of 3000 Flowers");
        }
        require(numberOfTokens <= maxFlowerPurchase, "Can only mint 20 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_FLOWER_SUPPLY, "Purchase would exceed max supply of 12000 Flowers");
        require(flowerPrice.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply()+1;
            if (totalSupply() <= MAX_FLOWER_SUPPLY) {
                _safeMint(msg.sender, mintIndex);
            }
        }

        // If we haven't set the starting index and this is either 1) the last saleable token or 2) the first token to be sold after
        // the end of pre-sale, set the starting index block
        if (startingIndexBlock == 0 && (totalSupply() == MAX_FLOWER_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
            startingIndexBlock = block.number;
        } 
    }

    /**
     * Set the starting index for the collection
     */
    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");
        
        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_FLOWER_SUPPLY;
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if (block.number.sub(startingIndexBlock) > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_FLOWER_SUPPLY;
        }
        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex.add(1);
        }
    }

    /**
     * Set the starting index block for the collection, essentially unblocking
     * setting starting index
     */
    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        
        startingIndexBlock = block.number;
    }
}

File 1 of 18: Address.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 18: Context.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity >=0.6.0 <0.8.0;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 18: EnumerableMap.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/EnumerableMap.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

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

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

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

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

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

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

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

   /**
    * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

File 4 of 18: EnumerableSet.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/EnumerableSet.sol



pragma solidity >=0.6.0 <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.
 */
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;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            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] = toDeleteIndex + 1; // All indexes are 1-based

            // 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) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

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

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


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

File 5 of 18: ERC165.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/introspection/ERC165.sol



pragma solidity >=0.6.0 <0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

File 6 of 18: ERC721.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";
import "./ERC165.sol";
import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./IERC721Receiver.sol";
import "./SafeMath.sol";
import "./Address.sol";
import "./EnumerableSet.sol";
import "./EnumerableMap.sol";
import "./Strings.sol";

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _holderTokens[owner].length();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

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

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }

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

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

File 8 of 18: IERC165.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/introspection/IERC165.sol



pragma solidity >=0.6.0 <0.8.0;

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

File 9 of 18: IERC721.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity >=0.6.2 <0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 18: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol



pragma solidity >=0.6.2 <0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 11 of 18: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol



pragma solidity >=0.6.2 <0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

File 12 of 18: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity >=0.6.0 <0.8.0;

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

File 13 of 18: Migrations.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

contract Migrations {
  address public owner = msg.sender;
  uint public last_completed_migration;

  modifier restricted() {
    require(
      msg.sender == owner,
      "This function is restricted to the contract's owner"
    );
    _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

File 14 of 18: Ownable.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 15 of 18: PaymentSplitter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import "./Address.sol";
import "./Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

File 16 of 18: SafeMath.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 17 of 18: Strings.sol
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity >=0.6.0 <0.8.0;

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

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

File 18 of 18: Whitelist.sol
pragma solidity ^0.7.0;
import "./Ownable.sol";

contract Whitelist is Ownable {
    mapping(address => bool) whitelist;
    event AddedToWhitelist(address indexed account);
    event RemovedFromWhitelist(address indexed account);

    modifier onlyWhitelisted() {
        require(isWhitelisted(msg.sender));
        _;
    }

    /// constructor called at deploy time
    constructor(address[] memory wl_addrs) {
        //wlcount = wl_addrs.length;

        for (uint i = 0; i < wl_addrs.length; i++) {
            // loop over wl_addrs and update set of whitelisted accounts
            address _address = wl_addrs[i];
            whitelist[_address] = true;
        }
    }

    function add(address _address) public onlyOwner {
        whitelist[_address] = true;
        emit AddedToWhitelist(_address);
    }

    function remove(address _address) public onlyOwner {
        whitelist[_address] = false;
        emit RemovedFromWhitelist(_address);
    }

    function isWhitelisted(address _address) public view returns(bool) {
        return whitelist[_address];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxNftSupply","type":"uint256"},{"internalType":"uint256","name":"maxPresaleNftSupply","type":"uint256"},{"internalType":"uint256","name":"saleStart","type":"uint256"},{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"},{"internalType":"address[]","name":"wl_addrs","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GGLSD_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FLOWER_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE_FLOWER_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flowerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFlowerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintFlower","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"remove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveFlowers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTimeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260405180602001604052806000815250601190805190602001906200002b92919062000ad7565b506000601660006101000a81548160ff0219169083151502179055506000601660016101000a81548160ff0219169083151502179055503480156200006f57600080fd5b5060405162005bb338038062005bb383398181016040526101008110156200009657600080fd5b8101908080516040519392919084640100000000821115620000b757600080fd5b83820191506020820185811115620000ce57600080fd5b8251866001820283011164010000000082111715620000ec57600080fd5b8083526020830192505050908051906020019080838360005b838110156200012257808201518184015260208101905062000105565b50505050905090810190601f168015620001505780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200017457600080fd5b838201915060208201858111156200018b57600080fd5b8251866001820283011164010000000082111715620001a957600080fd5b8083526020830192505050908051906020019080838360005b83811015620001df578082015181840152602081019050620001c2565b50505050905090810190601f1680156200020d5780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200024f57600080fd5b838201915060208201858111156200026657600080fd5b82518660208202830111640100000000821117156200028457600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620002bd578082015181840152602081019050620002a0565b5050505090500160405260200180516040519392919084640100000000821115620002e757600080fd5b83820191506020820185811115620002fe57600080fd5b82518660208202830111640100000000821117156200031c57600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200035557808201518184015260208101905062000338565b50505050905001604052602001805160405193929190846401000000008211156200037f57600080fd5b838201915060208201858111156200039657600080fd5b8251866020820283011164010000000082111715620003b457600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620003ed578082015181840152602081019050620003d0565b505050509050016040525050508083838a8a620004176301ffc9a760e01b6200072260201b60201c565b81600690805190602001906200042f92919062000ad7565b5080600790805190602001906200044892919062000ad7565b50620004616380ac58cd60e01b6200072260201b60201c565b62000479635b5e139f60e01b6200072260201b60201c565b6200049163780e9d6360e01b6200072260201b60201c565b50506000620004a56200082b60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508051825114620005a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018062005b566032913960400191505060405180910390fd5b600082511162000618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5061796d656e7453706c69747465723a206e6f2070617965657300000000000081525060200191505060405180910390fd5b60005b82518110156200066d576200065f8382815181106200063657fe5b60200260200101518383815181106200064b57fe5b60200260200101516200083360201b60201c565b80806001019150506200061b565b50505060005b8151811015620006fd5760008282815181106200068c57fe5b602002602001015190506001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050808060010191505062000673565b5050856014819055508460158190555083601781905550505050505050505062000b7d565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620007bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620008bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018062005b2a602c913960400191505060405180910390fd5b6000811162000932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5061796d656e7453706c69747465723a2073686172657320617265203000000081525060200191505060405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620009cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018062005b88602b913960400191505060405180910390fd5b600f829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5401600b819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac8282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000b1a57805160ff191683800117855562000b4b565b8280016001018555821562000b4b579182015b8281111562000b4a57825182559160200191906001019062000b2d565b5b50905062000b5a919062000b5e565b5090565b5b8082111562000b7957600081600090555060010162000b5f565b5090565b614f9d8062000b8d6000396000f3fe6080604052600436106102975760003560e01c80636352211e1161015a578063c87b56dd116100c1578063e98665501161007a578063e98665501461124f578063eb8d244414611266578063f032554914611293578063f12e6652146112aa578063f2fde38b146112c1578063f7a3951114611312576102fa565b8063c87b56dd1461102e578063cb774d47146110e2578063ce7c2ac21461110d578063e33b7de314611172578063e36d64981461119d578063e985e9c5146111c8576102fa565b80638da5cb5b116101135780638da5cb5b14610cf9578063948fd9fa14610d3a57806395d89b4114610dca5780639852595c14610e5a578063a22cb46514610ebf578063b88d4fde14610f1c576102fa565b80636352211e14610b0c5780636c0360eb14610b7157806370a0823114610c01578063715018a614610c665780637d17fcbe14610c7d5780638b83209b14610c94576102fa565b806329092d0e116101fe5780633af32abf116101b75780633af32abf146108bd57806342842e0e146109245780634342ed551461099f5780634f6ccce7146109ca57806355f804b314610a195780636129652d14610ae1576102fa565b806329092d0e146107605780632af86c7b146107b15780632f745c59146107df57806330f72cd41461084e57806334918dfd1461087b5780633a98ef3914610892576102fa565b80631096952311610250578063109695231461054b57806318160ddd1461061357806318e20a381461063e578063191655871461066957806323b872dd146106ba57806325c86a9b14610735576102fa565b8063018a2c37146102ff57806301ffc9a71461033a57806306fdde03146103aa578063081812fc1461043a578063095ea7b31461049f5780630a3b0a4f146104fa576102fa565b366102fa577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102c561133d565b34604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1005b600080fd5b34801561030b57600080fd5b506103386004803603602081101561032257600080fd5b8101908080359060200190929190505050611345565b005b34801561034657600080fd5b506103926004803603602081101561035d57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506113fe565b60405180821515815260200191505060405180910390f35b3480156103b657600080fd5b506103bf611465565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ff5780820151818401526020810190506103e4565b50505050905090810190601f16801561042c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044657600080fd5b506104736004803603602081101561045d57600080fd5b8101908080359060200190929190505050611507565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104ab57600080fd5b506104f8600480360360408110156104c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115a2565b005b34801561050657600080fd5b506105496004803603602081101561051d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116e6565b005b34801561055757600080fd5b506106116004803603602081101561056e57600080fd5b810190808035906020019064010000000081111561058b57600080fd5b82018360208201111561059d57600080fd5b803590602001918460018302840111640100000000831117156105bf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611833565b005b34801561061f57600080fd5b506106286118fc565b6040518082815260200191505060405180910390f35b34801561064a57600080fd5b5061065361190d565b6040518082815260200191505060405180910390f35b34801561067557600080fd5b506106b86004803603602081101561068c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611913565b005b3480156106c657600080fd5b50610733600480360360608110156106dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b94565b005b34801561074157600080fd5b5061074a611c0a565b6040518082815260200191505060405180910390f35b34801561076c57600080fd5b506107af6004803603602081101561078357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c10565b005b6107dd600480360360208110156107c757600080fd5b8101908080359060200190929190505050611d5d565b005b3480156107eb57600080fd5b506108386004803603604081101561080257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120b2565b6040518082815260200191505060405180910390f35b34801561085a57600080fd5b5061086361210d565b60405180821515815260200191505060405180910390f35b34801561088757600080fd5b50610890612120565b005b34801561089e57600080fd5b506108a7612216565b6040518082815260200191505060405180910390f35b3480156108c957600080fd5b5061090c600480360360208110156108e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612220565b60405180821515815260200191505060405180910390f35b34801561093057600080fd5b5061099d6004803603606081101561094757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612276565b005b3480156109ab57600080fd5b506109b4612296565b6040518082815260200191505060405180910390f35b3480156109d657600080fd5b50610a03600480360360208110156109ed57600080fd5b810190808035906020019092919050505061229c565b6040518082815260200191505060405180910390f35b348015610a2557600080fd5b50610adf60048036036020811015610a3c57600080fd5b8101908080359060200190640100000000811115610a5957600080fd5b820183602082011115610a6b57600080fd5b80359060200191846001830284011164010000000083111715610a8d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506122bf565b005b348015610aed57600080fd5b50610af661237a565b6040518082815260200191505060405180910390f35b348015610b1857600080fd5b50610b4560048036036020811015610b2f57600080fd5b810190808035906020019092919050505061237f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b7d57600080fd5b50610b866123b6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc6578082015181840152602081019050610bab565b50505050905090810190601f168015610bf35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c0d57600080fd5b50610c5060048036036020811015610c2457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612458565b6040518082815260200191505060405180910390f35b348015610c7257600080fd5b50610c7b61252d565b005b348015610c8957600080fd5b50610c9261269d565b005b348015610ca057600080fd5b50610ccd60048036036020811015610cb757600080fd5b81019080803590602001909291905050506127cd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d0557600080fd5b50610d0e61280e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d4657600080fd5b50610d4f612838565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d8f578082015181840152602081019050610d74565b50505050905090810190601f168015610dbc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dd657600080fd5b50610ddf6128d6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1f578082015181840152602081019050610e04565b50505050905090810190601f168015610e4c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6657600080fd5b50610ea960048036036020811015610e7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612978565b6040518082815260200191505060405180910390f35b348015610ecb57600080fd5b50610f1a60048036036040811015610ee257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129c1565b005b348015610f2857600080fd5b5061102c60048036036080811015610f3f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fa657600080fd5b820183602082011115610fb857600080fd5b80359060200191846001830284011164010000000083111715610fda57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612b77565b005b34801561103a57600080fd5b506110676004803603602081101561105157600080fd5b8101908080359060200190929190505050612bef565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110a757808201518184015260208101905061108c565b50505050905090810190601f1680156110d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156110ee57600080fd5b506110f7612ec0565b6040518082815260200191505060405180910390f35b34801561111957600080fd5b5061115c6004803603602081101561113057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ec6565b6040518082815260200191505060405180910390f35b34801561117e57600080fd5b50611187612f0f565b6040518082815260200191505060405180910390f35b3480156111a957600080fd5b506111b2612f19565b6040518082815260200191505060405180910390f35b3480156111d457600080fd5b50611237600480360360408110156111eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f1f565b60405180821515815260200191505060405180910390f35b34801561125b57600080fd5b50611264612fb3565b005b34801561127257600080fd5b5061127b61311d565b60405180821515815260200191505060405180910390f35b34801561129f57600080fd5b506112a8613130565b005b3480156112b657600080fd5b506112bf613226565b005b3480156112cd57600080fd5b50611310600480360360208110156112e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061330d565b005b34801561131e57600080fd5b50611327613502565b6040518082815260200191505060405180910390f35b600033905090565b61134d61133d565b73ffffffffffffffffffffffffffffffffffffffff1661136b61280e565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060178190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114fd5780601f106114d2576101008083540402835291602001916114fd565b820191906000526020600020905b8154815290600101906020018083116114e057829003601f168201915b5050505050905090565b60006115128261350d565b611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614e6f602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006115ad8261237f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611634576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ef36021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661165361133d565b73ffffffffffffffffffffffffffffffffffffffff16148061168257506116818161167c61133d565b612f1f565b5b6116d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180614d5d6038913960400191505060405180910390fd5b6116e1838361352a565b505050565b6116ee61133d565b73ffffffffffffffffffffffffffffffffffffffff1661170c61280e565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab0360405160405180910390a250565b61183b61133d565b73ffffffffffffffffffffffffffffffffffffffff1661185961280e565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601190805190602001906118f8929190614ab9565b5050565b600061190860026135e3565b905090565b60175481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116119ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c0a6026913960400191505060405180910390fd5b6000600c54470190506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054840281611a4257fe5b040390506000811415611aa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614d11602b913960400191505060405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c5401600c81905550611b3a83826135f8565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505050565b611ba5611b9f61133d565b82613732565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614f146031913960400191505060405180910390fd5b611c05838383613826565b505050565b60145481565b611c1861133d565b73ffffffffffffffffffffffffffffffffffffffff16611c3661280e565b73ffffffffffffffffffffffffffffffffffffffff1614611cbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df75760405160405180910390a250565b601660009054906101000a900460ff1680611d845750601660019054906101000a900460ff165b611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f456023913960400191505060405180910390fd5b601660019054906101000a900460ff168015611e025750601660009054906101000a900460ff16155b15611eda57611e1033612220565b611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526044815260200180614d956044913960600191505060405180910390fd5b601554611e8282611e746118fc565b613a6990919063ffffffff16565b1115611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180614bd16039913960400191505060405180910390fd5b5b6014811115611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d3c6021913960400191505060405180910390fd5b601454611f5182611f436118fc565b613a6990919063ffffffff16565b1115611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614cb46031913960400191505060405180910390fd5b34611fc38266b1a2bc2ec50000613af190919063ffffffff16565b1115612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b8181101561207a576000600161204e6118fc565b01905060145461205c6118fc565b1161206c5761206b3382613b77565b5b50808060010191505061203a565b5060006012541480156120a257506014546120936118fc565b14806120a157506017544210155b5b156120af57436012819055505b50565b600061210582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613b9590919063ffffffff16565b905092915050565b601660019054906101000a900460ff1681565b61212861133d565b73ffffffffffffffffffffffffffffffffffffffff1661214661280e565b73ffffffffffffffffffffffffffffffffffffffff16146121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601660016101000a81548160ff021916908315150217905550601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b6000600b54905090565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61229183838360405180602001604052806000815250612b77565b505050565b60155481565b6000806122b3836002613baf90919063ffffffff16565b50905080915050919050565b6122c761133d565b73ffffffffffffffffffffffffffffffffffffffff166122e561280e565b73ffffffffffffffffffffffffffffffffffffffff161461236e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61237781613bdb565b50565b601481565b60006123af82604051806060016040528060298152602001614e03602991396002613bf59092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561244e5780601f106124235761010080835404028352916020019161244e565b820191906000526020600020905b81548152906001019060200180831161243157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614dd9602a913960400191505060405180910390fd5b612526600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613c14565b9050919050565b61253561133d565b73ffffffffffffffffffffffffffffffffffffffff1661255361280e565b73ffffffffffffffffffffffffffffffffffffffff16146125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6126a561133d565b73ffffffffffffffffffffffffffffffffffffffff166126c361280e565b73ffffffffffffffffffffffffffffffffffffffff161461274c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601354146127c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b43601281905550565b6000600f82815481106127dc57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60118054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128ce5780601f106128a3576101008083540402835291602001916128ce565b820191906000526020600020905b8154815290600101906020018083116128b157829003601f168201915b505050505081565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561296e5780601f106129435761010080835404028352916020019161296e565b820191906000526020600020905b81548152906001019060200180831161295157829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129c961133d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000612a7761133d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612b2461133d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b612b88612b8261133d565b83613732565b612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614f146031913960400191505060405180910390fd5b612be984848484613c29565b50505050565b6060612bfa8261350d565b612c4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614ec4602f913960400191505060405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cf85780601f10612ccd57610100808354040283529160200191612cf8565b820191906000526020600020905b815481529060010190602001808311612cdb57829003601f168201915b505050505090506060612d096123b6565b9050600081511415612d1f578192505050612ebb565b600082511115612df05780826040516020018083805190602001908083835b60208310612d615780518252602082019150602081019050602083039250612d3e565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612db25780518252602082019150602081019050602083039250612d8f565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612ebb565b80612dfa85613c9b565b6040516020018083805190602001908083835b60208310612e305780518252602082019150602081019050602083039250612e0d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612e815780518252602082019150602081019050602083039250612e5e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b60135481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c54905090565b60125481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006013541461302b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b600060125414156130a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5374617274696e6720696e64657820626c6f636b206d7573742062652073657481525060200191505060405180910390fd5b6014546012544060001c816130b557fe5b0660138190555060ff6130d360125443613de290919063ffffffff16565b11156130f357601454600143034060001c816130eb57fe5b066013819055505b6000601354141561311b576131146001601354613a6990919063ffffffff16565b6013819055505b565b601660009054906101000a900460ff1681565b61313861133d565b73ffffffffffffffffffffffffffffffffffffffff1661315661280e565b73ffffffffffffffffffffffffffffffffffffffff16146131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601660006101000a81548160ff021916908315150217905550601660019054906101000a900460ff1615601660016101000a81548160ff021916908315150217905550565b61322e61133d565b73ffffffffffffffffffffffffffffffffffffffff1661324c61280e565b73ffffffffffffffffffffffffffffffffffffffff16146132d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060016132e16118fc565b01905060005b6078811015613309576132fc33828401613b77565b80806001019150506132e7565b5050565b61331561133d565b73ffffffffffffffffffffffffffffffffffffffff1661333361280e565b73ffffffffffffffffffffffffffffffffffffffff16146133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613442576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614bab6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b66b1a2bc2ec5000081565b6000613523826002613e6590919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661359d8361237f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006135f182600001613e7f565b9050919050565b8047101561366e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d80600081146136ce576040519150601f19603f3d011682016040523d82523d6000602084013e6136d3565b606091505b505090508061372d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614c54603a913960400191505060405180910390fd5b505050565b600061373d8261350d565b613792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ce5602c913960400191505060405180910390fd5b600061379d8361237f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061380c57508373ffffffffffffffffffffffffffffffffffffffff166137f484611507565b73ffffffffffffffffffffffffffffffffffffffff16145b8061381d575061381c8185612f1f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166138468261237f565b73ffffffffffffffffffffffffffffffffffffffff16146138b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614e9b6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613938576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614c306024913960400191505060405180910390fd5b613943838383613e90565b61394e60008261352a565b61399f81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613e9590919063ffffffff16565b506139f181600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613eaf90919063ffffffff16565b50613a0881836002613ec99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015613ae7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415613b045760009050613b71565b6000828402905082848281613b1557fe5b0414613b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614e4e6021913960400191505060405180910390fd5b809150505b92915050565b613b91828260405180602001604052806000815250613efe565b5050565b6000613ba48360000183613f6f565b60001c905092915050565b600080600080613bc28660000186613ff2565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190613bf1929190614ab9565b5050565b6000613c08846000018460001b8461408b565b60001c90509392505050565b6000613c2282600001614181565b9050919050565b613c34848484613826565b613c4084848484614192565b613c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180614b796032913960400191505060405180910390fd5b50505050565b60606000821415613ce3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ddd565b600082905060005b60008214613d0d578080600101915050600a8281613d0557fe5b049150613ceb565b60608167ffffffffffffffff81118015613d2657600080fd5b506040519080825280601f01601f191660200182016040528015613d595781602001600182028036833780820191505090505b50905060006001830390508593505b60008414613dd557600a8481613d7a57fe5b0660300160f81b82828060019003935081518110613d9457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481613dcd57fe5b049350613d68565b819450505050505b919050565b600082821115613e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000613e77836000018360001b6143ab565b905092915050565b600081600001805490509050919050565b505050565b6000613ea7836000018360001b6143ce565b905092915050565b6000613ec1836000018360001b6144b6565b905092915050565b6000613ef5846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b614526565b90509392505050565b613f088383614602565b613f156000848484614192565b613f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180614b796032913960400191505060405180910390fd5b505050565b600081836000018054905011613fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614b576022913960400191505060405180910390fd5b826000018281548110613fdf57fe5b9060005260206000200154905092915050565b60008082846000018054905011614054576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e2c6022913960400191505060405180910390fd5b600084600001848154811061406557fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390614152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141175780820151818401526020810190506140fc565b50505050905090810190601f1680156141445780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061416557fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006141b38473ffffffffffffffffffffffffffffffffffffffff166147f6565b6141c057600190506143a3565b606061432a63150b7a0260e01b6141d561133d565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561425957808201518184015260208101905061423e565b50505050905090810190601f1680156142865780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614b79603291398773ffffffffffffffffffffffffffffffffffffffff166148099092919063ffffffff16565b9050600081806020019051602081101561434357600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146144aa576000600182039050600060018660000180549050039050600086600001828154811061441957fe5b906000526020600020015490508087600001848154811061443657fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061446e57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506144b0565b60009150505b92915050565b60006144c28383614821565b61451b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614520565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156145cd578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506145fb565b828560000160018303815481106145e057fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156146a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6146ae8161350d565b15614721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b61472d60008383613e90565b61477e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613eaf90919063ffffffff16565b5061479581836002613ec99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606148188484600085614844565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561489f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c8e6026913960400191505060405180910390fd5b6148a8856147f6565b61491a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061496a5780518252602082019150602081019050602083039250614947565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146149cc576040519150601f19603f3d011682016040523d82523d6000602084013e6149d1565b606091505b50915091506149e18282866149ed565b92505050949350505050565b606083156149fd57829050614ab2565b600083511115614a105782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a77578082015181840152602081019050614a5c565b50505050905090810190601f168015614aa45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614afa57805160ff1916838001178555614b28565b82800160010185558215614b28579182015b82811115614b27578251825591602001919060010190614b0c565b5b509050614b359190614b39565b5090565b5b80821115614b52576000816000905550600101614b3a565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373507572636861736520776f756c6420657863656564207072652d73616c65206d617820737570706c79206f66203330303020466c6f776572735061796d656e7453706c69747465723a206163636f756e7420686173206e6f207368617265734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c507572636861736520776f756c6420657863656564206d617820737570706c79206f6620313230303020466c6f776572734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e5061796d656e7453706c69747465723a206163636f756e74206973206e6f7420647565207061796d656e7443616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4d7573742062652057686974656c697374656420746f206d696e74206265666f72652053657074656d6265722031352c203230323120373a30303a303020504d20474d544552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656453616c65206d7573742062652061637469766520746f206d696e7420466c6f77657273a2646970667358221220f07c224ba4690ef6c2b93b64cddc948ed5c9c47222b12160de3a04a63240ec4364736f6c634300070000335061796d656e7453706c69747465723a206163636f756e7420697320746865207a65726f20616464726573735061796d656e7453706c69747465723a2070617965657320616e6420736861726573206c656e677468206d69736d617463685061796d656e7453706c69747465723a206163636f756e7420616c72656164792068617320736861726573000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000f476967612047617264656e204c53440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000547474c53440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000dcabf4fb1d7594eacb014d48e3674857f806f4b200000000000000000000000056cc222791c8e0d048b6dd42a7d3ef273afe55b2000000000000000000000000741e50151a7ed552944b15f91ec26d3df85c824f000000000000000000000000d88d4f99adc42a57e5949c94fdd984f43811f34400000000000000000000000006b0b7f01c484765f799269edd7763e9ae222f320000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091d00000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005dd00000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000dcabf4fb1d7594eacb014d48e3674857f806f4b200000000000000000000000056cc222791c8e0d048b6dd42a7d3ef273afe55b2000000000000000000000000741e50151a7ed552944b15f91ec26d3df85c824f000000000000000000000000d88d4f99adc42a57e5949c94fdd984f43811f34400000000000000000000000006b0b7f01c484765f799269edd7763e9ae222f320000000000000000000000008b078d0cc0f3b67f18c0877cc20519b04a427abe0000000000000000000000007d2cb6e5f16b40218a1e7430cebbe22ef9692dd8000000000000000000000000f9b1883bc447d910fc5fab7be15cbe866b9d1a7d0000000000000000000000009dbdad4abcc48610b22d56a6bdd1aa7f97171b06000000000000000000000000bc85df2bd72d3b517eca1ab81a9c0384198b0f2700000000000000000000000041db21d03a79663d74d35d1a87f7536b99e1c0060000000000000000000000004fd0ff2c49671d4fe1927371cf833e8b3b7f44ea00000000000000000000000095fc44504f26cf8e236fa4e3565062067f88949900000000000000000000000018ee97c69db02434a7117c48bcbd8811041217b0000000000000000000000000c50d334477fd730af3d4c5fb0be83c5ad26be55900000000000000000000000077e89101435909894e827469c5bc1614aef63392000000000000000000000000396f8cda2825abb6d0c37e631bad4ca01b24d2d300000000000000000000000050e11e5f1ce3c06807a6775953f340af3dc503e9000000000000000000000000bb37a3db0deadb3c56e145a287862b157aaa6b11000000000000000000000000ddbe93624c94179ee63b7bcf9548b3b236d35b14000000000000000000000000ac93f8882c36ee9f8948d493d6ff5b890909665d000000000000000000000000ee893a5a1c08f777daf8ff4ebce337314c64a6080000000000000000000000000cc52fbabb479d47e1ea6942494817900a237d9f000000000000000000000000b0d41697b86a05552e8f60385786fea4a34e0164000000000000000000000000f10944d1460c3820fb2e144cfd6c3426b5edc53300000000000000000000000062e8698b3f23b60ce805fdd7c7e9dbc9bfd5432f00000000000000000000000049594fb73a7912bc6da5d33a1060aca029907086000000000000000000000000df7d9cbc400ddd54a3f17a064d3418dc722b351a00000000000000000000000002306c88829cbd1f4e7d23f371ec5c727f8b330c00000000000000000000000044820743db5ccecf4187078b829a9a48d7d0e74b000000000000000000000000a3981a37d2f09b9c98e2877f3e85712bffaa1763000000000000000000000000c567ee384df678b217a28897e0d1e4b944624e120000000000000000000000000ab42c0ecaf214f30ecc0ffdd5a95334486a95110000000000000000000000005722387e2950a8e8b8674d8c5de18d60bbb59f63000000000000000000000000375c8be95978bd235420150281ce1a77c8aece09000000000000000000000000a548d95378ec16e000563d89684c64869f72bc0d000000000000000000000000ccdbe8126e7dee6e929b1b2b89df0b1594997f71000000000000000000000000f4a832467cb94d22bbb35a9bf190db0eb3f21e500000000000000000000000002d57f839cf5748d84710ec291c1cf3815e9d007400000000000000000000000096834d7fe50992fde54fa01fb8c9e920293758ba000000000000000000000000cd8ebc8a7a8515af18b189f3d7b1edb9223132100000000000000000000000005f390341786ca439cdf46a3d1536ff4af1996849000000000000000000000000b434b6a4403ee92b0728c0d1cb19855db406af30000000000000000000000000e80f14b99a6bd243d28cfb7755626c4d12a1d40600000000000000000000000068abb61e97ffd7c59d6112c01c622e76187c26ff0000000000000000000000001dbaf3ca1bcd41f583e93312415bf051264c2edb0000000000000000000000001a43003a06d80aa51bdc5054e4572841f122335c00000000000000000000000017912235ad7cd9b5fb728a2e0b99ca7e614c692f0000000000000000000000001f16a9106b2ef346ac1748d8dc9c7f088847f6940000000000000000000000005973341ef216a81e6c75c97a35584d2cbd25a90c000000000000000000000000c2690edde996e5c56c9b7fafcdbdf257a780446b000000000000000000000000d0f143bcaeb57acb878cac0d6062b9ed910c4af900000000000000000000000036e8c0edb5b0d82960cfffd9882cb6d781f0e25f00000000000000000000000088921288945d62865721f0ce8b1d26638939e95f000000000000000000000000f653281a02d178e0dbfe165ecca8c434bd0c0171000000000000000000000000954d65e5310607e12f93f6156de92cd37ffcae8e000000000000000000000000954d65e5310607e12f93f6156de92cd37ffcae8e000000000000000000000000430fdebb78eed8df7bcbf28e3fbd0560cc9e2edc00000000000000000000000085a58fd890507331a1620c7329e5b61089954699000000000000000000000000c51ee0269b665cabb2337450f8b48798817e951f000000000000000000000000362a42b2764ebbfdad9a9dfdf39ca98efdce11e80000000000000000000000001ad441f983aa12f20c192e0deabbcb303c3ab0a100000000000000000000000071829dd36d8061ac32104bce3eed90609eb7a4d200000000000000000000000022b0e277e5348c406eb6ec9c82b379bc82c2392200000000000000000000000036fa11f6715a5e440871f531030ee4e94d7b9309000000000000000000000000a11f607aea1b450015ac1e610d083ca56b7eeb000000000000000000000000008905ee4bc06c5b6db46ca90ec9bab73b6201c0e40000000000000000000000007857af41cb171cc97d24f5a7c01182474de9a273000000000000000000000000288e55b2f3af18e051b3d4840c04b24c40867e32000000000000000000000000f11989b14e4ff171a5a503c2180a7c440c6eec0b000000000000000000000000a94783af0f03cd8287b8027ca6d8d7c093cccede0000000000000000000000005b4eee9b83a57bc1dc071b5d7683b0545a414a66000000000000000000000000f4cdb62c9a66c749cdf736c43e96ff11d2bab444000000000000000000000000bd9a849f87ff89ac0cb451b2065d227b6e279a6a000000000000000000000000512c579153ac6fd961a7d9e7b19281b855aafbe100000000000000000000000026db774e3c5ed9d8930e89aadd598cb6e498d369000000000000000000000000e670f0369d0a7bc7ea89d06bcd7174df4be7eb16000000000000000000000000174cc60fccb27c0571c9dfc2f2554be908e1051f000000000000000000000000cedad2cd7d2d92ae2193b68c635088fa3b41e121000000000000000000000000fb054de87c048fe9f9d859afe6059d023529e0d800000000000000000000000052aee9cb5d4bd2d4bbdbf07ae43b6bb6a4c6c39c00000000000000000000000090a1a5f30a96c6a0dd540937a687c3c46717b60c0000000000000000000000002e150ff74e83911dc2adf3655cf1e5e076ceaf8e000000000000000000000000e063b992c6a49c7f065b80acd4830b9cc1f8cd6e000000000000000000000000dd2e8ed7152454078142832b4f95cabdcfa73f610000000000000000000000005ce0bb138678e7e56bd6e880269f2bf381ffaeaa000000000000000000000000a1a134bda79f8cb9c3c5e419e88a85a2a97b0917000000000000000000000000fa508baa5681b2d4790b65775c8aec3eaf4d17da0000000000000000000000007767037ade89dc4f56d3188da15ea189c2674f360000000000000000000000004ab86ea57cf7094d4e73ed22f8d5c972e8528df50000000000000000000000009d717a001fa283c708be47bb5c3a55a3bcaa80f10000000000000000000000007baa14047c6cd9547259d0bac3c58715e7f2cf1f0000000000000000000000005aaa21a358fffebc62165a1d28158341fa8833b50000000000000000000000009d76aa87b9f58b6a3b4a74649cb9e435347c08c1000000000000000000000000ff6bf8ec2fea016fc8ff568d744e293aff865bbc00000000000000000000000074878265074d4629b9b1c09d2cc6e5cd3a9d1048000000000000000000000000a4007bcfc6c4dfe27ba379805c43f8eb5599d49500000000000000000000000027018caa7ac03db78377c742921a6a29fec63e65000000000000000000000000d6e2fdcac495c42e69775b076a56ca96d3c27d60000000000000000000000000a17e9a24ee2e93373da56d80dfd8b16649c83ff7000000000000000000000000facc9e25e2cb511a51e980e2d0bec5fe6c62868e00000000000000000000000045a3e501aa7989363a64ee29e443f228e556d55000000000000000000000000050a354f9edaa453d59ffe1f88096b3b8225e7afe000000000000000000000000939dc788a1902cf04788e6cc993fa4ef88400ce0000000000000000000000000e6c11554a5de57d577cadf7d3e19891ababe113000000000000000000000000037254a14ecf158e7f7895852e7ba2eaa7b33f93e000000000000000000000000b780e820fe467b448951d46927f9e73b8f7dfc0f00000000000000000000000093659ddd36735850713a8c9b5c461760ffe35b8200000000000000000000000085affb0c85e05ee94d25f73e32ced8cb64de173100000000000000000000000089bb950117e9cec77846e998e7796ab1c8cb036b00000000000000000000000044820743db5ccecf4187078b829a9a48d7d0e74b00000000000000000000000068abb61e97ffd7c59d6112c01c622e76187c26ff00000000000000000000000016ce6c6662510faf7c34bb1406fd8c20641db9e3000000000000000000000000800ebacd1971ed9c50ae9b9412a78fe824bd31b600000000000000000000000042506784677291ec7067b6180d941e347a55f87300000000000000000000000006663f0d090d6556ba2074b482671f5e68a2da49000000000000000000000000b4b81b693f322f6dadac99c9de4366970e99f6d8000000000000000000000000cb02519c9690e91f05a6ca545840ad27af462d9500000000000000000000000024e4fe3d90e61d1dc25ff5417862d12c479c62ad0000000000000000000000001d75769197091ccfe87a4a757fed7e44723996d8000000000000000000000000a4f8167706aaf9b0dfde893bea161aba4ea5784e000000000000000000000000915a1f0ea39346750eee46cbec9cb8459a6fa1ea00000000000000000000000031aba29b2a7ef003a280b42638ebf4d223852e920000000000000000000000004d0c5acfb9c448cb5dd869d9e6e5697aa2a12ec5000000000000000000000000021699aaf005dabd166bf803c65fc90529fcff4a000000000000000000000000ecd8c7abae05083c7bf368e022a311c24a11870f000000000000000000000000fda8d5f35dd80e094267ec0ef652e90c2a009ddf0000000000000000000000009e4f28fe6157cfabc9345ac1439ffbb6e42b4cac0000000000000000000000000fbab48c0f2756b526590bdd63edcf8ea4efaacf0000000000000000000000006199f8b551af1a3aaf9dc12a0491d919992822160000000000000000000000008716f73d87d5972cbc0ad0fa38f09e48aeaa14160000000000000000000000008ceca142d8ca90f797b755c81ab202eaae619b7900000000000000000000000015e97e9d9e5ac247bbfae4e7e39c634ba60e610f00000000000000000000000003602b0441be635b8d2f007e6840dcfc981f42de000000000000000000000000bca7549b4a9867e8053f966739a08a46eb6cbad40000000000000000000000004a4bf2fc2a03f0e26b0535e1f59f67db3cf22003000000000000000000000000504fc4d9ce662fa08dede68edf75ffb61707b977000000000000000000000000e5db379fc625079fc54e66a39b4e7392fde525bd000000000000000000000000d44f9db7c700aecc2b735ed2b2eb9463f8a494e400000000000000000000000011be585b694b35a1cbe9982b2b4e162088b0b89d000000000000000000000000710d7d662978b842210c12766048172b5fb0ab91000000000000000000000000a5a33c910600c2612db4a78a0c0d553b424c230c000000000000000000000000f36987d2f01d9a0356a974018ef8fb834bf9ceb3000000000000000000000000a3981a37d2f09b9c98e2877f3e85712bffaa1763000000000000000000000000e136b2d9f1371cbca11b9c40699e47852de277460000000000000000000000005e3bb9ffa698ae15672b03f38e8e562104b86755000000000000000000000000452bc1d9f91d35954e7e14d8527f7a5a9b26c0b3000000000000000000000000e3ea13fcbd6dfc8e6be836afd577f81197b80b3800000000000000000000000011b4405c2b05d94757091f018a3fa5327f11665b000000000000000000000000152fe4daa4a1b3c0de88a56961f4defc9c6efeee0000000000000000000000002e5199b46f1d8f2b9ddc02db7edad90805a82896000000000000000000000000b284f19ffa703daadf6745d3c655f309d17370a5000000000000000000000000f879067ea603af3a264031a8478a62498983f53b0000000000000000000000005022cf478c7124d508ab4a304946cb4fa3d9c39e0000000000000000000000002ccc5e98e7ce96321752beb10eb3f8b8af5efcf70000000000000000000000000d3ef24ccd12827cce51bca43cf9efb78380429c000000000000000000000000e7c8906083c8dcbc3e76cc2d8aa3067cf33f0b40000000000000000000000000d09a93c595f8074eb801ff9ff3cc28ee5a397f10000000000000000000000000ba595d92a314d7da8d31971bb227c0c002a04041000000000000000000000000bacb7753fcc5654ebd7d3d9cd90b1d897d80d87f000000000000000000000000c34493729b06a62efb5bc10f7d361faddd54656200000000000000000000000051384e26aabacebb2e770cfe0e0f04f2fecb25cc000000000000000000000000a07f4fd35b980cfbfb2f1efc83fe3f99f76546e200000000000000000000000024ed5bb8df35341d49a117eeb2cb52c1ceb53e31000000000000000000000000a74ef5aaf183bd3edb131c90f5e719d937be924b0000000000000000000000004b2a7123ab809670c7989a58b2ef8338028c791f000000000000000000000000e5b1e20ddb3f1751bbc5840b9e3992bfcf6eb5120000000000000000000000003e673e0e95269c423964c2fc2463e42e3ce29f80000000000000000000000000afe8d9e00a926ba669651caad543b8fa9dd384090000000000000000000000009be96a6e861d2e5aff1fe0738bed664b6f0b543e0000000000000000000000001dbaf3ca1bcd41f583e93312415bf051264c2edb000000000000000000000000fb054de87c048fe9f9d859afe6059d023529e0d8000000000000000000000000e7a07c6f58173f80ded7353d1ceb19204e69198f0000000000000000000000007a1853b856964898e45d4443065c3ba720958c00000000000000000000000000e35b68a44b3e1cda5c9b7ca497000ed5e532e5640000000000000000000000003754469fb055400c816e4f8ec0223912cd9fbc7b0000000000000000000000007dbc103765041e529c7886a9163c5b056eb129f2000000000000000000000000ebcf02aff6a9799845eb12dac1910f39cd3492810000000000000000000000002a1bbcdff7a047d82fc8829faa0d13a8d2cf1dbe

Deployed Bytecode

0x6080604052600436106102975760003560e01c80636352211e1161015a578063c87b56dd116100c1578063e98665501161007a578063e98665501461124f578063eb8d244414611266578063f032554914611293578063f12e6652146112aa578063f2fde38b146112c1578063f7a3951114611312576102fa565b8063c87b56dd1461102e578063cb774d47146110e2578063ce7c2ac21461110d578063e33b7de314611172578063e36d64981461119d578063e985e9c5146111c8576102fa565b80638da5cb5b116101135780638da5cb5b14610cf9578063948fd9fa14610d3a57806395d89b4114610dca5780639852595c14610e5a578063a22cb46514610ebf578063b88d4fde14610f1c576102fa565b80636352211e14610b0c5780636c0360eb14610b7157806370a0823114610c01578063715018a614610c665780637d17fcbe14610c7d5780638b83209b14610c94576102fa565b806329092d0e116101fe5780633af32abf116101b75780633af32abf146108bd57806342842e0e146109245780634342ed551461099f5780634f6ccce7146109ca57806355f804b314610a195780636129652d14610ae1576102fa565b806329092d0e146107605780632af86c7b146107b15780632f745c59146107df57806330f72cd41461084e57806334918dfd1461087b5780633a98ef3914610892576102fa565b80631096952311610250578063109695231461054b57806318160ddd1461061357806318e20a381461063e578063191655871461066957806323b872dd146106ba57806325c86a9b14610735576102fa565b8063018a2c37146102ff57806301ffc9a71461033a57806306fdde03146103aa578063081812fc1461043a578063095ea7b31461049f5780630a3b0a4f146104fa576102fa565b366102fa577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be7706102c561133d565b34604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1005b600080fd5b34801561030b57600080fd5b506103386004803603602081101561032257600080fd5b8101908080359060200190929190505050611345565b005b34801561034657600080fd5b506103926004803603602081101561035d57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506113fe565b60405180821515815260200191505060405180910390f35b3480156103b657600080fd5b506103bf611465565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ff5780820151818401526020810190506103e4565b50505050905090810190601f16801561042c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044657600080fd5b506104736004803603602081101561045d57600080fd5b8101908080359060200190929190505050611507565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104ab57600080fd5b506104f8600480360360408110156104c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115a2565b005b34801561050657600080fd5b506105496004803603602081101561051d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116e6565b005b34801561055757600080fd5b506106116004803603602081101561056e57600080fd5b810190808035906020019064010000000081111561058b57600080fd5b82018360208201111561059d57600080fd5b803590602001918460018302840111640100000000831117156105bf57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611833565b005b34801561061f57600080fd5b506106286118fc565b6040518082815260200191505060405180910390f35b34801561064a57600080fd5b5061065361190d565b6040518082815260200191505060405180910390f35b34801561067557600080fd5b506106b86004803603602081101561068c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611913565b005b3480156106c657600080fd5b50610733600480360360608110156106dd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b94565b005b34801561074157600080fd5b5061074a611c0a565b6040518082815260200191505060405180910390f35b34801561076c57600080fd5b506107af6004803603602081101561078357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c10565b005b6107dd600480360360208110156107c757600080fd5b8101908080359060200190929190505050611d5d565b005b3480156107eb57600080fd5b506108386004803603604081101561080257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506120b2565b6040518082815260200191505060405180910390f35b34801561085a57600080fd5b5061086361210d565b60405180821515815260200191505060405180910390f35b34801561088757600080fd5b50610890612120565b005b34801561089e57600080fd5b506108a7612216565b6040518082815260200191505060405180910390f35b3480156108c957600080fd5b5061090c600480360360208110156108e057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612220565b60405180821515815260200191505060405180910390f35b34801561093057600080fd5b5061099d6004803603606081101561094757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612276565b005b3480156109ab57600080fd5b506109b4612296565b6040518082815260200191505060405180910390f35b3480156109d657600080fd5b50610a03600480360360208110156109ed57600080fd5b810190808035906020019092919050505061229c565b6040518082815260200191505060405180910390f35b348015610a2557600080fd5b50610adf60048036036020811015610a3c57600080fd5b8101908080359060200190640100000000811115610a5957600080fd5b820183602082011115610a6b57600080fd5b80359060200191846001830284011164010000000083111715610a8d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506122bf565b005b348015610aed57600080fd5b50610af661237a565b6040518082815260200191505060405180910390f35b348015610b1857600080fd5b50610b4560048036036020811015610b2f57600080fd5b810190808035906020019092919050505061237f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b7d57600080fd5b50610b866123b6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc6578082015181840152602081019050610bab565b50505050905090810190601f168015610bf35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c0d57600080fd5b50610c5060048036036020811015610c2457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612458565b6040518082815260200191505060405180910390f35b348015610c7257600080fd5b50610c7b61252d565b005b348015610c8957600080fd5b50610c9261269d565b005b348015610ca057600080fd5b50610ccd60048036036020811015610cb757600080fd5b81019080803590602001909291905050506127cd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d0557600080fd5b50610d0e61280e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d4657600080fd5b50610d4f612838565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d8f578082015181840152602081019050610d74565b50505050905090810190601f168015610dbc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dd657600080fd5b50610ddf6128d6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1f578082015181840152602081019050610e04565b50505050905090810190601f168015610e4c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e6657600080fd5b50610ea960048036036020811015610e7d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612978565b6040518082815260200191505060405180910390f35b348015610ecb57600080fd5b50610f1a60048036036040811015610ee257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129c1565b005b348015610f2857600080fd5b5061102c60048036036080811015610f3f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610fa657600080fd5b820183602082011115610fb857600080fd5b80359060200191846001830284011164010000000083111715610fda57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612b77565b005b34801561103a57600080fd5b506110676004803603602081101561105157600080fd5b8101908080359060200190929190505050612bef565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110a757808201518184015260208101905061108c565b50505050905090810190601f1680156110d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156110ee57600080fd5b506110f7612ec0565b6040518082815260200191505060405180910390f35b34801561111957600080fd5b5061115c6004803603602081101561113057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ec6565b6040518082815260200191505060405180910390f35b34801561117e57600080fd5b50611187612f0f565b6040518082815260200191505060405180910390f35b3480156111a957600080fd5b506111b2612f19565b6040518082815260200191505060405180910390f35b3480156111d457600080fd5b50611237600480360360408110156111eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f1f565b60405180821515815260200191505060405180910390f35b34801561125b57600080fd5b50611264612fb3565b005b34801561127257600080fd5b5061127b61311d565b60405180821515815260200191505060405180910390f35b34801561129f57600080fd5b506112a8613130565b005b3480156112b657600080fd5b506112bf613226565b005b3480156112cd57600080fd5b50611310600480360360208110156112e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061330d565b005b34801561131e57600080fd5b50611327613502565b6040518082815260200191505060405180910390f35b600033905090565b61134d61133d565b73ffffffffffffffffffffffffffffffffffffffff1661136b61280e565b73ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060178190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114fd5780601f106114d2576101008083540402835291602001916114fd565b820191906000526020600020905b8154815290600101906020018083116114e057829003601f168201915b5050505050905090565b60006115128261350d565b611567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614e6f602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006115ad8261237f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611634576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614ef36021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661165361133d565b73ffffffffffffffffffffffffffffffffffffffff16148061168257506116818161167c61133d565b612f1f565b5b6116d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180614d5d6038913960400191505060405180910390fd5b6116e1838361352a565b505050565b6116ee61133d565b73ffffffffffffffffffffffffffffffffffffffff1661170c61280e565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fa850ae9193f515cbae8d35e8925bd2be26627fc91bce650b8652ed254e9cab0360405160405180910390a250565b61183b61133d565b73ffffffffffffffffffffffffffffffffffffffff1661185961280e565b73ffffffffffffffffffffffffffffffffffffffff16146118e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601190805190602001906118f8929190614ab9565b5050565b600061190860026135e3565b905090565b60175481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116119ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c0a6026913960400191505060405180910390fd5b6000600c54470190506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054840281611a4257fe5b040390506000811415611aa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614d11602b913960400191505060405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c5401600c81905550611b3a83826135f8565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505050565b611ba5611b9f61133d565b82613732565b611bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614f146031913960400191505060405180910390fd5b611c05838383613826565b505050565b60145481565b611c1861133d565b73ffffffffffffffffffffffffffffffffffffffff16611c3661280e565b73ffffffffffffffffffffffffffffffffffffffff1614611cbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df75760405160405180910390a250565b601660009054906101000a900460ff1680611d845750601660019054906101000a900460ff165b611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614f456023913960400191505060405180910390fd5b601660019054906101000a900460ff168015611e025750601660009054906101000a900460ff16155b15611eda57611e1033612220565b611e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526044815260200180614d956044913960600191505060405180910390fd5b601554611e8282611e746118fc565b613a6990919063ffffffff16565b1115611ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180614bd16039913960400191505060405180910390fd5b5b6014811115611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d3c6021913960400191505060405180910390fd5b601454611f5182611f436118fc565b613a6990919063ffffffff16565b1115611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614cb46031913960400191505060405180910390fd5b34611fc38266b1a2bc2ec50000613af190919063ffffffff16565b1115612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b8181101561207a576000600161204e6118fc565b01905060145461205c6118fc565b1161206c5761206b3382613b77565b5b50808060010191505061203a565b5060006012541480156120a257506014546120936118fc565b14806120a157506017544210155b5b156120af57436012819055505b50565b600061210582600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613b9590919063ffffffff16565b905092915050565b601660019054906101000a900460ff1681565b61212861133d565b73ffffffffffffffffffffffffffffffffffffffff1661214661280e565b73ffffffffffffffffffffffffffffffffffffffff16146121cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601660016101000a81548160ff021916908315150217905550601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b6000600b54905090565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61229183838360405180602001604052806000815250612b77565b505050565b60155481565b6000806122b3836002613baf90919063ffffffff16565b50905080915050919050565b6122c761133d565b73ffffffffffffffffffffffffffffffffffffffff166122e561280e565b73ffffffffffffffffffffffffffffffffffffffff161461236e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61237781613bdb565b50565b601481565b60006123af82604051806060016040528060298152602001614e03602991396002613bf59092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561244e5780601f106124235761010080835404028352916020019161244e565b820191906000526020600020905b81548152906001019060200180831161243157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614dd9602a913960400191505060405180910390fd5b612526600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613c14565b9050919050565b61253561133d565b73ffffffffffffffffffffffffffffffffffffffff1661255361280e565b73ffffffffffffffffffffffffffffffffffffffff16146125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6126a561133d565b73ffffffffffffffffffffffffffffffffffffffff166126c361280e565b73ffffffffffffffffffffffffffffffffffffffff161461274c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601354146127c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b43601281905550565b6000600f82815481106127dc57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60118054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156128ce5780601f106128a3576101008083540402835291602001916128ce565b820191906000526020600020905b8154815290600101906020018083116128b157829003601f168201915b505050505081565b606060078054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561296e5780601f106129435761010080835404028352916020019161296e565b820191906000526020600020905b81548152906001019060200180831161295157829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6129c961133d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a6a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000612a7761133d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612b2461133d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b612b88612b8261133d565b83613732565b612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180614f146031913960400191505060405180910390fd5b612be984848484613c29565b50505050565b6060612bfa8261350d565b612c4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614ec4602f913960400191505060405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cf85780601f10612ccd57610100808354040283529160200191612cf8565b820191906000526020600020905b815481529060010190602001808311612cdb57829003601f168201915b505050505090506060612d096123b6565b9050600081511415612d1f578192505050612ebb565b600082511115612df05780826040516020018083805190602001908083835b60208310612d615780518252602082019150602081019050602083039250612d3e565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612db25780518252602082019150602081019050602083039250612d8f565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612ebb565b80612dfa85613c9b565b6040516020018083805190602001908083835b60208310612e305780518252602082019150602081019050602083039250612e0d565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b60208310612e815780518252602082019150602081019050602083039250612e5e565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b60135481565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600c54905090565b60125481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006013541461302b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b600060125414156130a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5374617274696e6720696e64657820626c6f636b206d7573742062652073657481525060200191505060405180910390fd5b6014546012544060001c816130b557fe5b0660138190555060ff6130d360125443613de290919063ffffffff16565b11156130f357601454600143034060001c816130eb57fe5b066013819055505b6000601354141561311b576131146001601354613a6990919063ffffffff16565b6013819055505b565b601660009054906101000a900460ff1681565b61313861133d565b73ffffffffffffffffffffffffffffffffffffffff1661315661280e565b73ffffffffffffffffffffffffffffffffffffffff16146131df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601660006101000a81548160ff021916908315150217905550601660019054906101000a900460ff1615601660016101000a81548160ff021916908315150217905550565b61322e61133d565b73ffffffffffffffffffffffffffffffffffffffff1661324c61280e565b73ffffffffffffffffffffffffffffffffffffffff16146132d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060016132e16118fc565b01905060005b6078811015613309576132fc33828401613b77565b80806001019150506132e7565b5050565b61331561133d565b73ffffffffffffffffffffffffffffffffffffffff1661333361280e565b73ffffffffffffffffffffffffffffffffffffffff16146133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613442576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614bab6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b66b1a2bc2ec5000081565b6000613523826002613e6590919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661359d8361237f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006135f182600001613e7f565b9050919050565b8047101561366e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d80600081146136ce576040519150601f19603f3d011682016040523d82523d6000602084013e6136d3565b606091505b505090508061372d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180614c54603a913960400191505060405180910390fd5b505050565b600061373d8261350d565b613792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614ce5602c913960400191505060405180910390fd5b600061379d8361237f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061380c57508373ffffffffffffffffffffffffffffffffffffffff166137f484611507565b73ffffffffffffffffffffffffffffffffffffffff16145b8061381d575061381c8185612f1f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166138468261237f565b73ffffffffffffffffffffffffffffffffffffffff16146138b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180614e9b6029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613938576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614c306024913960400191505060405180910390fd5b613943838383613e90565b61394e60008261352a565b61399f81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613e9590919063ffffffff16565b506139f181600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613eaf90919063ffffffff16565b50613a0881836002613ec99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600080828401905083811015613ae7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415613b045760009050613b71565b6000828402905082848281613b1557fe5b0414613b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614e4e6021913960400191505060405180910390fd5b809150505b92915050565b613b91828260405180602001604052806000815250613efe565b5050565b6000613ba48360000183613f6f565b60001c905092915050565b600080600080613bc28660000186613ff2565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190613bf1929190614ab9565b5050565b6000613c08846000018460001b8461408b565b60001c90509392505050565b6000613c2282600001614181565b9050919050565b613c34848484613826565b613c4084848484614192565b613c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180614b796032913960400191505060405180910390fd5b50505050565b60606000821415613ce3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613ddd565b600082905060005b60008214613d0d578080600101915050600a8281613d0557fe5b049150613ceb565b60608167ffffffffffffffff81118015613d2657600080fd5b506040519080825280601f01601f191660200182016040528015613d595781602001600182028036833780820191505090505b50905060006001830390508593505b60008414613dd557600a8481613d7a57fe5b0660300160f81b82828060019003935081518110613d9457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481613dcd57fe5b049350613d68565b819450505050505b919050565b600082821115613e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b6000613e77836000018360001b6143ab565b905092915050565b600081600001805490509050919050565b505050565b6000613ea7836000018360001b6143ce565b905092915050565b6000613ec1836000018360001b6144b6565b905092915050565b6000613ef5846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b614526565b90509392505050565b613f088383614602565b613f156000848484614192565b613f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180614b796032913960400191505060405180910390fd5b505050565b600081836000018054905011613fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614b576022913960400191505060405180910390fd5b826000018281548110613fdf57fe5b9060005260206000200154905092915050565b60008082846000018054905011614054576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614e2c6022913960400191505060405180910390fd5b600084600001848154811061406557fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390614152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141175780820151818401526020810190506140fc565b50505050905090810190601f1680156141445780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061416557fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006141b38473ffffffffffffffffffffffffffffffffffffffff166147f6565b6141c057600190506143a3565b606061432a63150b7a0260e01b6141d561133d565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561425957808201518184015260208101905061423e565b50505050905090810190601f1680156142865780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614b79603291398773ffffffffffffffffffffffffffffffffffffffff166148099092919063ffffffff16565b9050600081806020019051602081101561434357600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146144aa576000600182039050600060018660000180549050039050600086600001828154811061441957fe5b906000526020600020015490508087600001848154811061443657fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061446e57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506144b0565b60009150505b92915050565b60006144c28383614821565b61451b578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050614520565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156145cd578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506145fb565b828560000160018303815481106145e057fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156146a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6146ae8161350d565b15614721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b61472d60008383613e90565b61477e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613eaf90919063ffffffff16565b5061479581836002613ec99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606148188484600085614844565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561489f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614c8e6026913960400191505060405180910390fd5b6148a8856147f6565b61491a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061496a5780518252602082019150602081019050602083039250614947565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146149cc576040519150601f19603f3d011682016040523d82523d6000602084013e6149d1565b606091505b50915091506149e18282866149ed565b92505050949350505050565b606083156149fd57829050614ab2565b600083511115614a105782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a77578082015181840152602081019050614a5c565b50505050905090810190601f168015614aa45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614afa57805160ff1916838001178555614b28565b82800160010185558215614b28579182015b82811115614b27578251825591602001919060010190614b0c565b5b509050614b359190614b39565b5090565b5b80821115614b52576000816000905550600101614b3a565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373507572636861736520776f756c6420657863656564207072652d73616c65206d617820737570706c79206f66203330303020466c6f776572735061796d656e7453706c69747465723a206163636f756e7420686173206e6f207368617265734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c507572636861736520776f756c6420657863656564206d617820737570706c79206f6620313230303020466c6f776572734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e5061796d656e7453706c69747465723a206163636f756e74206973206e6f7420647565207061796d656e7443616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4d7573742062652057686974656c697374656420746f206d696e74206265666f72652053657074656d6265722031352c203230323120373a30303a303020504d20474d544552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656453616c65206d7573742062652061637469766520746f206d696e7420466c6f77657273a2646970667358221220f07c224ba4690ef6c2b93b64cddc948ed5c9c47222b12160de3a04a63240ec4364736f6c63430007000033

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

000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000f476967612047617264656e204c53440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000547474c53440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000dcabf4fb1d7594eacb014d48e3674857f806f4b200000000000000000000000056cc222791c8e0d048b6dd42a7d3ef273afe55b2000000000000000000000000741e50151a7ed552944b15f91ec26d3df85c824f000000000000000000000000d88d4f99adc42a57e5949c94fdd984f43811f34400000000000000000000000006b0b7f01c484765f799269edd7763e9ae222f320000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091d00000000000000000000000000000000000000000000000000000000000005dc00000000000000000000000000000000000000000000000000000000000005dd00000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000dcabf4fb1d7594eacb014d48e3674857f806f4b200000000000000000000000056cc222791c8e0d048b6dd42a7d3ef273afe55b2000000000000000000000000741e50151a7ed552944b15f91ec26d3df85c824f000000000000000000000000d88d4f99adc42a57e5949c94fdd984f43811f34400000000000000000000000006b0b7f01c484765f799269edd7763e9ae222f320000000000000000000000008b078d0cc0f3b67f18c0877cc20519b04a427abe0000000000000000000000007d2cb6e5f16b40218a1e7430cebbe22ef9692dd8000000000000000000000000f9b1883bc447d910fc5fab7be15cbe866b9d1a7d0000000000000000000000009dbdad4abcc48610b22d56a6bdd1aa7f97171b06000000000000000000000000bc85df2bd72d3b517eca1ab81a9c0384198b0f2700000000000000000000000041db21d03a79663d74d35d1a87f7536b99e1c0060000000000000000000000004fd0ff2c49671d4fe1927371cf833e8b3b7f44ea00000000000000000000000095fc44504f26cf8e236fa4e3565062067f88949900000000000000000000000018ee97c69db02434a7117c48bcbd8811041217b0000000000000000000000000c50d334477fd730af3d4c5fb0be83c5ad26be55900000000000000000000000077e89101435909894e827469c5bc1614aef63392000000000000000000000000396f8cda2825abb6d0c37e631bad4ca01b24d2d300000000000000000000000050e11e5f1ce3c06807a6775953f340af3dc503e9000000000000000000000000bb37a3db0deadb3c56e145a287862b157aaa6b11000000000000000000000000ddbe93624c94179ee63b7bcf9548b3b236d35b14000000000000000000000000ac93f8882c36ee9f8948d493d6ff5b890909665d000000000000000000000000ee893a5a1c08f777daf8ff4ebce337314c64a6080000000000000000000000000cc52fbabb479d47e1ea6942494817900a237d9f000000000000000000000000b0d41697b86a05552e8f60385786fea4a34e0164000000000000000000000000f10944d1460c3820fb2e144cfd6c3426b5edc53300000000000000000000000062e8698b3f23b60ce805fdd7c7e9dbc9bfd5432f00000000000000000000000049594fb73a7912bc6da5d33a1060aca029907086000000000000000000000000df7d9cbc400ddd54a3f17a064d3418dc722b351a00000000000000000000000002306c88829cbd1f4e7d23f371ec5c727f8b330c00000000000000000000000044820743db5ccecf4187078b829a9a48d7d0e74b000000000000000000000000a3981a37d2f09b9c98e2877f3e85712bffaa1763000000000000000000000000c567ee384df678b217a28897e0d1e4b944624e120000000000000000000000000ab42c0ecaf214f30ecc0ffdd5a95334486a95110000000000000000000000005722387e2950a8e8b8674d8c5de18d60bbb59f63000000000000000000000000375c8be95978bd235420150281ce1a77c8aece09000000000000000000000000a548d95378ec16e000563d89684c64869f72bc0d000000000000000000000000ccdbe8126e7dee6e929b1b2b89df0b1594997f71000000000000000000000000f4a832467cb94d22bbb35a9bf190db0eb3f21e500000000000000000000000002d57f839cf5748d84710ec291c1cf3815e9d007400000000000000000000000096834d7fe50992fde54fa01fb8c9e920293758ba000000000000000000000000cd8ebc8a7a8515af18b189f3d7b1edb9223132100000000000000000000000005f390341786ca439cdf46a3d1536ff4af1996849000000000000000000000000b434b6a4403ee92b0728c0d1cb19855db406af30000000000000000000000000e80f14b99a6bd243d28cfb7755626c4d12a1d40600000000000000000000000068abb61e97ffd7c59d6112c01c622e76187c26ff0000000000000000000000001dbaf3ca1bcd41f583e93312415bf051264c2edb0000000000000000000000001a43003a06d80aa51bdc5054e4572841f122335c00000000000000000000000017912235ad7cd9b5fb728a2e0b99ca7e614c692f0000000000000000000000001f16a9106b2ef346ac1748d8dc9c7f088847f6940000000000000000000000005973341ef216a81e6c75c97a35584d2cbd25a90c000000000000000000000000c2690edde996e5c56c9b7fafcdbdf257a780446b000000000000000000000000d0f143bcaeb57acb878cac0d6062b9ed910c4af900000000000000000000000036e8c0edb5b0d82960cfffd9882cb6d781f0e25f00000000000000000000000088921288945d62865721f0ce8b1d26638939e95f000000000000000000000000f653281a02d178e0dbfe165ecca8c434bd0c0171000000000000000000000000954d65e5310607e12f93f6156de92cd37ffcae8e000000000000000000000000954d65e5310607e12f93f6156de92cd37ffcae8e000000000000000000000000430fdebb78eed8df7bcbf28e3fbd0560cc9e2edc00000000000000000000000085a58fd890507331a1620c7329e5b61089954699000000000000000000000000c51ee0269b665cabb2337450f8b48798817e951f000000000000000000000000362a42b2764ebbfdad9a9dfdf39ca98efdce11e80000000000000000000000001ad441f983aa12f20c192e0deabbcb303c3ab0a100000000000000000000000071829dd36d8061ac32104bce3eed90609eb7a4d200000000000000000000000022b0e277e5348c406eb6ec9c82b379bc82c2392200000000000000000000000036fa11f6715a5e440871f531030ee4e94d7b9309000000000000000000000000a11f607aea1b450015ac1e610d083ca56b7eeb000000000000000000000000008905ee4bc06c5b6db46ca90ec9bab73b6201c0e40000000000000000000000007857af41cb171cc97d24f5a7c01182474de9a273000000000000000000000000288e55b2f3af18e051b3d4840c04b24c40867e32000000000000000000000000f11989b14e4ff171a5a503c2180a7c440c6eec0b000000000000000000000000a94783af0f03cd8287b8027ca6d8d7c093cccede0000000000000000000000005b4eee9b83a57bc1dc071b5d7683b0545a414a66000000000000000000000000f4cdb62c9a66c749cdf736c43e96ff11d2bab444000000000000000000000000bd9a849f87ff89ac0cb451b2065d227b6e279a6a000000000000000000000000512c579153ac6fd961a7d9e7b19281b855aafbe100000000000000000000000026db774e3c5ed9d8930e89aadd598cb6e498d369000000000000000000000000e670f0369d0a7bc7ea89d06bcd7174df4be7eb16000000000000000000000000174cc60fccb27c0571c9dfc2f2554be908e1051f000000000000000000000000cedad2cd7d2d92ae2193b68c635088fa3b41e121000000000000000000000000fb054de87c048fe9f9d859afe6059d023529e0d800000000000000000000000052aee9cb5d4bd2d4bbdbf07ae43b6bb6a4c6c39c00000000000000000000000090a1a5f30a96c6a0dd540937a687c3c46717b60c0000000000000000000000002e150ff74e83911dc2adf3655cf1e5e076ceaf8e000000000000000000000000e063b992c6a49c7f065b80acd4830b9cc1f8cd6e000000000000000000000000dd2e8ed7152454078142832b4f95cabdcfa73f610000000000000000000000005ce0bb138678e7e56bd6e880269f2bf381ffaeaa000000000000000000000000a1a134bda79f8cb9c3c5e419e88a85a2a97b0917000000000000000000000000fa508baa5681b2d4790b65775c8aec3eaf4d17da0000000000000000000000007767037ade89dc4f56d3188da15ea189c2674f360000000000000000000000004ab86ea57cf7094d4e73ed22f8d5c972e8528df50000000000000000000000009d717a001fa283c708be47bb5c3a55a3bcaa80f10000000000000000000000007baa14047c6cd9547259d0bac3c58715e7f2cf1f0000000000000000000000005aaa21a358fffebc62165a1d28158341fa8833b50000000000000000000000009d76aa87b9f58b6a3b4a74649cb9e435347c08c1000000000000000000000000ff6bf8ec2fea016fc8ff568d744e293aff865bbc00000000000000000000000074878265074d4629b9b1c09d2cc6e5cd3a9d1048000000000000000000000000a4007bcfc6c4dfe27ba379805c43f8eb5599d49500000000000000000000000027018caa7ac03db78377c742921a6a29fec63e65000000000000000000000000d6e2fdcac495c42e69775b076a56ca96d3c27d60000000000000000000000000a17e9a24ee2e93373da56d80dfd8b16649c83ff7000000000000000000000000facc9e25e2cb511a51e980e2d0bec5fe6c62868e00000000000000000000000045a3e501aa7989363a64ee29e443f228e556d55000000000000000000000000050a354f9edaa453d59ffe1f88096b3b8225e7afe000000000000000000000000939dc788a1902cf04788e6cc993fa4ef88400ce0000000000000000000000000e6c11554a5de57d577cadf7d3e19891ababe113000000000000000000000000037254a14ecf158e7f7895852e7ba2eaa7b33f93e000000000000000000000000b780e820fe467b448951d46927f9e73b8f7dfc0f00000000000000000000000093659ddd36735850713a8c9b5c461760ffe35b8200000000000000000000000085affb0c85e05ee94d25f73e32ced8cb64de173100000000000000000000000089bb950117e9cec77846e998e7796ab1c8cb036b00000000000000000000000044820743db5ccecf4187078b829a9a48d7d0e74b00000000000000000000000068abb61e97ffd7c59d6112c01c622e76187c26ff00000000000000000000000016ce6c6662510faf7c34bb1406fd8c20641db9e3000000000000000000000000800ebacd1971ed9c50ae9b9412a78fe824bd31b600000000000000000000000042506784677291ec7067b6180d941e347a55f87300000000000000000000000006663f0d090d6556ba2074b482671f5e68a2da49000000000000000000000000b4b81b693f322f6dadac99c9de4366970e99f6d8000000000000000000000000cb02519c9690e91f05a6ca545840ad27af462d9500000000000000000000000024e4fe3d90e61d1dc25ff5417862d12c479c62ad0000000000000000000000001d75769197091ccfe87a4a757fed7e44723996d8000000000000000000000000a4f8167706aaf9b0dfde893bea161aba4ea5784e000000000000000000000000915a1f0ea39346750eee46cbec9cb8459a6fa1ea00000000000000000000000031aba29b2a7ef003a280b42638ebf4d223852e920000000000000000000000004d0c5acfb9c448cb5dd869d9e6e5697aa2a12ec5000000000000000000000000021699aaf005dabd166bf803c65fc90529fcff4a000000000000000000000000ecd8c7abae05083c7bf368e022a311c24a11870f000000000000000000000000fda8d5f35dd80e094267ec0ef652e90c2a009ddf0000000000000000000000009e4f28fe6157cfabc9345ac1439ffbb6e42b4cac0000000000000000000000000fbab48c0f2756b526590bdd63edcf8ea4efaacf0000000000000000000000006199f8b551af1a3aaf9dc12a0491d919992822160000000000000000000000008716f73d87d5972cbc0ad0fa38f09e48aeaa14160000000000000000000000008ceca142d8ca90f797b755c81ab202eaae619b7900000000000000000000000015e97e9d9e5ac247bbfae4e7e39c634ba60e610f00000000000000000000000003602b0441be635b8d2f007e6840dcfc981f42de000000000000000000000000bca7549b4a9867e8053f966739a08a46eb6cbad40000000000000000000000004a4bf2fc2a03f0e26b0535e1f59f67db3cf22003000000000000000000000000504fc4d9ce662fa08dede68edf75ffb61707b977000000000000000000000000e5db379fc625079fc54e66a39b4e7392fde525bd000000000000000000000000d44f9db7c700aecc2b735ed2b2eb9463f8a494e400000000000000000000000011be585b694b35a1cbe9982b2b4e162088b0b89d000000000000000000000000710d7d662978b842210c12766048172b5fb0ab91000000000000000000000000a5a33c910600c2612db4a78a0c0d553b424c230c000000000000000000000000f36987d2f01d9a0356a974018ef8fb834bf9ceb3000000000000000000000000a3981a37d2f09b9c98e2877f3e85712bffaa1763000000000000000000000000e136b2d9f1371cbca11b9c40699e47852de277460000000000000000000000005e3bb9ffa698ae15672b03f38e8e562104b86755000000000000000000000000452bc1d9f91d35954e7e14d8527f7a5a9b26c0b3000000000000000000000000e3ea13fcbd6dfc8e6be836afd577f81197b80b3800000000000000000000000011b4405c2b05d94757091f018a3fa5327f11665b000000000000000000000000152fe4daa4a1b3c0de88a56961f4defc9c6efeee0000000000000000000000002e5199b46f1d8f2b9ddc02db7edad90805a82896000000000000000000000000b284f19ffa703daadf6745d3c655f309d17370a5000000000000000000000000f879067ea603af3a264031a8478a62498983f53b0000000000000000000000005022cf478c7124d508ab4a304946cb4fa3d9c39e0000000000000000000000002ccc5e98e7ce96321752beb10eb3f8b8af5efcf70000000000000000000000000d3ef24ccd12827cce51bca43cf9efb78380429c000000000000000000000000e7c8906083c8dcbc3e76cc2d8aa3067cf33f0b40000000000000000000000000d09a93c595f8074eb801ff9ff3cc28ee5a397f10000000000000000000000000ba595d92a314d7da8d31971bb227c0c002a04041000000000000000000000000bacb7753fcc5654ebd7d3d9cd90b1d897d80d87f000000000000000000000000c34493729b06a62efb5bc10f7d361faddd54656200000000000000000000000051384e26aabacebb2e770cfe0e0f04f2fecb25cc000000000000000000000000a07f4fd35b980cfbfb2f1efc83fe3f99f76546e200000000000000000000000024ed5bb8df35341d49a117eeb2cb52c1ceb53e31000000000000000000000000a74ef5aaf183bd3edb131c90f5e719d937be924b0000000000000000000000004b2a7123ab809670c7989a58b2ef8338028c791f000000000000000000000000e5b1e20ddb3f1751bbc5840b9e3992bfcf6eb5120000000000000000000000003e673e0e95269c423964c2fc2463e42e3ce29f80000000000000000000000000afe8d9e00a926ba669651caad543b8fa9dd384090000000000000000000000009be96a6e861d2e5aff1fe0738bed664b6f0b543e0000000000000000000000001dbaf3ca1bcd41f583e93312415bf051264c2edb000000000000000000000000fb054de87c048fe9f9d859afe6059d023529e0d8000000000000000000000000e7a07c6f58173f80ded7353d1ceb19204e69198f0000000000000000000000007a1853b856964898e45d4443065c3ba720958c00000000000000000000000000e35b68a44b3e1cda5c9b7ca497000ed5e532e5640000000000000000000000003754469fb055400c816e4f8ec0223912cd9fbc7b0000000000000000000000007dbc103765041e529c7886a9163c5b056eb129f2000000000000000000000000ebcf02aff6a9799845eb12dac1910f39cd3492810000000000000000000000002a1bbcdff7a047d82fc8829faa0d13a8d2cf1dbe

-----Decoded View---------------
Arg [0] : name (string): Giga Garden LSD
Arg [1] : symbol (string): GGLSD
Arg [2] : maxNftSupply (uint256): 12000
Arg [3] : maxPresaleNftSupply (uint256): 3000
Arg [4] : saleStart (uint256): 100
Arg [5] : addrs (address[]): 0xDcABf4Fb1D7594eaCB014d48e3674857f806f4b2,0x56cC222791C8E0D048b6dD42a7D3ef273afe55B2,0x741e50151a7ed552944b15F91ec26D3DF85C824f,0xD88d4F99ADC42A57e5949c94fDd984f43811f344,0x06b0b7f01C484765f799269EDd7763E9Ae222F32
Arg [6] : shares_ (uint256[]): 2333,2333,2333,1500,1501
Arg [7] : wl_addrs (address[]): 0xDcABf4Fb1D7594eaCB014d48e3674857f806f4b2,0x56cC222791C8E0D048b6dD42a7D3ef273afe55B2,0x741e50151a7ed552944b15F91ec26D3DF85C824f,0xD88d4F99ADC42A57e5949c94fDd984f43811f344,0x06b0b7f01C484765f799269EDd7763E9Ae222F32,0x8B078D0cC0f3b67f18c0877cc20519b04a427aBE,0x7d2CB6e5F16b40218A1E7430cebBe22Ef9692dd8,0xf9b1883bC447d910FC5faB7BE15cbE866b9D1A7D,0x9DBdaD4ABCc48610B22d56a6bDD1AA7f97171B06,0xbC85Df2BD72D3b517EcA1Ab81A9c0384198b0f27,0x41dB21d03a79663D74d35D1a87F7536B99e1C006,0x4Fd0fF2C49671D4fE1927371cf833E8b3B7f44eA,0x95fC44504F26cf8e236fA4e3565062067F889499,0x18ee97C69db02434A7117C48bcBD8811041217B0,0xc50d334477Fd730af3d4C5Fb0be83C5Ad26BE559,0x77E89101435909894e827469c5bC1614aef63392,0x396f8Cda2825ABb6D0C37E631BAd4cA01B24d2d3,0x50e11e5f1CE3C06807A6775953f340af3dc503e9,0xBB37a3dB0dEADb3c56E145A287862b157AaA6B11,0xddbE93624C94179EE63b7bcF9548B3b236d35b14,0xAC93F8882C36Ee9f8948d493D6ff5B890909665D,0xEE893A5A1C08F777DAF8ff4EBCe337314c64A608,0x0CC52FbaBB479d47e1Ea6942494817900A237d9f,0xB0D41697B86A05552E8F60385786feA4a34e0164,0xf10944D1460c3820Fb2E144cFd6C3426B5Edc533,0x62e8698b3f23b60CE805fdD7C7e9DBC9bFD5432f,0x49594Fb73a7912Bc6dA5D33a1060Aca029907086,0xDf7d9cbC400ddd54a3f17a064D3418dc722b351a,0x02306C88829cBd1f4e7d23F371ec5c727F8b330C,0x44820743DB5CCecF4187078b829A9a48d7d0E74b,0xa3981A37d2f09B9c98e2877F3e85712BfFAa1763,0xc567EE384df678b217a28897e0d1E4B944624e12,0x0aB42C0eCAf214F30ECc0FFdD5a95334486a9511,0x5722387e2950A8E8B8674D8c5dE18D60Bbb59F63,0x375C8bE95978bd235420150281CE1A77C8AeCE09,0xA548d95378EC16e000563D89684C64869F72BC0D,0xcCdBe8126E7dee6E929b1b2B89dF0b1594997f71,0xf4a832467cB94d22BbB35a9Bf190dB0eB3f21e50,0x2D57f839Cf5748d84710ec291c1cF3815e9D0074,0x96834D7fe50992FDe54fA01fb8c9E920293758BA,0xcd8ebC8A7A8515AF18b189F3D7b1edB922313210,0x5F390341786Ca439CDF46A3d1536ff4AF1996849,0xB434B6a4403Ee92B0728C0d1cb19855Db406Af30,0xe80f14b99a6BD243D28CFb7755626c4D12a1d406,0x68Abb61E97fFD7C59D6112c01C622E76187C26Ff,0x1dBaf3cA1BCD41F583e93312415BF051264c2eDb,0x1A43003a06d80AA51BDC5054E4572841F122335C,0x17912235AD7Cd9B5fb728a2e0B99ca7E614C692f,0x1f16a9106B2EF346ac1748D8dC9c7F088847F694,0x5973341Ef216a81E6c75C97a35584d2Cbd25a90c,0xC2690EDdE996E5C56c9B7faFCdbDf257A780446B,0xd0f143bCaEB57AcB878CAC0D6062b9ed910c4AF9,0x36e8c0EDB5B0D82960CFfFd9882Cb6D781f0e25f,0x88921288945D62865721f0cE8b1D26638939E95f,0xF653281a02d178E0dbfe165eCCA8c434BD0c0171,0x954d65e5310607e12F93f6156de92cD37FFcae8e,0x954d65e5310607e12F93f6156de92cD37FFcae8e,0x430FdEbB78EEd8Df7BCbF28E3FBD0560cc9e2edC,0x85a58fD890507331a1620C7329e5b61089954699,0xc51eE0269b665CaBB2337450F8B48798817e951f,0x362A42B2764EBbfDAD9A9DfDF39ca98EFDCE11E8,0x1Ad441F983AA12F20c192e0DeAbbcB303C3aB0A1,0x71829dD36D8061aC32104BCE3eeD90609EB7a4D2,0x22B0E277e5348C406eb6Ec9c82B379Bc82c23922,0x36Fa11f6715A5E440871F531030Ee4E94d7B9309,0xA11F607AEA1b450015ac1e610D083cA56b7Eeb00,0x8905Ee4bc06c5b6DB46cA90ec9baB73B6201C0E4,0x7857AF41CB171CC97d24F5A7C01182474de9A273,0x288E55B2F3AF18e051b3D4840c04B24C40867E32,0xF11989b14e4ff171A5A503C2180a7C440c6Eec0b,0xa94783af0f03CD8287B8027ca6D8D7c093cCCede,0x5B4eEE9B83a57BC1dc071B5d7683b0545A414a66,0xf4CDb62c9a66c749cDF736C43e96FF11d2bAb444,0xbd9a849f87fF89AC0cB451b2065d227B6E279A6A,0x512C579153AC6fD961a7d9e7b19281B855AAfbE1,0x26dB774e3c5ed9d8930E89AaDd598cb6E498d369,0xe670f0369D0a7bc7eA89D06BcD7174df4BE7EB16,0x174CC60FCcb27c0571c9dfc2f2554be908E1051F,0xCEDAD2CD7d2D92Ae2193b68C635088fa3B41E121,0xFb054de87c048fE9f9D859afE6059d023529E0d8,0x52aee9Cb5d4bD2D4BbdBf07Ae43b6bb6a4C6C39c,0x90A1a5f30a96c6A0dd540937a687c3C46717b60c,0x2E150FF74e83911dc2aDf3655CF1e5E076cEaF8E,0xE063B992c6A49c7f065b80AcD4830b9cc1f8CD6E,0xDd2e8ED7152454078142832B4f95cABdCFa73F61,0x5ce0bB138678E7e56bd6E880269f2bF381fFAeAA,0xa1a134BDA79F8CB9c3C5E419E88A85a2a97b0917,0xfA508Baa5681B2d4790B65775C8aec3EAf4d17DA,0x7767037aDE89dC4f56d3188Da15EA189c2674f36,0x4Ab86Ea57Cf7094d4e73Ed22f8d5c972E8528dF5,0x9D717a001fa283C708Be47bb5c3a55a3BcAa80f1,0x7BAA14047c6cD9547259D0baC3C58715E7F2cf1f,0x5AAa21A358FFfEBC62165a1d28158341fA8833b5,0x9d76aA87b9f58B6a3B4a74649cb9e435347c08C1,0xff6bf8ec2FeA016fC8FF568d744e293afF865bBC,0x74878265074D4629B9b1c09d2cC6E5cD3A9D1048,0xa4007bCFc6C4dFe27BA379805c43F8eB5599d495,0x27018cAa7Ac03dB78377C742921a6A29fec63e65,0xd6E2FdCaC495C42E69775B076A56cA96d3c27d60,0xa17E9a24EE2E93373da56d80dFd8B16649C83fF7,0xFacC9E25E2cB511a51E980e2d0BEC5Fe6c62868E,0x45a3e501AA7989363A64EE29E443F228E556D550,0x50A354f9EDAa453D59FFe1F88096b3B8225E7afE,0x939DC788a1902cF04788E6cC993fA4eF88400cE0,0xE6c11554a5De57D577CAdf7d3e19891abAbe1130,0x37254a14eCF158E7f7895852E7ba2eaA7B33f93E,0xB780E820FE467B448951d46927F9e73b8F7DFC0F,0x93659dDD36735850713a8c9B5c461760FfE35b82,0x85affB0c85e05EE94d25F73E32CeD8Cb64de1731,0x89bB950117E9CEC77846E998E7796ab1c8cb036b,0x44820743DB5CCecF4187078b829A9a48d7d0E74b,0x68Abb61E97fFD7C59D6112c01C622E76187C26Ff,0x16Ce6c6662510faF7C34bb1406fd8c20641db9E3,0x800EBacd1971ED9C50aE9b9412a78Fe824bD31B6,0x42506784677291EC7067b6180d941e347a55F873,0x06663f0D090D6556BA2074B482671f5e68A2DA49,0xb4b81b693F322F6dadac99c9DE4366970e99f6D8,0xCB02519c9690E91f05a6Ca545840AD27Af462D95,0x24e4Fe3D90E61D1dc25fF5417862d12c479C62Ad,0x1D75769197091cCFe87A4A757fED7E44723996d8,0xa4F8167706AaF9B0DFdE893bEa161aba4eA5784E,0x915a1F0Ea39346750eEe46CbeC9Cb8459A6FA1ea,0x31AbA29B2a7ef003A280B42638Ebf4D223852e92,0x4d0c5acFb9C448Cb5dd869d9E6e5697Aa2a12Ec5,0x021699aaf005DABD166bF803C65Fc90529fcfF4a,0xEcd8C7ABaE05083C7bF368E022A311C24a11870F,0xfda8D5f35Dd80e094267ec0eF652e90C2A009DDf,0x9E4F28FE6157CFaBC9345ac1439ffbb6e42b4CAc,0x0fBAb48c0f2756B526590bDD63edcf8eA4eFaacf,0x6199f8b551af1a3Aaf9Dc12A0491D91999282216,0x8716f73D87D5972CBC0aD0FA38f09e48aEAA1416,0x8CECa142D8ca90F797B755C81Ab202EaAe619b79,0x15E97e9D9e5aC247bBFaE4e7e39c634ba60E610f,0x03602b0441BE635B8D2F007E6840dcFc981F42De,0xbCa7549B4a9867e8053F966739a08a46eb6cBad4,0x4a4BF2Fc2A03f0E26b0535E1f59F67Db3Cf22003,0x504FC4D9ce662fa08dEdE68eDf75fFB61707b977,0xe5DB379fC625079fc54e66A39b4E7392FDe525bD,0xD44F9dB7C700aecC2b735ED2b2EB9463F8a494e4,0x11BE585b694B35A1CbE9982b2b4e162088B0B89D,0x710d7D662978B842210c12766048172b5FB0ab91,0xA5A33c910600C2612db4a78a0c0D553B424c230c,0xF36987d2f01d9A0356a974018ef8fB834BF9cEb3,0xa3981A37d2f09B9c98e2877F3e85712BfFAa1763,0xE136b2D9F1371CbCA11b9C40699e47852de27746,0x5E3Bb9ffa698aE15672b03F38e8E562104b86755,0x452bC1D9f91d35954e7e14D8527F7a5A9b26c0b3,0xe3Ea13FcBD6dfC8e6BE836AfD577f81197b80B38,0x11b4405C2B05D94757091f018a3Fa5327f11665B,0x152FE4dAA4a1B3C0DE88A56961F4DEfc9c6EFeeE,0x2E5199b46F1d8f2b9DDc02dB7eDaD90805a82896,0xB284F19FFa703dAADf6745d3C655F309D17370a5,0xf879067eA603AF3a264031a8478A62498983f53B,0x5022cF478c7124d508Ab4A304946Cb4Fa3d9C39e,0x2cCC5e98E7Ce96321752beB10eB3f8b8af5EFcf7,0x0D3Ef24cCd12827CcE51bcA43Cf9EfB78380429c,0xE7c8906083C8DcBc3E76Cc2D8Aa3067CF33f0B40,0xD09A93c595f8074EB801Ff9FF3Cc28eE5a397F10,0xBa595D92A314d7da8D31971BB227c0C002a04041,0xbacb7753fcC5654Ebd7D3d9CD90B1d897D80d87F,0xC34493729B06A62efb5bc10F7d361FAdDD546562,0x51384E26aabACeBb2e770cfe0E0F04f2feCB25cc,0xa07F4FD35b980cfbfb2F1efC83FE3F99F76546E2,0x24ed5bb8dF35341d49a117eEb2cB52c1ceb53e31,0xA74ef5AAF183bD3edB131c90f5E719D937BE924B,0x4B2A7123aB809670C7989A58b2EF8338028C791f,0xE5B1E20ddB3f1751bbc5840B9E3992BfcF6eB512,0x3e673e0e95269C423964c2FC2463e42e3cE29f80,0xAFE8D9E00A926ba669651CAAd543b8FA9Dd38409,0x9BE96A6e861D2e5aFF1Fe0738BeD664b6F0B543e,0x1dBaf3cA1BCD41F583e93312415BF051264c2eDb,0xFb054de87c048fE9f9D859afE6059d023529E0d8,0xe7a07c6f58173f80Ded7353d1CEB19204E69198f,0x7A1853B856964898E45d4443065C3bA720958C00,0xE35B68A44b3e1CdA5C9b7cA497000ED5e532e564,0x3754469Fb055400C816e4F8Ec0223912cD9FBC7B,0x7dbc103765041E529c7886a9163c5B056Eb129F2,0xEbcF02AfF6A9799845eb12dAc1910F39cd349281,0x2A1BBcdff7A047d82fc8829FAA0D13a8D2cf1dBE

-----Encoded View---------------
204 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002ee0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [9] : 476967612047617264656e204c53440000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 47474c5344000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [13] : 000000000000000000000000dcabf4fb1d7594eacb014d48e3674857f806f4b2
Arg [14] : 00000000000000000000000056cc222791c8e0d048b6dd42a7d3ef273afe55b2
Arg [15] : 000000000000000000000000741e50151a7ed552944b15f91ec26d3df85c824f
Arg [16] : 000000000000000000000000d88d4f99adc42a57e5949c94fdd984f43811f344
Arg [17] : 00000000000000000000000006b0b7f01c484765f799269edd7763e9ae222f32
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [19] : 000000000000000000000000000000000000000000000000000000000000091d
Arg [20] : 000000000000000000000000000000000000000000000000000000000000091d
Arg [21] : 000000000000000000000000000000000000000000000000000000000000091d
Arg [22] : 00000000000000000000000000000000000000000000000000000000000005dc
Arg [23] : 00000000000000000000000000000000000000000000000000000000000005dd
Arg [24] : 00000000000000000000000000000000000000000000000000000000000000b3
Arg [25] : 000000000000000000000000dcabf4fb1d7594eacb014d48e3674857f806f4b2
Arg [26] : 00000000000000000000000056cc222791c8e0d048b6dd42a7d3ef273afe55b2
Arg [27] : 000000000000000000000000741e50151a7ed552944b15f91ec26d3df85c824f
Arg [28] : 000000000000000000000000d88d4f99adc42a57e5949c94fdd984f43811f344
Arg [29] : 00000000000000000000000006b0b7f01c484765f799269edd7763e9ae222f32
Arg [30] : 0000000000000000000000008b078d0cc0f3b67f18c0877cc20519b04a427abe
Arg [31] : 0000000000000000000000007d2cb6e5f16b40218a1e7430cebbe22ef9692dd8
Arg [32] : 000000000000000000000000f9b1883bc447d910fc5fab7be15cbe866b9d1a7d
Arg [33] : 0000000000000000000000009dbdad4abcc48610b22d56a6bdd1aa7f97171b06
Arg [34] : 000000000000000000000000bc85df2bd72d3b517eca1ab81a9c0384198b0f27
Arg [35] : 00000000000000000000000041db21d03a79663d74d35d1a87f7536b99e1c006
Arg [36] : 0000000000000000000000004fd0ff2c49671d4fe1927371cf833e8b3b7f44ea
Arg [37] : 00000000000000000000000095fc44504f26cf8e236fa4e3565062067f889499
Arg [38] : 00000000000000000000000018ee97c69db02434a7117c48bcbd8811041217b0
Arg [39] : 000000000000000000000000c50d334477fd730af3d4c5fb0be83c5ad26be559
Arg [40] : 00000000000000000000000077e89101435909894e827469c5bc1614aef63392
Arg [41] : 000000000000000000000000396f8cda2825abb6d0c37e631bad4ca01b24d2d3
Arg [42] : 00000000000000000000000050e11e5f1ce3c06807a6775953f340af3dc503e9
Arg [43] : 000000000000000000000000bb37a3db0deadb3c56e145a287862b157aaa6b11
Arg [44] : 000000000000000000000000ddbe93624c94179ee63b7bcf9548b3b236d35b14
Arg [45] : 000000000000000000000000ac93f8882c36ee9f8948d493d6ff5b890909665d
Arg [46] : 000000000000000000000000ee893a5a1c08f777daf8ff4ebce337314c64a608
Arg [47] : 0000000000000000000000000cc52fbabb479d47e1ea6942494817900a237d9f
Arg [48] : 000000000000000000000000b0d41697b86a05552e8f60385786fea4a34e0164
Arg [49] : 000000000000000000000000f10944d1460c3820fb2e144cfd6c3426b5edc533
Arg [50] : 00000000000000000000000062e8698b3f23b60ce805fdd7c7e9dbc9bfd5432f
Arg [51] : 00000000000000000000000049594fb73a7912bc6da5d33a1060aca029907086
Arg [52] : 000000000000000000000000df7d9cbc400ddd54a3f17a064d3418dc722b351a
Arg [53] : 00000000000000000000000002306c88829cbd1f4e7d23f371ec5c727f8b330c
Arg [54] : 00000000000000000000000044820743db5ccecf4187078b829a9a48d7d0e74b
Arg [55] : 000000000000000000000000a3981a37d2f09b9c98e2877f3e85712bffaa1763
Arg [56] : 000000000000000000000000c567ee384df678b217a28897e0d1e4b944624e12
Arg [57] : 0000000000000000000000000ab42c0ecaf214f30ecc0ffdd5a95334486a9511
Arg [58] : 0000000000000000000000005722387e2950a8e8b8674d8c5de18d60bbb59f63
Arg [59] : 000000000000000000000000375c8be95978bd235420150281ce1a77c8aece09
Arg [60] : 000000000000000000000000a548d95378ec16e000563d89684c64869f72bc0d
Arg [61] : 000000000000000000000000ccdbe8126e7dee6e929b1b2b89df0b1594997f71
Arg [62] : 000000000000000000000000f4a832467cb94d22bbb35a9bf190db0eb3f21e50
Arg [63] : 0000000000000000000000002d57f839cf5748d84710ec291c1cf3815e9d0074
Arg [64] : 00000000000000000000000096834d7fe50992fde54fa01fb8c9e920293758ba
Arg [65] : 000000000000000000000000cd8ebc8a7a8515af18b189f3d7b1edb922313210
Arg [66] : 0000000000000000000000005f390341786ca439cdf46a3d1536ff4af1996849
Arg [67] : 000000000000000000000000b434b6a4403ee92b0728c0d1cb19855db406af30
Arg [68] : 000000000000000000000000e80f14b99a6bd243d28cfb7755626c4d12a1d406
Arg [69] : 00000000000000000000000068abb61e97ffd7c59d6112c01c622e76187c26ff
Arg [70] : 0000000000000000000000001dbaf3ca1bcd41f583e93312415bf051264c2edb
Arg [71] : 0000000000000000000000001a43003a06d80aa51bdc5054e4572841f122335c
Arg [72] : 00000000000000000000000017912235ad7cd9b5fb728a2e0b99ca7e614c692f
Arg [73] : 0000000000000000000000001f16a9106b2ef346ac1748d8dc9c7f088847f694
Arg [74] : 0000000000000000000000005973341ef216a81e6c75c97a35584d2cbd25a90c
Arg [75] : 000000000000000000000000c2690edde996e5c56c9b7fafcdbdf257a780446b
Arg [76] : 000000000000000000000000d0f143bcaeb57acb878cac0d6062b9ed910c4af9
Arg [77] : 00000000000000000000000036e8c0edb5b0d82960cfffd9882cb6d781f0e25f
Arg [78] : 00000000000000000000000088921288945d62865721f0ce8b1d26638939e95f
Arg [79] : 000000000000000000000000f653281a02d178e0dbfe165ecca8c434bd0c0171
Arg [80] : 000000000000000000000000954d65e5310607e12f93f6156de92cd37ffcae8e
Arg [81] : 000000000000000000000000954d65e5310607e12f93f6156de92cd37ffcae8e
Arg [82] : 000000000000000000000000430fdebb78eed8df7bcbf28e3fbd0560cc9e2edc
Arg [83] : 00000000000000000000000085a58fd890507331a1620c7329e5b61089954699
Arg [84] : 000000000000000000000000c51ee0269b665cabb2337450f8b48798817e951f
Arg [85] : 000000000000000000000000362a42b2764ebbfdad9a9dfdf39ca98efdce11e8
Arg [86] : 0000000000000000000000001ad441f983aa12f20c192e0deabbcb303c3ab0a1
Arg [87] : 00000000000000000000000071829dd36d8061ac32104bce3eed90609eb7a4d2
Arg [88] : 00000000000000000000000022b0e277e5348c406eb6ec9c82b379bc82c23922
Arg [89] : 00000000000000000000000036fa11f6715a5e440871f531030ee4e94d7b9309
Arg [90] : 000000000000000000000000a11f607aea1b450015ac1e610d083ca56b7eeb00
Arg [91] : 0000000000000000000000008905ee4bc06c5b6db46ca90ec9bab73b6201c0e4
Arg [92] : 0000000000000000000000007857af41cb171cc97d24f5a7c01182474de9a273
Arg [93] : 000000000000000000000000288e55b2f3af18e051b3d4840c04b24c40867e32
Arg [94] : 000000000000000000000000f11989b14e4ff171a5a503c2180a7c440c6eec0b
Arg [95] : 000000000000000000000000a94783af0f03cd8287b8027ca6d8d7c093cccede
Arg [96] : 0000000000000000000000005b4eee9b83a57bc1dc071b5d7683b0545a414a66
Arg [97] : 000000000000000000000000f4cdb62c9a66c749cdf736c43e96ff11d2bab444
Arg [98] : 000000000000000000000000bd9a849f87ff89ac0cb451b2065d227b6e279a6a
Arg [99] : 000000000000000000000000512c579153ac6fd961a7d9e7b19281b855aafbe1
Arg [100] : 00000000000000000000000026db774e3c5ed9d8930e89aadd598cb6e498d369
Arg [101] : 000000000000000000000000e670f0369d0a7bc7ea89d06bcd7174df4be7eb16
Arg [102] : 000000000000000000000000174cc60fccb27c0571c9dfc2f2554be908e1051f
Arg [103] : 000000000000000000000000cedad2cd7d2d92ae2193b68c635088fa3b41e121
Arg [104] : 000000000000000000000000fb054de87c048fe9f9d859afe6059d023529e0d8
Arg [105] : 00000000000000000000000052aee9cb5d4bd2d4bbdbf07ae43b6bb6a4c6c39c
Arg [106] : 00000000000000000000000090a1a5f30a96c6a0dd540937a687c3c46717b60c
Arg [107] : 0000000000000000000000002e150ff74e83911dc2adf3655cf1e5e076ceaf8e
Arg [108] : 000000000000000000000000e063b992c6a49c7f065b80acd4830b9cc1f8cd6e
Arg [109] : 000000000000000000000000dd2e8ed7152454078142832b4f95cabdcfa73f61
Arg [110] : 0000000000000000000000005ce0bb138678e7e56bd6e880269f2bf381ffaeaa
Arg [111] : 000000000000000000000000a1a134bda79f8cb9c3c5e419e88a85a2a97b0917
Arg [112] : 000000000000000000000000fa508baa5681b2d4790b65775c8aec3eaf4d17da
Arg [113] : 0000000000000000000000007767037ade89dc4f56d3188da15ea189c2674f36
Arg [114] : 0000000000000000000000004ab86ea57cf7094d4e73ed22f8d5c972e8528df5
Arg [115] : 0000000000000000000000009d717a001fa283c708be47bb5c3a55a3bcaa80f1
Arg [116] : 0000000000000000000000007baa14047c6cd9547259d0bac3c58715e7f2cf1f
Arg [117] : 0000000000000000000000005aaa21a358fffebc62165a1d28158341fa8833b5
Arg [118] : 0000000000000000000000009d76aa87b9f58b6a3b4a74649cb9e435347c08c1
Arg [119] : 000000000000000000000000ff6bf8ec2fea016fc8ff568d744e293aff865bbc
Arg [120] : 00000000000000000000000074878265074d4629b9b1c09d2cc6e5cd3a9d1048
Arg [121] : 000000000000000000000000a4007bcfc6c4dfe27ba379805c43f8eb5599d495
Arg [122] : 00000000000000000000000027018caa7ac03db78377c742921a6a29fec63e65
Arg [123] : 000000000000000000000000d6e2fdcac495c42e69775b076a56ca96d3c27d60
Arg [124] : 000000000000000000000000a17e9a24ee2e93373da56d80dfd8b16649c83ff7
Arg [125] : 000000000000000000000000facc9e25e2cb511a51e980e2d0bec5fe6c62868e
Arg [126] : 00000000000000000000000045a3e501aa7989363a64ee29e443f228e556d550
Arg [127] : 00000000000000000000000050a354f9edaa453d59ffe1f88096b3b8225e7afe
Arg [128] : 000000000000000000000000939dc788a1902cf04788e6cc993fa4ef88400ce0
Arg [129] : 000000000000000000000000e6c11554a5de57d577cadf7d3e19891ababe1130
Arg [130] : 00000000000000000000000037254a14ecf158e7f7895852e7ba2eaa7b33f93e
Arg [131] : 000000000000000000000000b780e820fe467b448951d46927f9e73b8f7dfc0f
Arg [132] : 00000000000000000000000093659ddd36735850713a8c9b5c461760ffe35b82
Arg [133] : 00000000000000000000000085affb0c85e05ee94d25f73e32ced8cb64de1731
Arg [134] : 00000000000000000000000089bb950117e9cec77846e998e7796ab1c8cb036b
Arg [135] : 00000000000000000000000044820743db5ccecf4187078b829a9a48d7d0e74b
Arg [136] : 00000000000000000000000068abb61e97ffd7c59d6112c01c622e76187c26ff
Arg [137] : 00000000000000000000000016ce6c6662510faf7c34bb1406fd8c20641db9e3
Arg [138] : 000000000000000000000000800ebacd1971ed9c50ae9b9412a78fe824bd31b6
Arg [139] : 00000000000000000000000042506784677291ec7067b6180d941e347a55f873
Arg [140] : 00000000000000000000000006663f0d090d6556ba2074b482671f5e68a2da49
Arg [141] : 000000000000000000000000b4b81b693f322f6dadac99c9de4366970e99f6d8
Arg [142] : 000000000000000000000000cb02519c9690e91f05a6ca545840ad27af462d95
Arg [143] : 00000000000000000000000024e4fe3d90e61d1dc25ff5417862d12c479c62ad
Arg [144] : 0000000000000000000000001d75769197091ccfe87a4a757fed7e44723996d8
Arg [145] : 000000000000000000000000a4f8167706aaf9b0dfde893bea161aba4ea5784e
Arg [146] : 000000000000000000000000915a1f0ea39346750eee46cbec9cb8459a6fa1ea
Arg [147] : 00000000000000000000000031aba29b2a7ef003a280b42638ebf4d223852e92
Arg [148] : 0000000000000000000000004d0c5acfb9c448cb5dd869d9e6e5697aa2a12ec5
Arg [149] : 000000000000000000000000021699aaf005dabd166bf803c65fc90529fcff4a
Arg [150] : 000000000000000000000000ecd8c7abae05083c7bf368e022a311c24a11870f
Arg [151] : 000000000000000000000000fda8d5f35dd80e094267ec0ef652e90c2a009ddf
Arg [152] : 0000000000000000000000009e4f28fe6157cfabc9345ac1439ffbb6e42b4cac
Arg [153] : 0000000000000000000000000fbab48c0f2756b526590bdd63edcf8ea4efaacf
Arg [154] : 0000000000000000000000006199f8b551af1a3aaf9dc12a0491d91999282216
Arg [155] : 0000000000000000000000008716f73d87d5972cbc0ad0fa38f09e48aeaa1416
Arg [156] : 0000000000000000000000008ceca142d8ca90f797b755c81ab202eaae619b79
Arg [157] : 00000000000000000000000015e97e9d9e5ac247bbfae4e7e39c634ba60e610f
Arg [158] : 00000000000000000000000003602b0441be635b8d2f007e6840dcfc981f42de
Arg [159] : 000000000000000000000000bca7549b4a9867e8053f966739a08a46eb6cbad4
Arg [160] : 0000000000000000000000004a4bf2fc2a03f0e26b0535e1f59f67db3cf22003
Arg [161] : 000000000000000000000000504fc4d9ce662fa08dede68edf75ffb61707b977
Arg [162] : 000000000000000000000000e5db379fc625079fc54e66a39b4e7392fde525bd
Arg [163] : 000000000000000000000000d44f9db7c700aecc2b735ed2b2eb9463f8a494e4
Arg [164] : 00000000000000000000000011be585b694b35a1cbe9982b2b4e162088b0b89d
Arg [165] : 000000000000000000000000710d7d662978b842210c12766048172b5fb0ab91
Arg [166] : 000000000000000000000000a5a33c910600c2612db4a78a0c0d553b424c230c
Arg [167] : 000000000000000000000000f36987d2f01d9a0356a974018ef8fb834bf9ceb3
Arg [168] : 000000000000000000000000a3981a37d2f09b9c98e2877f3e85712bffaa1763
Arg [169] : 000000000000000000000000e136b2d9f1371cbca11b9c40699e47852de27746
Arg [170] : 0000000000000000000000005e3bb9ffa698ae15672b03f38e8e562104b86755
Arg [171] : 000000000000000000000000452bc1d9f91d35954e7e14d8527f7a5a9b26c0b3
Arg [172] : 000000000000000000000000e3ea13fcbd6dfc8e6be836afd577f81197b80b38
Arg [173] : 00000000000000000000000011b4405c2b05d94757091f018a3fa5327f11665b
Arg [174] : 000000000000000000000000152fe4daa4a1b3c0de88a56961f4defc9c6efeee
Arg [175] : 0000000000000000000000002e5199b46f1d8f2b9ddc02db7edad90805a82896
Arg [176] : 000000000000000000000000b284f19ffa703daadf6745d3c655f309d17370a5
Arg [177] : 000000000000000000000000f879067ea603af3a264031a8478a62498983f53b
Arg [178] : 0000000000000000000000005022cf478c7124d508ab4a304946cb4fa3d9c39e
Arg [179] : 0000000000000000000000002ccc5e98e7ce96321752beb10eb3f8b8af5efcf7
Arg [180] : 0000000000000000000000000d3ef24ccd12827cce51bca43cf9efb78380429c
Arg [181] : 000000000000000000000000e7c8906083c8dcbc3e76cc2d8aa3067cf33f0b40
Arg [182] : 000000000000000000000000d09a93c595f8074eb801ff9ff3cc28ee5a397f10
Arg [183] : 000000000000000000000000ba595d92a314d7da8d31971bb227c0c002a04041
Arg [184] : 000000000000000000000000bacb7753fcc5654ebd7d3d9cd90b1d897d80d87f
Arg [185] : 000000000000000000000000c34493729b06a62efb5bc10f7d361faddd546562
Arg [186] : 00000000000000000000000051384e26aabacebb2e770cfe0e0f04f2fecb25cc
Arg [187] : 000000000000000000000000a07f4fd35b980cfbfb2f1efc83fe3f99f76546e2
Arg [188] : 00000000000000000000000024ed5bb8df35341d49a117eeb2cb52c1ceb53e31
Arg [189] : 000000000000000000000000a74ef5aaf183bd3edb131c90f5e719d937be924b
Arg [190] : 0000000000000000000000004b2a7123ab809670c7989a58b2ef8338028c791f
Arg [191] : 000000000000000000000000e5b1e20ddb3f1751bbc5840b9e3992bfcf6eb512
Arg [192] : 0000000000000000000000003e673e0e95269c423964c2fc2463e42e3ce29f80
Arg [193] : 000000000000000000000000afe8d9e00a926ba669651caad543b8fa9dd38409
Arg [194] : 0000000000000000000000009be96a6e861d2e5aff1fe0738bed664b6f0b543e
Arg [195] : 0000000000000000000000001dbaf3ca1bcd41f583e93312415bf051264c2edb
Arg [196] : 000000000000000000000000fb054de87c048fe9f9d859afe6059d023529e0d8
Arg [197] : 000000000000000000000000e7a07c6f58173f80ded7353d1ceb19204e69198f
Arg [198] : 0000000000000000000000007a1853b856964898e45d4443065c3ba720958c00
Arg [199] : 000000000000000000000000e35b68a44b3e1cda5c9b7ca497000ed5e532e564
Arg [200] : 0000000000000000000000003754469fb055400c816e4f8ec0223912cd9fbc7b
Arg [201] : 0000000000000000000000007dbc103765041e529c7886a9163c5b056eb129f2
Arg [202] : 000000000000000000000000ebcf02aff6a9799845eb12dac1910f39cd349281
Arg [203] : 0000000000000000000000002a1bbcdff7a047d82fc8829faa0d13a8d2cf1dbe


Deployed Bytecode Sourcemap

330:4794:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2668:40:14;2684:12;:10;:12::i;:::-;2698:9;2668:40;;;;;;;;;;;;;;;;;;;;;;;;;;330:4794:6;;;;;1720:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1062:150:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4622:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7408:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6938:404;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;707:135:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1916:126:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6416:211:3;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;867:31:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3874:613:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8298:305:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;692:32:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;850:143:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2607:1415:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6178:162:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;823:35:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2224:123;;;;;;;;;;;;;:::i;:::-;;2799:91:14;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1001:112:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;8674:151:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;733:40:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6704:172:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2050:99:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;640:43;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4378:177:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5997:97;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4095:221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1822:148:13;;;;;;;;;;;;;:::i;:::-;;4929:192:6;;;;;;;;;;;;;:::i;:::-;;3574:100:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1171:87:13;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;442:35:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4791:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3374:109:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7701:295:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8896:285;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4966:792;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;528:28:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3170:105:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2984:95;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;486:33:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8067:164:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4098:694:6;;;;;;;;;;;;;:::i;:::-;;782:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2422:129;;;;;;;;;;;;;:::i;:::-;;1415:212;;;;;;;;;;;;;:::i;:::-;;2125:244:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;565:55:6;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;669:106:1;722:15;757:10;750:17;;669:106;:::o;1720:123:6:-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1820:15:6::1;1801:16;:34;;;;1720:123:::0;:::o;1062:150:2:-;1147:4;1171:20;:33;1192:11;1171:33;;;;;;;;;;;;;;;;;;;;;;;;;;;1164:40;;1062:150;;;:::o;4622:100:3:-;4676:13;4709:5;4702:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4622:100;:::o;7408:221::-;7484:7;7512:16;7520:7;7512;:16::i;:::-;7504:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7597:15;:24;7613:7;7597:24;;;;;;;;;;;;;;;;;;;;;7590:31;;7408:221;;;:::o;6938:404::-;7019:13;7035:23;7050:7;7035:14;:23::i;:::-;7019:39;;7083:5;7077:11;;:2;:11;;;;7069:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7163:5;7147:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;7172:44;7196:5;7203:12;:10;:12::i;:::-;7172:23;:44::i;:::-;7147:69;7139:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7313:21;7322:2;7326:7;7313:8;:21::i;:::-;6938:404;;;:::o;707:135:17:-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;788:4:17::1;766:9;:19;776:8;766:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;825:8;808:26;;;;;;;;;;;;707:135:::0;:::o;1916:126:6:-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2020:14:6::1;2001:16;:33;;;;;;;;;;;;:::i;:::-;;1916:126:::0;:::o;6416:211:3:-;6477:7;6598:21;:12;:19;:21::i;:::-;6591:28;;6416:211;:::o;867:31:6:-;;;;:::o;3874:613:14:-;3969:1;3950:7;:16;3958:7;3950:16;;;;;;;;;;;;;;;;:20;3942:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4026:21;4074:14;;4050:21;:38;4026:62;;4099:15;4169:9;:18;4179:7;4169:18;;;;;;;;;;;;;;;;4154:12;;4134:7;:16;4142:7;4134:16;;;;;;;;;;;;;;;;4118:13;:32;4117:49;;;;;;:70;4099:88;;4219:1;4208:7;:12;;4200:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4323:7;4302:9;:18;4312:7;4302:18;;;;;;;;;;;;;;;;:28;4281:9;:18;4291:7;4281:18;;;;;;;;;;;;;;;:49;;;;4375:7;4358:14;;:24;4341:14;:41;;;;4395:35;4413:7;4422;4395:17;:35::i;:::-;4446:33;4462:7;4471;4446:33;;;;;;;;;;;;;;;;;;;;;;;;;;3874:613;;;:::o;8298:305:3:-;8459:41;8478:12;:10;:12::i;:::-;8492:7;8459:18;:41::i;:::-;8451:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8567:28;8577:4;8583:2;8587:7;8567:9;:28::i;:::-;8298:305;;;:::o;692:32:6:-;;;;:::o;850:143:17:-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;934:5:17::1;912:9;:19;922:8;912:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;976:8;955:30;;;;;;;;;;;;850:143:::0;:::o;2607:1415:6:-;2682:12;;;;;;;;;;;:31;;;;2698:15;;;;;;;;;;;2682:31;2674:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2767:15;;;;;;;;;;;:32;;;;;2787:12;;;;;;;;;;;2786:13;2767:32;2764:315;;;2823:25;2837:10;2823:13;:25::i;:::-;2815:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2980:25;;2943:33;2961:14;2943:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:62;;2935:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2764:315;681:2;3097:14;:35;;3089:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3226:17;;3189:33;3207:14;3189:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:54;;3181:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3351:9;3316:31;3332:14;603:17;3316:15;;:31;;;;:::i;:::-;:44;;3308:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3421:6;3417:221;3437:14;3433:1;:18;3417:221;;;3473:14;3504:1;3490:13;:11;:13::i;:::-;:15;3473:32;;3541:17;;3524:13;:11;:13::i;:::-;:34;3520:107;;3579:32;3589:10;3601:9;3579;:32::i;:::-;3520:107;3417:221;3453:3;;;;;;;3417:221;;;;3872:1;3850:18;;:23;:102;;;;;3895:17;;3878:13;:11;:13::i;:::-;:34;:73;;;;3935:16;;3916:15;:35;;3878:73;3850:102;3846:168;;;3990:12;3969:18;:33;;;;3846:168;2607:1415;:::o;6178:162:3:-;6275:7;6302:30;6326:5;6302:13;:20;6316:5;6302:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;6295:37;;6178:162;;;;:::o;823:35:6:-;;;;;;;;;;;;;:::o;2224:123::-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2295:5:6::1;2277:15;;:23;;;;;;;;;;;;;;;;;;2327:12;;;;;;;;;;;2326:13;2311:12;;:28;;;;;;;;;;;;;;;;;;2224:123::o:0;2799:91:14:-;2843:7;2870:12;;2863:19;;2799:91;:::o;1001:112:17:-;1062:4;1086:9;:19;1096:8;1086:19;;;;;;;;;;;;;;;;;;;;;;;;;1079:26;;1001:112;;;:::o;8674:151:3:-;8778:39;8795:4;8801:2;8805:7;8778:39;;;;;;;;;;;;:16;:39::i;:::-;8674:151;;;:::o;733:40:6:-;;;;:::o;6704:172:3:-;6779:7;6800:15;6821:22;6837:5;6821:12;:15;;:22;;;;:::i;:::-;6799:44;;;6861:7;6854:14;;;6704:172;;;:::o;2050:99:6:-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2121:20:6::1;2133:7;2121:11;:20::i;:::-;2050:99:::0;:::o;640:43::-;681:2;640:43;:::o;4378:177:3:-;4450:7;4477:70;4494:7;4477:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;4470:77;;4378:177;;;:::o;5997:97::-;6045:13;6078:8;6071:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5997:97;:::o;4095:221::-;4167:7;4212:1;4195:19;;:5;:19;;;;4187:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4279:29;:13;:20;4293:5;4279:20;;;;;;;;;;;;;;;:27;:29::i;:::-;4272:36;;4095:221;;;:::o;1822:148:13:-;1402:12;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1929:1:::1;1892:40;;1913:6;;;;;;;;;;;1892:40;;;;;;;;;;;;1960:1;1943:6;;:19;;;;;;;;;;;;;;;;;;1822:148::o:0;4929:192:6:-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5024:1:6::1;5007:13;;:18;4999:60;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;5101:12;5080:18;:33;;;;4929:192::o:0;3574:100:14:-;3625:7;3652;3660:5;3652:14;;;;;;;;;;;;;;;;;;;;;;;;;3645:21;;3574:100;;;:::o;1171:87:13:-;1217:7;1244:6;;;;;;;;;;;1237:13;;1171:87;:::o;442:35:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4791:104:3:-;4847:13;4880:7;4873:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4791:104;:::o;3374:109:14:-;3430:7;3457:9;:18;3467:7;3457:18;;;;;;;;;;;;;;;;3450:25;;3374:109;;;:::o;7701:295:3:-;7816:12;:10;:12::i;:::-;7804:24;;:8;:24;;;;7796:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7916:8;7871:18;:32;7890:12;:10;:12::i;:::-;7871:32;;;;;;;;;;;;;;;:42;7904:8;7871:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;7969:8;7940:48;;7955:12;:10;:12::i;:::-;7940:48;;;7979:8;7940:48;;;;;;;;;;;;;;;;;;;;7701:295;;:::o;8896:285::-;9028:41;9047:12;:10;:12::i;:::-;9061:7;9028:18;:41::i;:::-;9020:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9134:39;9148:4;9154:2;9158:7;9167:5;9134:13;:39::i;:::-;8896:285;;;;:::o;4966:792::-;5039:13;5073:16;5081:7;5073;:16::i;:::-;5065:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5154:23;5180:10;:19;5191:7;5180:19;;;;;;;;;;;5154:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5210:18;5231:9;:7;:9::i;:::-;5210:30;;5338:1;5322:4;5316:18;:23;5312:72;;;5363:9;5356:16;;;;;;5312:72;5514:1;5494:9;5488:23;:27;5484:108;;;5563:4;5569:9;5546:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5532:48;;;;;;5484:108;5724:4;5730:18;:7;:16;:18::i;:::-;5707:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5693:57;;;;4966:792;;;;:::o;528:28:6:-;;;;:::o;3170:105:14:-;3224:7;3251;:16;3259:7;3251:16;;;;;;;;;;;;;;;;3244:23;;3170:105;;;:::o;2984:95::-;3030:7;3057:14;;3050:21;;2984:95;:::o;486:33:6:-;;;;:::o;8067:164:3:-;8164:4;8188:18;:25;8207:5;8188:25;;;;;;;;;;;;;;;:35;8214:8;8188:35;;;;;;;;;;;;;;;;;;;;;;;;;8181:42;;8067:164;;;;:::o;4098:694:6:-;4169:1;4152:13;;:18;4144:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4245:1;4223:18;;:23;;4215:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4358:17;;4335:18;;4325:29;4320:35;;:55;;;;;;4304:13;:71;;;;4550:3;4511:36;4528:18;;4511:12;:16;;:36;;;;:::i;:::-;:42;4507:144;;;4622:17;;4616:1;4601:12;:16;4591:27;4586:33;;:53;;;;;;4570:13;:69;;;;4507:144;4719:1;4702:13;;:18;4698:87;;;4753:20;4771:1;4753:13;;:17;;:20;;;;:::i;:::-;4737:13;:36;;;;4698:87;4098:694::o;782:32::-;;;;;;;;;;;;;:::o;2422:129::-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2493:5:6::1;2478:12;;:20;;;;;;;;;;;;;;;;;;2528:15;;;;;;;;;;;2527:16;2509:15;;:34;;;;;;;;;;;;;;;;;;2422:129::o:0;1415:212::-;1402:12:13;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1477:11:6::1;1505:1;1491:13;:11;:13::i;:::-;:15;1477:29;;1517:6;1534:86;1550:3;1546:1;:7;1534:86;;;1575:33;1585:10;1606:1;1597:6;:10;1575:9;:33::i;:::-;1555:3;;;;;;;1534:86;;;1462:1:13;;1415:212:6:o:0;2125:244:13:-;1402:12;:10;:12::i;:::-;1391:23;;:7;:5;:7::i;:::-;:23;;;1383:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2234:1:::1;2214:22;;:8;:22;;;;2206:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2324:8;2295:38;;2316:6;;;;;;;;;;;2295:38;;;;;;;;;;;;2353:8;2344:6;;:17;;;;;;;;;;;;;;;;;;2125:244:::0;:::o;565:55:6:-;603:17;565:55;:::o;10648:127:3:-;10713:4;10737:30;10759:7;10737:12;:21;;:30;;;;:::i;:::-;10730:37;;10648:127;;;:::o;16666:192::-;16768:2;16741:15;:24;16757:7;16741:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;16824:7;16820:2;16786:46;;16795:23;16810:7;16795:14;:23::i;:::-;16786:46;;;;;;;;;;;;16666:192;;:::o;8098:123:4:-;8167:7;8194:19;8202:3;:10;;8194:7;:19::i;:::-;8187:26;;8098:123;;;:::o;2164:397:0:-;2279:6;2254:21;:31;;2246:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2411:12;2429:9;:14;;2452:6;2429:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2410:54;;;2483:7;2475:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2164:397;;;:::o;10942:355:3:-;11035:4;11060:16;11068:7;11060;:16::i;:::-;11052:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11136:13;11152:23;11167:7;11152:14;:23::i;:::-;11136:39;;11205:5;11194:16;;:7;:16;;;:51;;;;11238:7;11214:31;;:20;11226:7;11214:11;:20::i;:::-;:31;;;11194:51;:94;;;;11249:39;11273:5;11280:7;11249:23;:39::i;:::-;11194:94;11186:103;;;10942:355;;;;:::o;14078:599::-;14203:4;14176:31;;:23;14191:7;14176:14;:23::i;:::-;:31;;;14168:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14304:1;14290:16;;:2;:16;;;;14282:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14360:39;14381:4;14387:2;14391:7;14360:20;:39::i;:::-;14464:29;14481:1;14485:7;14464:8;:29::i;:::-;14506:35;14533:7;14506:13;:19;14520:4;14506:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;14552:30;14574:7;14552:13;:17;14566:2;14552:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;14595:29;14612:7;14621:2;14595:12;:16;;:29;;;;;:::i;:::-;;14661:7;14657:2;14642:27;;14651:4;14642:27;;;;;;;;;;;;14078:599;;;:::o;2830:179:15:-;2888:7;2908:9;2924:1;2920;:5;2908:17;;2949:1;2944;:6;;2936:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3000:1;2993:8;;;2830:179;;;;:::o;3709:220::-;3767:7;3796:1;3791;:6;3787:20;;;3806:1;3799:8;;;;3787:20;3818:9;3834:1;3830;:5;3818:17;;3863:1;3858;3854;:5;;;;;;:10;3846:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3920:1;3913:8;;;3709:220;;;;;:::o;11640:110:3:-;11716:26;11726:2;11730:7;11716:26;;;;;;;;;;;;:9;:26::i;:::-;11640:110;;:::o;9605:137:5:-;9676:7;9711:22;9715:3;:10;;9727:5;9711:3;:22::i;:::-;9703:31;;9696:38;;9605:137;;;;:::o;8560:236:4:-;8640:7;8649;8670:11;8683:13;8700:22;8704:3;:10;;8716:5;8700:3;:22::i;:::-;8669:53;;;;8749:3;8741:12;;8779:5;8771:14;;8733:55;;;;;;8560:236;;;;;:::o;15278:100:3:-;15362:8;15351;:19;;;;;;;;;;;;:::i;:::-;;15278:100;:::o;9846:213:4:-;9953:7;10004:44;10009:3;:10;;10029:3;10021:12;;10035;10004:4;:44::i;:::-;9996:53;;9973:78;;9846:213;;;;;:::o;9147:114:5:-;9207:7;9234:19;9242:3;:10;;9234:7;:19::i;:::-;9227:26;;9147:114;;;:::o;10063:272:3:-;10177:28;10187:4;10193:2;10197:7;10177:9;:28::i;:::-;10224:48;10247:4;10253:2;10257:7;10266:5;10224:22;:48::i;:::-;10216:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10063:272;;;;:::o;277:746:16:-;333:13;563:1;554:5;:10;550:53;;;581:10;;;;;;;;;;;;;;;;;;;;;550:53;613:12;628:5;613:20;;644:14;669:78;684:1;676:4;:9;669:78;;702:8;;;;;;;733:2;725:10;;;;;;;;;669:78;;;757:19;789:6;779:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;757:39;;807:13;832:1;823:6;:10;807:26;;851:5;844:12;;867:117;882:1;874:4;:9;867:117;;943:2;936:4;:9;;;;;;931:2;:14;918:29;;900:6;907:7;;;;;;;900:15;;;;;;;;;;;:47;;;;;;;;;;;970:2;962:10;;;;;;;;;867:117;;;1008:6;994:21;;;;;;277:746;;;;:::o;3292:158:15:-;3350:7;3383:1;3378;:6;;3370:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3441:1;3437;:5;3430:12;;3292:158;;;;:::o;7859:151:4:-;7943:4;7967:35;7977:3;:10;;7997:3;7989:12;;7967:9;:35::i;:::-;7960:42;;7859:151;;;;:::o;4677:110::-;4733:7;4760:3;:12;;:19;;;;4753:26;;4677:110;;;:::o;17471:93:3:-;;;;:::o;8692:137:5:-;8762:4;8786:35;8794:3;:10;;8814:5;8806:14;;8786:7;:35::i;:::-;8779:42;;8692:137;;;;:::o;8385:131::-;8452:4;8476:32;8481:3;:10;;8501:5;8493:14;;8476:4;:32::i;:::-;8469:39;;8385:131;;;;:::o;7282:185:4:-;7371:4;7395:64;7400:3;:10;;7420:3;7412:12;;7450:5;7434:23;;7426:32;;7395:4;:64::i;:::-;7388:71;;7282:185;;;;;:::o;11977:250:3:-;12073:18;12079:2;12083:7;12073:5;:18::i;:::-;12110:54;12141:1;12145:2;12149:7;12158:5;12110:22;:54::i;:::-;12102:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11977:250;;;:::o;4643:204:5:-;4710:7;4759:5;4738:3;:11;;:18;;;;:26;4730:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4821:3;:11;;4833:5;4821:18;;;;;;;;;;;;;;;;4814:25;;4643:204;;;;:::o;5142:279:4:-;5209:7;5218;5268:5;5246:3;:12;;:19;;;;:27;5238:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5325:22;5350:3;:12;;5363:5;5350:19;;;;;;;;;;;;;;;;;;5325:44;;5388:5;:10;;;5400:5;:12;;;5380:33;;;;;5142:279;;;;;:::o;6639:319::-;6733:7;6753:16;6772:3;:12;;:17;6785:3;6772:17;;;;;;;;;;;;6753:36;;6820:1;6808:8;:13;;6823:12;6800:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6890:3;:12;;6914:1;6903:8;:12;6890:26;;;;;;;;;;;;;;;;;;:33;;;6883:40;;;6639:319;;;;;:::o;4190:109:5:-;4246:7;4273:3;:11;;:18;;;;4266:25;;4190:109;;;:::o;15943:604:3:-;16064:4;16091:15;:2;:13;;;:15::i;:::-;16086:60;;16130:4;16123:11;;;;16086:60;16156:23;16182:252;16235:45;;;16295:12;:10;:12::i;:::-;16322:4;16341:7;16363:5;16198:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16182:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;16156:278;;16445:13;16472:10;16461:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16445:48;;1092:10;16522:16;;16512:26;;;:6;:26;;;;16504:35;;;;15943:604;;;;;;;:::o;4457:125:4:-;4528:4;4573:1;4552:3;:12;;:17;4565:3;4552:17;;;;;;;;;;;;:22;;4545:29;;4457:125;;;;:::o;2345:1544:5:-;2411:4;2529:18;2550:3;:12;;:19;2563:5;2550:19;;;;;;;;;;;;2529:40;;2600:1;2586:10;:15;2582:1300;;2948:21;2985:1;2972:10;:14;2948:38;;3001:17;3042:1;3021:3;:11;;:18;;;;:22;3001:42;;3288:17;3308:3;:11;;3320:9;3308:22;;;;;;;;;;;;;;;;3288:42;;3454:9;3425:3;:11;;3437:13;3425:26;;;;;;;;;;;;;;;:38;;;;3573:1;3557:13;:17;3531:3;:12;;:23;3544:9;3531:23;;;;;;;;;;;:43;;;;3683:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;3778:3;:12;;:19;3791:5;3778:19;;;;;;;;;;;3771:26;;;3821:4;3814:11;;;;;;;;2582:1300;3865:5;3858:12;;;2345:1544;;;;;:::o;1755:414::-;1818:4;1840:21;1850:3;1855:5;1840:9;:21::i;:::-;1835:327;;1878:3;:11;;1895:5;1878:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2061:3;:11;;:18;;;;2039:3;:12;;:19;2052:5;2039:19;;;;;;;;;;;:40;;;;2101:4;2094:11;;;;1835:327;2145:5;2138:12;;1755:414;;;;;:::o;1957:692:4:-;2033:4;2149:16;2168:3;:12;;:17;2181:3;2168:17;;;;;;;;;;;;2149:36;;2214:1;2202:8;:13;2198:444;;;2269:3;:12;;2287:38;;;;;;;;2304:3;2287:38;;;;2317:5;2287:38;;;2269:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2484:3;:12;;:19;;;;2464:3;:12;;:17;2477:3;2464:17;;;;;;;;;;;:39;;;;2525:4;2518:11;;;;;2198:444;2598:5;2562:3;:12;;2586:1;2575:8;:12;2562:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;2625:5;2618:12;;;1957:692;;;;;;:::o;12563:404:3:-;12657:1;12643:16;;:2;:16;;;;12635:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12716:16;12724:7;12716;:16::i;:::-;12715:17;12707:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12778:45;12807:1;12811:2;12815:7;12778:20;:45::i;:::-;12836:30;12858:7;12836:13;:17;12850:2;12836:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;12879:29;12896:7;12905:2;12879:12;:16;;:29;;;;;:::i;:::-;;12951:7;12947:2;12926:33;;12943:1;12926:33;;;;;;;;;;;;12563:404;;:::o;807:422:0:-;867:4;1075:12;1186:7;1174:20;1166:28;;1220:1;1213:4;:8;1206:15;;;807:422;;;:::o;3725:195::-;3828:12;3860:52;3882:6;3890:4;3896:1;3899:12;3860:21;:52::i;:::-;3853:59;;3725:195;;;;;:::o;3975:129:5:-;4048:4;4095:1;4072:3;:12;;:19;4085:5;4072:19;;;;;;;;;;;;:24;;4065:31;;3975:129;;;;:::o;4777:530:0:-;4904:12;4962:5;4937:21;:30;;4929:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5029:18;5040:6;5029:10;:18::i;:::-;5021:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5155:12;5169:23;5196:6;:11;;5216:5;5224:4;5196:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5154:75;;;;5247:52;5265:7;5274:10;5286:12;5247:17;:52::i;:::-;5240:59;;;;4777:530;;;;;;:::o;7317:742::-;7432:12;7461:7;7457:595;;;7492:10;7485:17;;;;7457:595;7626:1;7606:10;:17;:21;7602:439;;;7869:10;7863:17;7930:15;7917:10;7913:2;7909:19;7902:44;7817:148;8012:12;8005:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7317:742;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://f07c224ba4690ef6c2b93b64cddc948ed5c9c47222b12160de3a04a63240ec43
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.