ETH Price: $1,863.38 (-13.17%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Settle Address164247212023-01-17 6:27:351115 days ago1673936855IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0011210515.80042643
Settle Address164247202023-01-17 6:27:231115 days ago1673936843IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0011128615.68497188
Settle Address164247192023-01-17 6:27:111115 days ago1673936831IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0011049815.57386807
Settle Address164247182023-01-17 6:26:591115 days ago1673936819IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0009940914.01094105
Settle Address164247162023-01-17 6:26:351115 days ago1673936795IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0011244415.84815594
Settle Address164247152023-01-17 6:26:231115 days ago1673936783IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0018464516.33803414
Settle Address164247142023-01-17 6:26:111115 days ago1673936771IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0019822216.82477003
Settle Address164247132023-01-17 6:25:591115 days ago1673936759IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0019923116.91036162
Settle Address164247122023-01-17 6:25:471115 days ago1673936747IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0019957716.9397517
Settle Address164247112023-01-17 6:25:351115 days ago1673936735IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0021009217.83228494
Settle Address164247102023-01-17 6:25:231115 days ago1673936723IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0021045318.62157918
Settle Address164247092023-01-17 6:25:111115 days ago1673936711IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0020331117.25665573
Settle Address164247082023-01-17 6:24:591115 days ago1673936699IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0018270215.50741801
Settle Address164247072023-01-17 6:24:471115 days ago1673936687IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0018647215.82744232
Settle Address163749912023-01-10 7:43:591122 days ago1673336639IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0019498816.90907215
Settle Address163203652023-01-02 16:44:471130 days ago1672677887IN
0x32E8Ab1E...7e451d2aE
0 ETH0.001948216.89446415
Settle Address163061742022-12-31 17:15:471132 days ago1672506947IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0010375715.15792082
Settle Address162947042022-12-30 2:49:231133 days ago1672368563IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0010072514.71496099
Settle Address162798142022-12-28 0:58:111135 days ago1672189091IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0016219314.06509796
Settle Address162631192022-12-25 17:01:351138 days ago1671987695IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0008009811.70160944
Redeem NFT Curat...162631152022-12-25 17:00:471138 days ago1671987647IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0014841810.9207884
Settle Address162627662022-12-25 15:50:471138 days ago1671983447IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0008663212.6561524
Settle Address162597702022-12-25 5:47:351138 days ago1671947255IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0008108111.84524304
Settle Address162597662022-12-25 5:46:471138 days ago1671947207IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0007680611.22061269
Settle Address162596022022-12-25 5:13:591138 days ago1671945239IN
0x32E8Ab1E...7e451d2aE
0 ETH0.0007548911.02831596
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer164247212023-01-17 6:27:351115 days ago1673936855
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer164247202023-01-17 6:27:231115 days ago1673936843
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer164247192023-01-17 6:27:111115 days ago1673936831
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer164247182023-01-17 6:26:591115 days ago1673936819
0x32E8Ab1E...7e451d2aE
0.552 ETH
Transfer164247162023-01-17 6:26:351115 days ago1673936795
0x32E8Ab1E...7e451d2aE
0.552 ETH
Transfer164247152023-01-17 6:26:231115 days ago1673936783
0x32E8Ab1E...7e451d2aE
0.00078666 ETH
Transfer164247142023-01-17 6:26:111115 days ago1673936771
0x32E8Ab1E...7e451d2aE
0.00034666 ETH
Transfer164247132023-01-17 6:25:591115 days ago1673936759
0x32E8Ab1E...7e451d2aE
0.00047833 ETH
Transfer164247122023-01-17 6:25:471115 days ago1673936747
0x32E8Ab1E...7e451d2aE
0.00054499 ETH
Transfer164247112023-01-17 6:25:351115 days ago1673936735
0x32E8Ab1E...7e451d2aE
0.00058666 ETH
Transfer164247102023-01-17 6:25:231115 days ago1673936723
0x32E8Ab1E...7e451d2aE
0.05165983 ETH
Transfer164247092023-01-17 6:25:111115 days ago1673936711
0x32E8Ab1E...7e451d2aE
0.05631166 ETH
Transfer164247082023-01-17 6:24:591115 days ago1673936699
0x32E8Ab1E...7e451d2aE
0.09670916 ETH
Transfer164247072023-01-17 6:24:471115 days ago1673936687
0x32E8Ab1E...7e451d2aE
0.09891266 ETH
Transfer163749912023-01-10 7:43:591122 days ago1673336639
0x32E8Ab1E...7e451d2aE
0.00107999 ETH
Transfer163203652023-01-02 16:44:471130 days ago1672677887
0x32E8Ab1E...7e451d2aE
0.11923383 ETH
Transfer163061742022-12-31 17:15:471132 days ago1672506947
0x32E8Ab1E...7e451d2aE
3.312 ETH
Transfer162947042022-12-30 2:49:231133 days ago1672368563
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer162798142022-12-28 0:58:111135 days ago1672189091
0x32E8Ab1E...7e451d2aE
0.00062666 ETH
Transfer162631192022-12-25 17:01:351138 days ago1671987695
0x32E8Ab1E...7e451d2aE
3.036 ETH
Transfer162627662022-12-25 15:50:471138 days ago1671983447
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer162597702022-12-25 5:47:351138 days ago1671947255
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer162597662022-12-25 5:46:471138 days ago1671947207
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer162596022022-12-25 5:13:591138 days ago1671945239
0x32E8Ab1E...7e451d2aE
0.276 ETH
Transfer162593042022-12-25 4:13:471138 days ago1671941627
0x32E8Ab1E...7e451d2aE
0.276 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LPDA

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-12-06
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

/// @dev Initialization call information
struct InitInfo {
    // Address of target contract
    address target;
    // Initialization data
    bytes data;
    // Merkle proof for call
    bytes32[] proof;
}

/// @dev Interface for Vault proxy contract
interface IVault {
    /// @dev Emitted when execution reverted with no reason
    error ExecutionReverted();
    /// @dev Emitted when the caller is not the owner
    error NotAuthorized(address _caller, address _target, bytes4 _selector);
    /// @dev Emitted when the caller is not the owner
    error NotOwner(address _owner, address _caller);
    /// @dev Emitted when the caller is not the factory
    error NotFactory(address _factory, address _caller);
    /// @dev Emitted when passing an EOA or an undeployed contract as the target
    error TargetInvalid(address _target);

    /// @dev Event log for executing transactions
    /// @param _target Address of target contract
    /// @param _data Transaction data being executed
    /// @param _response Return data of delegatecall
    event Execute(address indexed _target, bytes _data, bytes _response);

    function execute(
        address _target,
        bytes memory _data,
        bytes32[] memory _proof
    ) external payable returns (bool success, bytes memory response);

    function MERKLE_ROOT() external view returns (bytes32);

    function OWNER() external view returns (address);

    function FACTORY() external view returns (address);
}

/// @dev Vault permissions
struct Permission {
    // Address of module contract
    address module;
    // Address of target contract
    address target;
    // Function selector from target contract
    bytes4 selector;
}

/// @dev Vault information
struct VaultInfo {
    // Address of Rae token contract
    address token;
    // ID of the token type
    uint256 id;
}

/// @dev Interface for VaultRegistry contract
interface IVaultRegistry {
    /// @dev Emitted when the caller is not the controller
    error InvalidController(address _controller, address _sender);
    /// @dev Emitted when the caller is not a registered vault
    error UnregisteredVault(address _sender);

    /// @dev Event log for deploying vault
    /// @param _vault Address of the vault
    /// @param _token Address of the token
    /// @param _id Id of the token
    event VaultDeployed(address indexed _vault, address indexed _token, uint256 indexed _id);

    function createFor(
        bytes32 _merkleRoot,
        address _owner,
        InitInfo[] calldata _calls
    ) external returns (address vault);

    function createFor(bytes32 _merkleRoot, address _owner) external returns (address vault);

    function create(bytes32 _merkleRoot, InitInfo[] calldata _calls)
        external
        returns (address vault);

    function create(bytes32 _merkleRoot) external returns (address vault);

    function createCollectionFor(
        bytes32 _merkleRoot,
        address _controller,
        InitInfo[] calldata _calls
    ) external returns (address vault, address token);

    function createCollection(bytes32 _merkleRoot, InitInfo[] calldata _calls)
        external
        returns (address vault, address token);

    function createInCollection(
        bytes32 _merkleRoot,
        address _token,
        InitInfo[] calldata _calls
    ) external returns (address vault);

    function factory() external view returns (address);

    function rae() external view returns (address);

    function raeImplementation() external view returns (address);

    function burn(address _from, uint256 _value) external;

    function mint(address _to, uint256 _value) external;

    function nextId(address) external view returns (uint256);

    function totalSupply(address _vault) external view returns (uint256);

    function uri(address _vault) external view returns (string memory);

    function vaultToToken(address) external view returns (address token, uint256 id);
}

/// @dev Interface for generic Module contract
interface IModule {
    function getLeaves() external view returns (bytes32[] memory leaves);

    function getUnhashedLeaves() external view returns (bytes[] memory leaves);

    function getPermissions() external view returns (Permission[] memory permissions);
}

/// @title Module
/// @author Tessera
/// @notice Base module contract for converting vault permissions into leaf nodes
contract Module is IModule {
    /// @notice Gets the list of hashed leaf nodes used to generate a merkle tree
    /// @dev Leaf nodes are hashed permissions of the merkle tree
    /// @return leaves Hashed leaf nodes
    function getLeaves() external view returns (bytes32[] memory leaves) {
        Permission[] memory permissions = getPermissions();
        uint256 length = permissions.length;
        leaves = new bytes32[](length);
        unchecked {
            for (uint256 i; i < length; ++i) {
                leaves[i] = keccak256(abi.encode(permissions[i]));
            }
        }
    }

    /// @notice Gets the list of unhashed leaf nodes used to generate a merkle tree
    /// @dev Only used for third party APIs (Lanyard) that require unhashed leaves
    /// @return leaves Unhashed leaf nodes
    function getUnhashedLeaves() external view returns (bytes[] memory leaves) {
        Permission[] memory permissions = getPermissions();
        uint256 length = permissions.length;
        leaves = new bytes[](length);
        unchecked {
            for (uint256 i; i < length; ++i) {
                leaves[i] = abi.encode(permissions[i]);
            }
        }
    }

    /// @notice Gets the list of permissions installed on a vault
    /// @dev Intentionally left empty to be overridden by the module inheriting from this contract
    /// @return permissions List of vault permissions
    function getPermissions() public view virtual returns (Permission[] memory permissions) {}
}

/// @dev Interface for generic Protoform contract
interface IProtoform {
    /// @dev Event log for modules that are enabled on a vault
    /// @param _vault The vault deployed
    /// @param _modules The modules being activated on deployed vault
    event ActiveModules(address indexed _vault, address[] _modules);

    function generateMerkleTree(address[] memory _modules)
        external
        view
        returns (bytes32[] memory tree);

    function generateUnhashedMerkleTree(address[] memory _modules)
        external
        view
        returns (bytes[] memory tree);
}

/// @title Merkle Base
/// @author Modified from Murky (https://github.com/dmfxyz/murky/blob/main/src/common/MurkyBase.sol)
/// @notice Utility contract for generating merkle roots and verifying proofs
abstract contract MerkleBase {
    constructor() {}

    /// @notice Hashes two leaf pairs
    /// @param _left Node on left side of tree level
    /// @param _right Node on right side of tree level
    /// @return data Result hash of node params
    function hashLeafPairs(bytes32 _left, bytes32 _right) public pure returns (bytes32 data) {
        // Return opposite node if checked node is of bytes zero value
        if (_left == bytes32(0)) return _right;
        if (_right == bytes32(0)) return _left;

        assembly {
            // TODO: This can be aesthetically simplified with a switch. Not sure it will
            // save much gas but there are other optimizations to be had in here.
            if or(lt(_left, _right), eq(_left, _right)) {
                mstore(0x0, _left)
                mstore(0x20, _right)
            }
            if gt(_left, _right) {
                mstore(0x0, _right)
                mstore(0x20, _left)
            }
            data := keccak256(0x0, 0x40)
        }
    }

    /// @notice Verifies the merkle proof of a given value
    /// @param _root Hash of merkle root
    /// @param _proof Merkle proof
    /// @param _valueToProve Leaf node being proven
    /// @return Status of proof verification
    function verifyProof(
        bytes32 _root,
        bytes32[] memory _proof,
        bytes32 _valueToProve
    ) public pure returns (bool) {
        // proof length must be less than max array size
        bytes32 rollingHash = _valueToProve;
        unchecked {
            for (uint256 i = 0; i < _proof.length; ++i) {
                rollingHash = hashLeafPairs(rollingHash, _proof[i]);
            }
        }
        return _root == rollingHash;
    }

    /// @notice Generates the merkle root of a tree
    /// @param _data Leaf nodes of the merkle tree
    /// @return Hash of merkle root
    function getRoot(bytes32[] memory _data) public pure returns (bytes32) {
        require(_data.length > 1, "wont generate root for single leaf");
        while (_data.length > 1) {
            _data = hashLevel(_data);
        }
        return _data[0];
    }

    /// @notice Generates the merkle proof for a leaf node in a given tree
    /// @param _data Leaf nodes of the merkle tree
    /// @param _node Index of the node in the tree
    /// @return proof Merkle proof
    function getProof(bytes32[] memory _data, uint256 _node)
        public
        pure
        returns (bytes32[] memory proof)
    {
        require(_data.length > 1, "wont generate proof for single leaf");
        // The size of the proof is equal to the ceiling of log2(numLeaves)
        uint256 size = log2ceil_naive(_data.length);
        bytes32[] memory result = new bytes32[](size);
        uint256 pos;
        uint256 counter;

        // Two overflow risks: node, pos
        // node: max array size is 2**256-1. Largest index in the array will be 1 less than that. Also,
        // for dynamic arrays, size is limited to 2**64-1
        // pos: pos is bounded by log2(data.length), which should be less than type(uint256).max
        while (_data.length > 1) {
            unchecked {
                if (_node % 2 == 1) {
                    result[pos] = _data[_node - 1];
                } else if (_node + 1 == _data.length) {
                    result[pos] = bytes32(0);
                    ++counter;
                } else {
                    result[pos] = _data[_node + 1];
                }
                ++pos;
                _node = _node / 2;
            }
            _data = hashLevel(_data);
        }

        // Dynamic array to filter out address(0) since proof size is rounded up
        // This is done to return the actual proof size of the indexed node
        uint256 offset;
        proof = new bytes32[](size - counter);
        unchecked {
            for (uint256 i; i < size; ++i) {
                if (result[i] != bytes32(0)) {
                    proof[i - offset] = result[i];
                } else {
                    ++offset;
                }
            }
        }
    }

    /// @dev Hashes nodes at the given tree level
    /// @param _data Nodes at the current level
    /// @return result Hashes of nodes at the next level
    function hashLevel(bytes32[] memory _data) private pure returns (bytes32[] memory result) {
        // Function is private, and all internal callers check that data.length >=2.
        // Underflow is not possible as lowest possible value for data/result index is 1
        // overflow should be safe as length is / 2 always.
        unchecked {
            uint256 length = _data.length;
            if (length & 0x1 == 1) {
                result = new bytes32[]((length >> 1) + 1);
                result[result.length - 1] = hashLeafPairs(_data[length - 1], bytes32(0));
            } else {
                result = new bytes32[](length >> 1);
            }

            // pos is upper bounded by data.length / 2, so safe even if array is at max size
            uint256 pos;
            for (uint256 i; i < length - 1; i += 2) {
                result[pos] = hashLeafPairs(_data[i], _data[i + 1]);
                ++pos;
            }
        }
    }

    /// @notice Calculates proof size based on size of tree
    /// @dev Note that x is assumed > 0 and proof size is not precise
    /// @param x Size of the merkle tree
    /// @return ceil Rounded value of proof size
    function log2ceil_naive(uint256 x) public pure returns (uint256 ceil) {
        uint256 pOf2;
        // If x is a power of 2, then this function will return a ceiling
        // that is 1 greater than the actual ceiling. So we need to check if
        // x is a power of 2, and subtract one from ceil if so.
        assembly {
            // we check by seeing if x == (~x + 1) & x. This applies a mask
            // to find the lowest set bit of x and then checks it for equality
            // with x. If they are equal, then x is a power of 2.

            /* Example
                x has single bit set
                x := 0000_1000
                (~x + 1) = (1111_0111) + 1 = 1111_1000
                (1111_1000 & 0000_1000) = 0000_1000 == x
                x has multiple bits set
                x := 1001_0010
                (~x + 1) = (0110_1101 + 1) = 0110_1110
                (0110_1110 & x) = 0000_0010 != x
            */

            // we do some assembly magic to treat the bool as an integer later on
            pOf2 := eq(and(add(not(x), 1), x), x)
        }

        // if x == type(uint256).max, than ceil is capped at 256
        // if x == 0, then pO2 == 0, so ceil won't underflow
        unchecked {
            while (x > 0) {
                x >>= 1;
                ceil++;
            }
            ceil -= pOf2;
        }
    }
}

/// @title Protoform
/// @author Tessera
/// @notice Base protoform contract for generating merkle trees
contract Protoform is IProtoform, MerkleBase {
    /// @notice Generates a merkle tree from the hashed permissions of the given modules
    /// @param _modules List of module contracts
    /// @return tree Merkle tree of hashed leaf nodes
    function generateMerkleTree(address[] memory _modules)
        public
        view
        returns (bytes32[] memory tree)
    {
        uint256 counter;
        uint256 modulesLength = _modules.length;
        uint256 treeSize = _getTreeSize(_modules, modulesLength);
        tree = new bytes32[](treeSize);
        unchecked {
            /* _sortList(_modules, modulesLength); */
            for (uint256 i; i < modulesLength; ++i) {
                bytes32[] memory leaves = IModule(_modules[i]).getLeaves();
                uint256 leavesLength = leaves.length;
                for (uint256 j; j < leavesLength; ++j) {
                    tree[counter++] = leaves[j];
                }
            }
        }
    }

    /// @notice Generates a merkle tree from the unhashed permissions of the given modules
    /// @dev Only used for third party APIs (Lanyard) that require unhashed leaves
    /// @param _modules List of module contracts
    /// @return tree Merkle tree of unhashed leaf nodes
    function generateUnhashedMerkleTree(address[] memory _modules)
        public
        view
        returns (bytes[] memory tree)
    {
        uint256 counter;
        uint256 modulesLength = _modules.length;
        uint256 treeSize = _getTreeSize(_modules, modulesLength);
        tree = new bytes[](treeSize);
        unchecked {
            /* _sortList(_modules, modulesLength); */
            for (uint256 i; i < modulesLength; ++i) {
                bytes[] memory leaves = IModule(_modules[i]).getUnhashedLeaves();
                uint256 leavesLength = leaves.length;
                for (uint256 j; j < leavesLength; ++j) {
                    tree[counter++] = leaves[j];
                }
            }
        }
    }

    /// @dev Gets the size of a merkle tree based on the total permissions across all modules
    /// @param _modules List of module contracts
    /// @param _length Size of modules array
    /// @return size Total size of the merkle tree
    function _getTreeSize(address[] memory _modules, uint256 _length)
        internal
        view
        returns (uint256 size)
    {
        unchecked {
            for (uint256 i; i < _length; ++i) {
                size += IModule(_modules[i]).getLeaves().length;
            }
        }
    }

    /// @dev Sorts the list of modules in ascending order
    function _sortList(address[] memory _modules, uint256 _length) internal pure {
        for (uint256 i; i < _length; ++i) {
            for (uint256 j = i + 1; j < _length; ++j) {
                if (_modules[i] > _modules[j]) {
                    (_modules[i], _modules[j]) = (_modules[j], _modules[i]);
                }
            }
        }
    }
}

/// @dev Interface for Supply target contract
interface ISupply {
    /// @dev Emitted when an account being called as an assumed contract does not have code and returns no data
    error MintError(address _account);
    /// @dev Emitted when an account being called as an assumed contract does not have code and returns no data
    error BurnError(address _account);

    function mint(address _to, uint256 _value) external;

    function burn(address _from, uint256 _value) external;
}

struct LPDAInfo {
    /// the start time of the auction
    uint32 startTime;
    /// the end time of the auction
    uint32 endTime;
    /// the price decrease per second
    uint64 dropPerSecond;
    /// the price of the item at startTime
    uint128 startPrice;
    /// the price that startPrice drops down
    uint128 endPrice;
    /// the lowest price paid in a successful LPDA
    uint128 minBid;
    /// the total supply of raes being auctioned
    uint16 supply;
    /// the number of raes currently sold in the auction
    uint16 numSold;
    /// the amount of eth claimed by the curator
    uint128 curatorClaimed;
    /// the address of the curator of the auctioned item
    address curator;
}

enum LPDAState {
    NotLive,
    Live,
    Successful,
    NotSuccessful
}

interface ILPDA {
    event CreatedLPDA(
        address indexed _vault,
        address indexed _token,
        uint256 _id,
        LPDAInfo _lpdaInfo
    );

    /// @notice event emitted when a new bid is entered
    event BidEntered(
        address indexed _vault,
        address indexed _user,
        uint256 _quantity,
        uint256 _price
    );

    /// @notice event emitted when settling an auction and a user is owed a refund
    event Refunded(address indexed _vault, address indexed _user, uint256 _balance);

    /// @notice event emitted when settling a successful auction with minted quantity
    event MintedRaes(
        address indexed _vault,
        address indexed _user,
        uint256 _quantity,
        uint256 _price
    );

    /// @notice event emitted when settling a successful auction with curator receiving a percentage
    event CuratorClaimed(address indexed _vault, address indexed _curator, uint256 _amount);

    /// @notice event emitted when settling a successful auction and fees dispersed
    event FeeDispersed(address indexed _vault, address indexed _receiver, uint256 _amount);

    /// @notice event emitted when settling a successful auction and royalty assessed
    event RoyaltyPaid(address indexed _vault, address indexed _royaltyReceiver, uint256 _amount);

    /// @notice event emitted after an unsuccessful auction and the curator withdraws their nft
    event CuratorRedeemedNFT(
        address indexed _vault,
        address indexed _curator,
        address indexed _token,
        uint256 _tokenId
    );

    function deployVault(
        address[] calldata _modules,
        address[] calldata _plugins,
        bytes4[] calldata _selectors,
        LPDAInfo calldata _lpdaInfo,
        address _token,
        uint256 _id,
        bytes32[] calldata _mintProof
    ) external returns (address vault);

    function enterBid(address _vault, uint16 _amount) external payable;

    function settleAddress(address _vault, address _minter) external;

    function settleCurator(address _vault) external;

    function redeemNFTCurator(
        address _vault,
        address _token,
        uint256 _tokenId,
        bytes32[] calldata _erc721TransferProof
    ) external;

    function updateFeeReceiver(address _receiver) external;

    function currentPrice(address _vault) external returns (uint256 price);

    function getAuctionState(address _vault) external returns (LPDAState state);

    function refundOwed(address _vault, address _minter) external returns (uint256 owed);
}

library LibLPDAInfo {
    function getAuctionState(LPDAInfo memory _info) internal view returns (LPDAState) {
        if (isNotLive(_info)) return LPDAState.NotLive;
        if (isLive(_info)) return LPDAState.Live;
        if (isSuccessful(_info)) return LPDAState.Successful;
        return LPDAState.NotSuccessful;
    }

    function isNotLive(LPDAInfo memory _info) internal view returns (bool) {
        return (_info.startTime > block.timestamp);
    }

    function isLive(LPDAInfo memory _info) internal view returns (bool) {
        return (block.timestamp > _info.startTime &&
            block.timestamp < _info.endTime &&
            _info.numSold < _info.supply);
    }

    function isSuccessful(LPDAInfo memory _info) internal pure returns (bool) {
        return (_info.numSold == _info.supply);
    }

    function isNotSuccessful(LPDAInfo memory _info) internal view returns (bool) {
        return (block.timestamp > _info.endTime && _info.numSold < _info.supply);
    }

    function isOver(LPDAInfo memory _info) internal view returns (bool) {
        return (isNotSuccessful(_info) || isSuccessful(_info));
    }

    function remainingSupply(LPDAInfo memory _info) internal pure returns (uint256) {
        return (_info.supply - _info.numSold);
    }

    function validateAndRecordBid(
        LPDAInfo storage _info,
        uint128 price,
        uint16 amount
    ) internal {
        _validateBid(_info, price, amount);
        _info.numSold += amount;
        if (_info.numSold == _info.supply) _info.minBid = price;
    }

    function validateAuctionInfo(LPDAInfo memory _info) internal view {
        require(_info.startTime >= uint32(block.timestamp), "LPDA: Invalid time");
        require(_info.startTime < _info.endTime, "LPDA: Invalid time");
        require(_info.dropPerSecond > 0, "LPDA: Invalid drop");
        require(_info.startPrice > _info.endPrice, "LPDA: Invalid price");
        require(_info.minBid == 0, "LPDA: Invalid min bid");
        require(_info.supply > 0, "LPDA: Invalid supply");
        require(_info.numSold == 0, "LPDA: Invalid sold");
        require(_info.curatorClaimed == 0, "LPDA: Invalid curatorClaimed");
    }

    function _validateBid(
        LPDAInfo memory _info,
        uint128 price,
        uint16 amount
    ) internal view {
        require(msg.value >= (price * amount), "LPDA: Insufficient value");
        require(_info.supply != 0, "LPDA: Auction doesnt exist");
        require(remainingSupply(_info) >= amount, "LPDA: Not enough remaining");
        require(isLive(_info), "LPDA: Not Live");
        require(amount > 0, "LPDA: Must bid atleast 1 rae");
    }
}

/// @dev Interface for Transfer target contract
interface ITransfer {
    /// @dev Emitted when an ERC-20 token transfer returns a falsey value
    /// @param _token The token for which the ERC20 transfer was attempted
    /// @param _from The source of the attempted ERC20 transfer
    /// @param _to The recipient of the attempted ERC20 transfer
    /// @param _amount The amount for the attempted ERC20 transfer
    error BadReturnValueFromERC20OnTransfer(
        address _token,
        address _from,
        address _to,
        uint256 _amount
    );
    /// @dev Emitted when the transfer of ether is unsuccessful
    error ETHTransferUnsuccessful();
    /// @dev Emitted when a batch ERC-1155 token transfer reverts
    /// @param _token The token for which the transfer was attempted
    /// @param _from The source of the attempted transfer
    /// @param _to The recipient of the attempted transfer
    /// @param _identifiers The identifiers for the attempted transfer
    /// @param _amounts The amounts for the attempted transfer
    error ERC1155BatchTransferGenericFailure(
        address _token,
        address _from,
        address _to,
        uint256[] _identifiers,
        uint256[] _amounts
    );
    /// @dev Emitted when an ERC-721 transfer with amount other than one is attempted
    error InvalidERC721TransferAmount();
    /// @dev Emitted when attempting to fulfill an order where an item has an amount of zero
    error MissingItemAmount();
    /// @dev Emitted when an account being called as an assumed contract does not have code and returns no data
    /// @param _account The account that should contain code
    error NoContract(address _account);
    /// @dev Emitted when an ERC-20, ERC-721, or ERC-1155 token transfer fails
    /// @param _token The token for which the transfer was attempted
    /// @param _from The source of the attempted transfer
    /// @param _to The recipient of the attempted transfer
    /// @param _identifier The identifier for the attempted transfer
    /// @param _amount The amount for the attempted transfer
    error TokenTransferGenericFailure(
        address _token,
        address _from,
        address _to,
        uint256 _identifier,
        uint256 _amount
    );

    function ETHTransfer(address _to, uint256 _value) external returns (bool);

    function ERC20Transfer(
        address _token,
        address _to,
        uint256 _value
    ) external;

    function ERC721TransferFrom(
        address _token,
        address _from,
        address _to,
        uint256 _tokenId
    ) external;

    function ERC1155TransferFrom(
        address _token,
        address _from,
        address _to,
        uint256 _id,
        uint256 _value
    ) external;

    function ERC1155BatchTransferFrom(
        address _token,
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values
    ) external;
}

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

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

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

/// @notice Minimalist and modern Wrapped Ether implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/WETH.sol)
/// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol)
contract WETH is ERC20("Wrapped Ether", "WETH", 18) {
    using SafeTransferLib for address;

    event Deposit(address indexed from, uint256 amount);

    event Withdrawal(address indexed to, uint256 amount);

    function deposit() public payable virtual {
        _mint(msg.sender, msg.value);

        emit Deposit(msg.sender, msg.value);
    }

    function withdraw(uint256 amount) public virtual {
        _burn(msg.sender, amount);

        emit Withdrawal(msg.sender, amount);

        msg.sender.safeTransferETH(amount);
    }

    receive() external payable virtual {
        deposit();
    }
}

/// @title SafeSend
/// @author Tessera
/// @notice Utility contract for sending Ether or WETH value to an address
abstract contract SafeSend {
    /// @notice Address for WETH contract on network
    /// mainnet: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address payable public immutable WETH_ADDRESS;

    constructor(address payable _weth) {
        WETH_ADDRESS = _weth;
    }

    /// @notice Attempts to send ether to an address
    /// @param _to Address attemping to send to
    /// @param _value Amount to send
    /// @return success Status of transfer
    function _attemptETHTransfer(address _to, uint256 _value) internal returns (bool success) {
        // Here increase the gas limit a reasonable amount above the default, and try
        // to send ETH to the recipient.
        // NOTE: This might allow the recipient to attempt a limited reentrancy attack.
        (success, ) = _to.call{value: _value, gas: 30000}("");
    }

    /// @notice Sends eth or weth to an address
    /// @param _to Address to send to
    /// @param _value Amount to send
    function _sendEthOrWeth(address _to, uint256 _value) internal {
        if (!_attemptETHTransfer(_to, _value)) {
            WETH(WETH_ADDRESS).deposit{value: _value}();
            WETH(WETH_ADDRESS).transfer(_to, _value);
        }
    }
}

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

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

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

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

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

/// @notice Minimalist and gas efficient standard ERC1155 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 amount
    );

    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] amounts
    );

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

    event URI(string value, uint256 indexed id);

    /*//////////////////////////////////////////////////////////////
                             ERC1155 STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(address => mapping(uint256 => uint256)) public balanceOf;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                             METADATA LOGIC
    //////////////////////////////////////////////////////////////*/

    function uri(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                              ERC1155 LOGIC
    //////////////////////////////////////////////////////////////*/

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) public virtual {
        require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");

        balanceOf[from][id] -= amount;
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, from, to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) public virtual {
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");

        // Storing these outside the loop saves ~15 gas per iteration.
        uint256 id;
        uint256 amount;

        for (uint256 i = 0; i < ids.length; ) {
            id = ids[i];
            amount = amounts[i];

            balanceOf[from][id] -= amount;
            balanceOf[to][id] += amount;

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, from, to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids)
        public
        view
        virtual
        returns (uint256[] memory balances)
    {
        require(owners.length == ids.length, "LENGTH_MISMATCH");

        balances = new uint256[](owners.length);

        // Unchecked because the only math done is incrementing
        // the array index counter which cannot possibly overflow.
        unchecked {
            for (uint256 i = 0; i < owners.length; ++i) {
                balances[i] = balanceOf[owners[i]][ids[i]];
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, address(0), to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[to][ids[i]] += amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, address(0), to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchBurn(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[from][ids[i]] -= amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                ++i;
            }
        }

        emit TransferBatch(msg.sender, from, address(0), ids, amounts);
    }

    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        balanceOf[from][id] -= amount;

        emit TransferSingle(msg.sender, from, address(0), id, amount);
    }
}

/// @notice A generic interface for a contract which properly accepts ERC1155 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155TokenReceiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
    }
}

/// @title NFT Receiver
/// @author Tessera
/// @notice Plugin contract for handling receipts of non-fungible tokens
contract NFTReceiver is ERC721TokenReceiver, ERC1155TokenReceiver {
    /// @notice Handles the receipt of a single ERC721 token
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual override returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }

    /// @notice Handles the receipt of a single ERC1155 token type
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes calldata
    ) external virtual override returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155Received.selector;
    }

    /// @notice Handles the receipt of multiple ERC1155 token types
    function onERC1155BatchReceived(
        address,
        address,
        uint256[] calldata,
        uint256[] calldata,
        bytes calldata
    ) external virtual override returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
    }
}

/// @dev Interface for Minter module contract
interface IMinter {
    function getPermissions() external view returns (Permission[] memory permissions);

    function supply() external view returns (address);
}

/// @title Minter
/// @author Tessera
/// @notice Module contract for minting a fixed supply of Raes
contract Minter is IMinter, Module {
    /// @notice Address of Supply target contract
    address public immutable supply;

    /// @notice Initializes supply target contract
    constructor(address _supply) {
        supply = _supply;
    }

    /// @notice Gets the list of permissions installed on a vault
    /// @dev Permissions consist of a module contract, target contract, and function selector
    /// @return permissions A list of Permission Structs
    function getPermissions()
        public
        view
        virtual
        override(IMinter, Module)
        returns (Permission[] memory permissions)
    {
        permissions = new Permission[](1);
        permissions[0] = Permission(address(this), supply, ISupply.mint.selector);
    }

    /// @notice Mints a Rae supply
    /// @param _vault Address of the Vault
    /// @param _to Address of the receiver of Raes
    /// @param _raeSupply Number of NFT Raes minted to control the vault
    /// @param _mintProof List of proofs to execute a mint function
    function _mintRaes(
        address _vault,
        address _to,
        uint256 _raeSupply,
        bytes32[] calldata _mintProof
    ) internal {
        bytes memory data = abi.encodeCall(ISupply.mint, (_to, _raeSupply));
        IVault(payable(_vault)).execute(supply, data, _mintProof);
    }
}

/// @notice Gas optimized reentrancy protection for smart contracts.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ReentrancyGuard.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
    uint256 private locked = 1;

    modifier nonReentrant() virtual {
        require(locked == 1, "REENTRANCY");

        locked = 2;

        _;

        locked = 1;
    }
}

/// @dev Interface for ERC-721 token contract
interface IERC721 {
    event Approval(address indexed _owner, address indexed _spender, uint256 indexed _id);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _id);

    function approve(address _spender, uint256 _id) external;

    function balanceOf(address _owner) external view returns (uint256);

    function getApproved(uint256) external view returns (address);

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

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

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

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id
    ) external;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        bytes memory _data
    ) external;

    function setApprovalForAll(address _operator, bool _approved) external;

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

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

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

    function transferFrom(
        address _from,
        address _to,
        uint256 _id
    ) external;
}

/// @dev Interface for ERC-1155 token contract
interface IERC1155 {
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    event TransferBatch(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256[] _ids,
        uint256[] _amounts
    );
    event TransferSingle(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256 _id,
        uint256 _amount
    );
    event URI(string _value, uint256 indexed _id);

    function balanceOf(address, uint256) external view returns (uint256);

    function balanceOfBatch(address[] memory _owners, uint256[] memory ids)
        external
        view
        returns (uint256[] memory balances);

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

    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] memory _ids,
        uint256[] memory _amounts,
        bytes memory _data
    ) external;

    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _amount,
        bytes memory _data
    ) external;

    function setApprovalForAll(address _operator, bool _approved) external;

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

    function uri(uint256 _id) external view returns (string memory);
}

// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

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

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

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

/// @title LPDA
/// @author Tessera
/// @notice Last Price Dutch Auction contract for distributing Raes
contract LPDA is ILPDA, Protoform, Minter, ReentrancyGuard, SafeSend, NFTReceiver {
    using LibLPDAInfo for LPDAInfo;
    /// @notice Address of VaultRegistry contract
    address public immutable registry;
    /// @notice Address of Transfer target contract
    address public immutable transfer;
    /// @notice Address of fee receiver on initial distrubtion
    address public feeReceiver;
    /// @notice Max fee a curator will pay
    uint256 public constant MAX_FEE = 1250;
    /// @notice vault => user => total amount paid by user
    mapping(address => mapping(address => uint256)) public balanceContributed;
    /// @notice vault => user => total amount refunded to user
    mapping(address => mapping(address => uint256)) public balanceRefunded;
    /// @notice vault => user => total # of raes minted by user
    mapping(address => mapping(address => uint256)) public numMinted;
    /// @notice vault => royalty token
    mapping(address => address) public vaultRoyaltyToken;
    /// @notice vault => royalty token Id
    mapping(address => uint256) public vaultRoyaltyTokenId;
    /// @notice vault => auction info struct for LPDA
    mapping(address => LPDAInfo) public vaultLPDAInfo;
    /// @notice vault => enumerated list of minters for the LPDA
    mapping(address => address[]) public vaultLPDAMinters;

    constructor(
        address _registry,
        address _supply,
        address _transfer,
        address payable _weth,
        address _feeReceiver
    ) Minter(_supply) SafeSend(_weth) {
        registry = _registry;
        transfer = _transfer;
        feeReceiver = _feeReceiver;
    }

    /// @notice Deploys a new Vault and mints initial supply of Raes
    /// @param _modules The list of modules to be installed on the vault
    function deployVault(
        address[] calldata _modules,
        address[] calldata _plugins,
        bytes4[] calldata _selectors,
        LPDAInfo calldata _lpdaInfo,
        address _token,
        uint256 _id,
        bytes32[] calldata _mintProof
    ) external returns (address vault) {
        _lpdaInfo.validateAuctionInfo();
        bytes32[] memory leafNodes = generateMerkleTree(_modules);
        bytes32 merkleRoot = getRoot(leafNodes);
        vault = IVaultRegistry(registry).create(merkleRoot);
        if (IERC165(_token).supportsInterface(type(IERC2981).interfaceId))
            (vaultRoyaltyToken[vault] = _token, vaultRoyaltyTokenId[vault] = _id);

        vaultLPDAInfo[vault] = _lpdaInfo;

        IERC721(_token).transferFrom(msg.sender, vault, _id);
        _mintRaes(vault, address(this), _lpdaInfo.supply, _mintProof);

        emit ActiveModules(vault, _modules);
        emit CreatedLPDA(vault, _token, _id, _lpdaInfo);
    }

    /// @notice Enters a bid for a given vault
    /// @param _vault The vault to bid on raes for
    /// @param _amount The quantity of raes to bid for
    function enterBid(address _vault, uint16 _amount) external payable {
        LPDAInfo storage lpda = vaultLPDAInfo[_vault];
        uint256 price = currentPrice(_vault);
        lpda.validateAndRecordBid(uint128(price), _amount);

        vaultLPDAMinters[_vault].push(msg.sender);
        balanceContributed[_vault][msg.sender] += msg.value;
        numMinted[_vault][msg.sender] += _amount;

        emit BidEntered(_vault, msg.sender, _amount, price);
    }

    /// @notice Settles the auction for a given vault's LPDA
    /// @param _vault The vault to settle the LPDA for
    /// @param _minter The minter to settle their share of the LPDA
    function settleAddress(address _vault, address _minter) external nonReentrant {
        LPDAInfo memory lpda = vaultLPDAInfo[_vault];
        require(lpda.isOver(), "LPDA: Auction NOT over");
        uint256 amount = numMinted[_vault][_minter];
        delete numMinted[_vault][_minter];
        if (lpda.isSuccessful()) {
            (address token, uint256 id) = IVaultRegistry(registry).vaultToToken(_vault);
            IERC1155(token).safeTransferFrom(address(this), _minter, id, amount, "");
            _refundAddress(_vault, _minter, amount, lpda.minBid);
            emit MintedRaes(_vault, _minter, amount, lpda.minBid);
        } else if (lpda.isNotSuccessful()) {
            _refundAddress(_vault, _minter, amount, lpda.minBid);
        } else {
            revert("LPDA: Auction NOT over");
        }
    }

    /// @notice Settles the curators account for a given vault
    /// @notice _vault The vault to settle the curator for
    function settleCurator(address _vault) external nonReentrant {
        LPDAInfo storage lpda = vaultLPDAInfo[_vault];
        require(lpda.isSuccessful(), "LPDA: Not sold out");
        require(lpda.curatorClaimed == 0, "LPDA: Curator already claimed");
        uint256 total = lpda.minBid * lpda.numSold;
        uint256 min = lpda.endPrice * lpda.numSold;
        uint256 feePercent = MAX_FEE;
        if (min != 0) {
            uint256 diff = total - min;
            feePercent = ((diff * 1e18) / (min * 5) / 1e14) + 250;
            feePercent = feePercent > MAX_FEE ? MAX_FEE : feePercent;
        }
        uint256 fee = (feePercent * total) / 1e4;
        lpda.curatorClaimed += uint128(total);
        address token = vaultRoyaltyToken[_vault];
        uint256 id = vaultRoyaltyTokenId[_vault];
        (address royaltyReceiver, uint256 royaltyAmount) = token == address(0)
            ? (address(0), 0)
            : IERC2981(token).royaltyInfo(id, total);
        _sendEthOrWeth(royaltyReceiver, royaltyAmount);
        emit RoyaltyPaid(_vault, royaltyReceiver, royaltyAmount);
        _sendEthOrWeth(feeReceiver, fee);
        emit FeeDispersed(_vault, feeReceiver, fee);
        _sendEthOrWeth(lpda.curator, total - fee - royaltyAmount);
        emit CuratorClaimed(_vault, lpda.curator, total - fee - royaltyAmount);
    }

    /// @notice Redeems the curator's NFT for a given vault if the LPDA was unsuccessful
    /// @param _vault The vault to redeem the curator's NFT for
    /// @param _token The token contract to redeem
    /// @param _tokenId The tokenId to redeem
    /// @param _erc721TransferProof The proofs required to transfer the NFT
    function redeemNFTCurator(
        address _vault,
        address _token,
        uint256 _tokenId,
        bytes32[] calldata _erc721TransferProof
    ) external {
        LPDAInfo memory lpda = vaultLPDAInfo[_vault];
        require(lpda.isNotSuccessful(), "LPDA: Auction NOT Successful");
        require(msg.sender == lpda.curator, "LPDA: Not curator");

        bytes memory data = abi.encodeCall(
            ITransfer.ERC721TransferFrom,
            (_token, _vault, msg.sender, _tokenId)
        );
        IVault(payable(_vault)).execute(transfer, data, _erc721TransferProof);

        emit CuratorRedeemedNFT(_vault, msg.sender, _token, _tokenId);
    }

    /// @notice Transfer the feeReceiver account
    /// @param _receiver The new feeReceiver
    function updateFeeReceiver(address _receiver) external {
        require(msg.sender == feeReceiver, "LPDA: Not fee receiver");
        feeReceiver = _receiver;
    }

    /// @notice returns the current dutch auction price
    /// @param _vault The vault to get the current price of the LPDA for
    /// @return price The current price of the LPDA
    function currentPrice(address _vault) public view returns (uint256 price) {
        LPDAInfo memory lpda = vaultLPDAInfo[_vault];
        uint256 deduction = (block.timestamp - lpda.startTime) * lpda.dropPerSecond;
        price = (deduction > lpda.startPrice) ? 0 : lpda.startPrice - deduction;
        price = (price > lpda.endPrice) ? price : lpda.endPrice;
    }

    function getMinters(address _vault) public view returns (address[] memory) {
        return vaultLPDAMinters[_vault];
    }

    /// @notice returns the current lpda auction state for a vault
    /// @param _vault The vault to get the current auction state for
    function getAuctionState(address _vault) public view returns (LPDAState) {
        return vaultLPDAInfo[_vault].getAuctionState();
    }

    /// @notice Check the refund owned to an account
    /// @param _vault The vault to check the refund for
    /// @param _minter the acount to check the refund for
    /// @return The refund still owed to the minter account
    function refundOwed(address _vault, address _minter) public view returns (uint256) {
        LPDAInfo memory lpda = vaultLPDAInfo[_vault];
        uint256 totalCost = lpda.minBid * numMinted[_vault][_minter];
        uint256 alreadyRefunded = balanceRefunded[_vault][_minter];
        uint256 balance = balanceContributed[_vault][_minter];
        return balance - alreadyRefunded - totalCost;
    }

    /// @notice Gets the list of permissions installed on a vault
    /// @dev Permissions consist of a module contract, target contract, and function selector
    /// @return permissions A list of Permission Structs
    function getPermissions()
        public
        view
        virtual
        override(Minter)
        returns (Permission[] memory permissions)
    {
        permissions = new Permission[](2);
        permissions[0] = super.getPermissions()[0];
        permissions[1] = Permission(address(this), transfer, ITransfer.ERC721TransferFrom.selector);
    }

    function _refundAddress(
        address _vault,
        address _minter,
        uint256 _mints,
        uint128 _minBid
    ) internal {
        uint256 owed = balanceContributed[_vault][_minter];
        owed -= (_minBid * _mints + balanceRefunded[_vault][_minter]);
        if (owed > 0) {
            balanceRefunded[_vault][_minter] += owed;
            _sendEthOrWeth(_minter, owed);
            emit Refunded(_vault, _minter, owed);
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_registry","type":"address"},{"internalType":"address","name":"_supply","type":"address"},{"internalType":"address","name":"_transfer","type":"address"},{"internalType":"address payable","name":"_weth","type":"address"},{"internalType":"address","name":"_feeReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":false,"internalType":"address[]","name":"_modules","type":"address[]"}],"name":"ActiveModules","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"BidEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"components":[{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint64","name":"dropPerSecond","type":"uint64"},{"internalType":"uint128","name":"startPrice","type":"uint128"},{"internalType":"uint128","name":"endPrice","type":"uint128"},{"internalType":"uint128","name":"minBid","type":"uint128"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"numSold","type":"uint16"},{"internalType":"uint128","name":"curatorClaimed","type":"uint128"},{"internalType":"address","name":"curator","type":"address"}],"indexed":false,"internalType":"struct LPDAInfo","name":"_lpdaInfo","type":"tuple"}],"name":"CreatedLPDA","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_curator","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"CuratorClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_curator","type":"address"},{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"CuratorRedeemedNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"FeeDispersed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"MintedRaes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_vault","type":"address"},{"indexed":true,"internalType":"address","name":"_royaltyReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"RoyaltyPaid","type":"event"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balanceContributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"balanceRefunded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_modules","type":"address[]"},{"internalType":"address[]","name":"_plugins","type":"address[]"},{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"},{"components":[{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint64","name":"dropPerSecond","type":"uint64"},{"internalType":"uint128","name":"startPrice","type":"uint128"},{"internalType":"uint128","name":"endPrice","type":"uint128"},{"internalType":"uint128","name":"minBid","type":"uint128"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"numSold","type":"uint16"},{"internalType":"uint128","name":"curatorClaimed","type":"uint128"},{"internalType":"address","name":"curator","type":"address"}],"internalType":"struct LPDAInfo","name":"_lpdaInfo","type":"tuple"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes32[]","name":"_mintProof","type":"bytes32[]"}],"name":"deployVault","outputs":[{"internalType":"address","name":"vault","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"uint16","name":"_amount","type":"uint16"}],"name":"enterBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_modules","type":"address[]"}],"name":"generateMerkleTree","outputs":[{"internalType":"bytes32[]","name":"tree","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_modules","type":"address[]"}],"name":"generateUnhashedMerkleTree","outputs":[{"internalType":"bytes[]","name":"tree","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getAuctionState","outputs":[{"internalType":"enum LPDAState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeaves","outputs":[{"internalType":"bytes32[]","name":"leaves","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getMinters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPermissions","outputs":[{"components":[{"internalType":"address","name":"module","type":"address"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"internalType":"struct Permission[]","name":"permissions","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_data","type":"bytes32[]"},{"internalType":"uint256","name":"_node","type":"uint256"}],"name":"getProof","outputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_data","type":"bytes32[]"}],"name":"getRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getUnhashedLeaves","outputs":[{"internalType":"bytes[]","name":"leaves","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_left","type":"bytes32"},{"internalType":"bytes32","name":"_right","type":"bytes32"}],"name":"hashLeafPairs","outputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"log2ceil_naive","outputs":[{"internalType":"uint256","name":"ceil","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"numMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"_erc721TransferProof","type":"bytes32[]"}],"name":"redeemNFTCurator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_minter","type":"address"}],"name":"refundOwed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_minter","type":"address"}],"name":"settleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"settleCurator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transfer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultLPDAInfo","outputs":[{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"},{"internalType":"uint64","name":"dropPerSecond","type":"uint64"},{"internalType":"uint128","name":"startPrice","type":"uint128"},{"internalType":"uint128","name":"endPrice","type":"uint128"},{"internalType":"uint128","name":"minBid","type":"uint128"},{"internalType":"uint16","name":"supply","type":"uint16"},{"internalType":"uint16","name":"numSold","type":"uint16"},{"internalType":"uint128","name":"curatorClaimed","type":"uint128"},{"internalType":"address","name":"curator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaultLPDAMinters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultRoyaltyToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"vaultRoyaltyTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"bytes32","name":"_valueToProve","type":"bytes32"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]

61010060405260016000553480156200001757600080fd5b50604051620045e6380380620045e68339810160408190526200003a9162000090565b6001600160a01b0393841660805290831660a05292821660c052811660e052600180546001600160a01b0319169290911691909117905562000110565b6001600160a01b03811681146200008d57600080fd5b50565b600080600080600060a08688031215620000a957600080fd5b8551620000b68162000077565b6020870151909550620000c98162000077565b6040870151909450620000dc8162000077565b6060870151909350620000ef8162000077565b6080870151909250620001028162000077565b809150509295509295909350565b60805160a05160c05160e051614464620001826000396000818161059e0152818161136a015261220301526000818161050501528181610aba01526117c90152600081816102260152818161271601526127ab01526000818161027701528181612d980152612f9b01526144646000f3fe60806040526004361061020f5760003560e01c8063884c05fb11610118578063bc197c81116100a0578063cf1675ef1161006f578063cf1675ef14610825578063dd1d259914610852578063e312bcc714610872578063e9833c2f14610887578063f23a6e61146108a757600080fd5b8063bc197c8114610794578063bc38d61f146107c3578063c3a07df6146107e3578063c69bebe41461080557600080fd5b8063ad2b3037116100e7578063ad2b303714610716578063b3f006741461072b578063b739e31b1461074b578063b86161951461075e578063bc063e1a1461077e57600080fd5b8063884c05fb1461055f5780638a4068dd1461058c5780639fd58ae5146105c0578063ac84e879146105f857600080fd5b80632d5d43171161019b5780635b68b04d1161016a5780635b68b04d1461047d57806364e76fe91461049d57806368ecbaa5146104bd5780637b103999146104f357806380e7a8451461052757600080fd5b80632d5d4317146103c85780632e08d602146103f557806343c686ae1461041557806358161a421461044d57600080fd5b8063150b7a02116101e2578063150b7a02146102e95780632189230f1461032e57806326469c7d1461035b5780632b5c58061461037b5780632cfcad831461039b57600080fd5b8063040141e514610214578063047fc9aa1461026557806308d7090a146102995780631284b0d3146102c7575b600080fd5b34801561022057600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027157600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a557600080fd5b506102b96102b436600461325d565b6108d4565b60405190815260200161025c565b3480156102d357600080fd5b506102e76102e236600461329b565b6108fd565b005b3480156102f557600080fd5b5061031561030436600461331c565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161025c565b34801561033a57600080fd5b506102b961034936600461338e565b60066020526000908152604090205481565b34801561036757600080fd5b506102e761037636600461338e565b610c91565b34801561038757600080fd5b506102e76103963660046133f6565b61117c565b3480156103a757600080fd5b506103bb6103b636600461338e565b611441565b60405161025c9190613457565b3480156103d457600080fd5b506103e86103e3366004613511565b611511565b60405161025c9190613600565b34801561040157600080fd5b506102b96104103660046136c8565b61166c565b34801561042157600080fd5b506102b961043036600461329b565b600360209081526000928352604080842090915290825290205481565b34801561045957600080fd5b5061046d6104683660046136fc565b611706565b604051901515815260200161025c565b34801561048957600080fd5b50610248610498366004613764565b61174c565b3480156104a957600080fd5b506102486104b836600461385c565b611a42565b3480156104c957600080fd5b506102486104d836600461338e565b6005602052600090815260409020546001600160a01b031681565b3480156104ff57600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b34801561053357600080fd5b506102b961054236600461329b565b600260209081526000928352604080842090915290825290205481565b34801561056b57600080fd5b5061057f61057a366004613511565b611a7a565b60405161025c9190613888565b34801561059857600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b3480156105cc57600080fd5b506102b96105db36600461329b565b600460209081526000928352604080842090915290825290205481565b34801561060457600080fd5b5061069b61061336600461338e565b600760205260009081526040902080546001820154600283015460039093015463ffffffff80841694600160201b808604909216946001600160401b03600160401b820416946001600160801b03600160801b92839004811695828216959390920481169361ffff80821694620100008304909116939104909116906001600160a01b03168a565b6040805163ffffffff9b8c1681529a90991660208b01526001600160401b03909716978901979097526001600160801b039485166060890152928416608088015290831660a087015261ffff90811660c08701521660e08501529091166101008301526001600160a01b03166101208201526101400161025c565b34801561072257600080fd5b5061057f611bc2565b34801561073757600080fd5b50600154610248906001600160a01b031681565b6102e76107593660046138e7565b611c8d565b34801561076a57600080fd5b5061057f610779366004613915565b611dad565b34801561078a57600080fd5b506102b96104e281565b3480156107a057600080fd5b506103156107af366004613959565b63bc197c8160e01b98975050505050505050565b3480156107cf57600080fd5b506102b96107de36600461329b565b61201c565b3480156107ef57600080fd5b506107f8612162565b60405161025c9190613a48565b34801561081157600080fd5b506102e761082036600461338e565b612266565b34801561083157600080fd5b5061084561084036600461338e565b6122db565b60405161025c9190613a8a565b34801561085e57600080fd5b506102b961086d366004613acb565b612351565b34801561087e57600080fd5b506103e861239d565b34801561089357600080fd5b506102b96108a236600461338e565b612465565b3480156108b357600080fd5b506103156108c2366004613aed565b63f23a6e6160e01b9695505050505050565b60008119600101821682145b82156108f657600192831c9291909101906108e0565b9003919050565b6000546001146109415760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b60448201526064015b60405180910390fd5b600260008181556001600160a01b03808516825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c08801526201000082041660e08701529190910490921661010084015260039091015416610120820152610a0e816125a5565b610a535760405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b6001600160a01b0383811660009081526004602090815260408083209386168352929052908120805491905560c082015160e083015161ffff918216911603610c22576040516310b467bd60e21b81526001600160a01b03858116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906342d19ef4906024016040805180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190613b68565b604051637921219560e11b81523060048201526001600160a01b038881166024830152604482018390526064820187905260a06084830152600060a48301529294509092509083169063f242432a9060c401600060405180830381600087803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b50505050610bb88686858760a001516125ce565b846001600160a01b0316866001600160a01b03167f26edd63ecb990f043d4fcce6a3e407be52646e19b3bb19afa6e2840b8d803644858760a00151604051610c139291909182526001600160801b0316602082015260400190565b60405180910390a35050610c86565b610c2b826126d7565b15610c4557610c408484838560a001516125ce565b610c86565b60405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b505060016000555050565b600054600114610cd05760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b6044820152606401610938565b600260008181556001600160a01b03838116825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c0880181905262010000830490911660e08801819052939091049094166101008601526003810154909216610120909401939093529114610de25760405162461bcd60e51b8152602060048201526012602482015271131411104e88139bdd081cdbdb19081bdd5d60721b6044820152606401610938565b6002810154600160201b90046001600160801b031615610e445760405162461bcd60e51b815260206004820152601d60248201527f4c5044413a2043757261746f7220616c726561647920636c61696d65640000006044820152606401610938565b60028101546001820154600091610e76916201000090910461ffff1690600160801b90046001600160801b0316613bac565b600283015460018401546001600160801b039283169350600092610ea59262010000900461ffff169116613bac565b6001600160801b031690506104e28115610f23576000610ec58385613bdb565b9050655af3107a4000610ed9846005613bf2565b610eeb83670de0b6b3a7640000613bf2565b610ef59190613c11565b610eff9190613c11565b610f0a9060fa613c33565b91506104e28211610f1b5781610f1f565b6104e25b9150505b6000612710610f328584613bf2565b610f3c9190613c11565b9050838560020160048282829054906101000a90046001600160801b0316610f649190613c4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506001600160a01b0380871660009081526005602090815260408083205460069092528220549216919080831561102b5760405163152a902d60e11b815260048101849052602481018990526001600160a01b03851690632a55205a906044016040805180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110269190613b68565b61102f565b6000805b9150915061103d8282612706565b816001600160a01b03168a6001600160a01b03167fbdf0502df1b76d58521b2a929580ca100c2121e0ae38717b260d9cfa44c23b328360405161108291815260200190565b60405180910390a36001546110a0906001600160a01b031686612706565b6001546040518681526001600160a01b03918216918c16907f4b39748ccad2b4ef6bcad79fe10f80215c9c855e0c1db6cf61bb7277a128e5039060200160405180910390a36003890154611111906001600160a01b031682611102888c613bdb565b61110c9190613bdb565b612706565b60038901546001600160a01b03908116908b167f7788f04afc4c336e7e8f6b6da2faf726900122643d0942085e63e643bf03d83e83611150898d613bdb565b61115a9190613bdb565b60405190815260200160405180910390a3505060016000555050505050505050565b6001600160a01b03808616600090815260076020908152604091829020825161014081018452815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416948201949094526001600160801b03600160801b94859004811660608301526001830154808216608084015294909404841660a0820152600282015461ffff80821660c08401526201000082041660e083015292909204909216610100820152600390910154909116610120820152611248816126d7565b6112945760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a2041756374696f6e204e4f54205375636365737366756c000000006044820152606401610938565b8061012001516001600160a01b0316336001600160a01b0316146112ee5760405162461bcd60e51b8152602060048201526011602482015270262822209d102737ba1031bab930ba37b960791b6044820152606401610938565b6040516001600160a01b038087166024830152871660448201523360648201526084810185905260009060a40160408051601f198184030181529181526020820180516001600160e01b03166318c4eeed60e01b1790525163601b8af360e01b81529091506001600160a01b0388169063601b8af390611398907f000000000000000000000000000000000000000000000000000000000000000090859089908990600401613c76565b6000604051808303816000875af11580156113b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113df9190810190613d4b565b5050856001600160a01b0316336001600160a01b0316886001600160a01b03167fa46f01ffe5ddc1a516c5bd9e5d58a2ffcc4f36029cd4068c6a1d5019509f628b8860405161143091815260200190565b60405180910390a450505050505050565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116958301959095526001600160401b03600160401b820416938201939093526001600160801b03600160801b93849004811660608301526001830154808216608084015293909304831660a0820152600282015461ffff80821660c08401526201000082041660e083015293909304909116610100830152600301549092166101208301529061150b90612822565b92915050565b8051606090600090816115248583612880565b9050806001600160401b0381111561153e5761153e61347f565b60405190808252806020026020018201604052801561157157816020015b606081526020019060019003908161155c5790505b50935060005b8281101561166357600086828151811061159357611593613d98565b60200260200101516001600160a01b031663e312bcc76040518163ffffffff1660e01b8152600401600060405180830381865afa1580156115d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116009190810190613dae565b805190915060005b818110156116555782818151811061162257611622613d98565b602002602001015188888060010199508151811061164257611642613d98565b6020908102919091010152600101611608565b505050806001019050611577565b50505050919050565b600060018251116116ca5760405162461bcd60e51b815260206004820152602260248201527f776f6e742067656e657261746520726f6f7420666f722073696e676c65206c6560448201526130b360f11b6064820152608401610938565b6001825111156116e4576116dd82612920565b91506116ca565b816000815181106116f7576116f7613d98565b60200260200101519050919050565b600081815b8451811015611741576117378286838151811061172a5761172a613d98565b6020026020010151612351565b915060010161170b565b509093149392505050565b600061176561176036889003880188613ebb565b612a86565b60006117a38d8d80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a7a92505050565b905060006117b08261166c565b6040516339b4546760e11b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637368a8ce906024016020604051808303816000875af115801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190613f83565b6040516301ffc9a760e01b815263152a902d60e11b60048201529093506001600160a01b038816906301ffc9a790602401602060405180830381865afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b09190613fa0565b156118f0576001600160a01b03838116600090815260056020908152604080832080546001600160a01b031916948c169490941790935560069052208690555b6001600160a01b038316600090815260076020526040902088906119148282613ffc565b50506040516323b872dd60e01b81523360048201526001600160a01b038481166024830152604482018890528816906323b872dd90606401600060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b505050506119a183308a60c001602081019061199691906141ca565b61ffff168888612d2a565b826001600160a01b03167f52365e9ef2d02ef2b8eb0ee7b91a0809adf17e90a5418ed54c7c137fe66aaa908f8f6040516119dc9291906141e7565b60405180910390a2866001600160a01b0316836001600160a01b03167f4a08e09eb1f4b221a4d4faff944c52d3bb85486dd0f7e647977d35b406e16e43888b604051611a2992919061422a565b60405180910390a350509b9a5050505050505050505050565b60086020528160005260406000208181548110611a5e57600080fd5b6000918252602090912001546001600160a01b03169150829050565b805160609060009081611a8d8583612880565b9050806001600160401b03811115611aa757611aa761347f565b604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b50935060005b82811015611663576000868281518110611af257611af2613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5f919081019061435b565b805190915060005b81811015611bb457828181518110611b8157611b81613d98565b6020026020010151888880600101995081518110611ba157611ba1613d98565b6020908102919091010152600101611b67565b505050806001019050611ad6565b60606000611bce612162565b8051909150806001600160401b03811115611beb57611beb61347f565b604051908082528060200260200182016040528015611c14578160200160208202803683370190505b50925060005b81811015611c8757828181518110611c3457611c34613d98565b6020026020010151604051602001611c4c91906143e0565b60405160208183030381529060405280519060200120848281518110611c7457611c74613d98565b6020908102919091010152600101611c1a565b50505090565b6001600160a01b038216600090815260076020526040812090611caf84612465565b9050611cbc828285612e17565b6001600160a01b038416600081815260086020908152604080832080546001810182559084528284200180546001600160a01b03191633908117909155938352600282528083209383529290529081208054349290611d1c908490613c33565b90915550506001600160a01b03841660009081526004602090815260408083203384529091528120805461ffff86169290611d58908490613c33565b90915550506040805161ffff851681526020810183905233916001600160a01b038716917fae93fedd66ff9e5925955058cd4f5eaa983abd5d5237e1d04fd0a02022561ef6910160405180910390a350505050565b60606001835111611e0c5760405162461bcd60e51b815260206004820152602360248201527f776f6e742067656e65726174652070726f6f6620666f722073696e676c65206c60448201526232b0b360e91b6064820152608401610938565b6000611e1884516108d4565b90506000816001600160401b03811115611e3457611e3461347f565b604051908082528060200260200182016040528015611e5d578160200160208202803683370190505b5090506000805b600187511115611f455760028606600103611eb957866001870381518110611e8e57611e8e613d98565b6020026020010151838381518110611ea857611ea8613d98565b602002602001018181525050611f29565b86518660010103611eed576000801b838381518110611eda57611eda613d98565b6020908102919091010152600101611f29565b868660010181518110611f0257611f02613d98565b6020026020010151838381518110611f1c57611f1c613d98565b6020026020010181815250505b600190910190600286049550611f3e87612920565b9650611e64565b6000611f518286613bdb565b6001600160401b03811115611f6857611f6861347f565b604051908082528060200260200182016040528015611f91578160200160208202803683370190505b50955060005b85811015612010576000801b858281518110611fb557611fb5613d98565b60200260200101511461200157848181518110611fd457611fd4613d98565b60200260200101518783830381518110611ff057611ff0613d98565b602002602001018181525050612008565b8160010191505b600101611f97565b50505050505092915050565b6001600160a01b038083166000818152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116838701526001600160401b03600160401b830416838601526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a08401908152600285015461ffff80821660c08701526201000082041660e086015291909104821661010084015260039093015488166101208301529585526004845282852096881685529590925282205490519193928492612100929116613bf2565b6001600160a01b038087166000818152600360209081526040808320948a1680845294825280832054938352600282528083209483529390529190912054919250908261214d8383613bdb565b6121579190613bdb565b979650505050505050565b6040805160028082526060828101909352816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816121785790505090506121af612f41565b6000815181106121c1576121c1613d98565b6020026020010151816000815181106121dc576121dc613d98565b60200260200101819052506040518060600160405280306001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020016318c4eeed60e01b6001600160e01b0319168152508160018151811061225857612258613d98565b602002602001018190525090565b6001546001600160a01b031633146122b95760405162461bcd60e51b8152602060048201526016602482015275262822209d102737ba103332b2903932b1b2b4bb32b960511b6044820152606401610938565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526008602090815260409182902080548351818402810184019094528084526060939283018282801561234557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612327575b50505050509050919050565b60008261235f57508061150b565b8161236b57508161150b565b81831482841017156123805782600052816020525b818311156123915781600052826020525b50604060002092915050565b606060006123a9612162565b8051909150806001600160401b038111156123c6576123c661347f565b6040519080825280602002602001820160405280156123f957816020015b60608152602001906001900390816123e45790505b50925060005b81811015611c875782818151811061241957612419613d98565b602002602001015160405160200161243191906143e0565b60405160208183030381529060405284828151811061245257612452613d98565b60209081029190910101526001016123ff565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff808216808452600160201b808404909216968401969096526001600160401b03600160401b8304169483018590526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a0840152600284015461ffff80821660c08601526201000082041660e0850152041661010082015260039091015490941661012085015291929183916125319042613bdb565b61253b9190613bf2565b905081606001516001600160801b0316811161256f578082606001516001600160801b031661256a9190613bdb565b612572565b60005b925081608001516001600160801b0316831161259b5781608001516001600160801b031661259d565b825b949350505050565b60006125b0826126d7565b8061150b575060c082015160e083015161ffff91821691161461150b565b6001600160a01b0380851660008181526002602090815260408083209488168084529482528083205493835260038252808320948352939052919091205461261f846001600160801b038516613bf2565b6126299190613c33565b6126339082613bdb565b905080156126d0576001600160a01b03808616600090815260036020908152604080832093881683529290529081208054839290612672908490613c33565b9091555061268290508482612706565b836001600160a01b0316856001600160a01b03167fec1e5ed733e00f1a00915d56caef57b4f52312dde4f9b3165f213319a0da156b836040516126c791815260200190565b60405180910390a35b5050505050565b6000816020015163ffffffff164211801561150b57508160c0015161ffff168260e0015161ffff161092915050565b6127108282612fe6565b61281e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561276f57600080fd5b505af1158015612783573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156127f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281c9190613fa0565b505b5050565b600061283682514263ffffffff9091161190565b1561284357506000919050565b61284c82613047565b1561285957506001919050565b60c082015160e083015161ffff91821691160361287857506002919050565b506003919050565b6000805b828110156129195783818151811061289e5761289e613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa1580156128e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261290b919081019061435b565b519190910190600101612884565b5092915050565b8051606090600180821690036129c957600181811c016001600160401b0381111561294d5761294d61347f565b604051908082528060200260200182016040528015612976578160200160208202803683370190505b5091506129a283600183038151811061299157612991613d98565b60200260200101516000801b612351565b826001845103815181106129b8576129b8613d98565b602002602001018181525050612a12565b600181901c6001600160401b038111156129e5576129e561347f565b604051908082528060200260200182016040528015612a0e578160200160208202803683370190505b5091505b6000805b60018303811015612a7e57612a53858281518110612a3657612a36613d98565b602002602001015186836001018151811061172a5761172a613d98565b848381518110612a6557612a65613d98565b6020908102919091010152600190910190600201612a16565b505050919050565b805163ffffffff42811691161015612ad55760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b806020015163ffffffff16816000015163ffffffff1610612b2d5760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b600081604001516001600160401b031611612b7f5760405162461bcd60e51b815260206004820152601260248201527104c5044413a20496e76616c69642064726f760741b6044820152606401610938565b80608001516001600160801b031681606001516001600160801b031611612bde5760405162461bcd60e51b81526020600482015260136024820152724c5044413a20496e76616c696420707269636560681b6044820152606401610938565b60a08101516001600160801b031615612c315760405162461bcd60e51b8152602060048201526015602482015274131411104e88125b9d985b1a59081b5a5b88189a59605a1b6044820152606401610938565b60008160c0015161ffff1611612c805760405162461bcd60e51b81526020600482015260146024820152734c5044413a20496e76616c696420737570706c7960601b6044820152606401610938565b60e081015161ffff1615612ccb5760405162461bcd60e51b8152602060048201526012602482015271131411104e88125b9d985b1a59081cdbdb1960721b6044820152606401610938565b6101008101516001600160801b031615612d275760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a20496e76616c69642063757261746f72436c61696d6564000000006044820152606401610938565b50565b6040516001600160a01b03851660248201526044810184905260009060640160408051601f198184030181529181526020820180516001600160e01b03166340c10f1960e01b1790525163601b8af360e01b81529091506001600160a01b0387169063601b8af390612dc6907f000000000000000000000000000000000000000000000000000000000000000090859088908890600401613c76565b6000604051808303816000875af1158015612de5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e0d9190810190613d4b565b5050505050505050565b6040805161014081018252845463ffffffff8082168352600160201b80830490911660208401526001600160401b03600160401b830416938301939093526001600160801b03600160801b91829004811660608401526001870154808216608085015291909104811660a0830152600286015461ffff80821660c08501526201000082041660e08401529290920490911661010082015260038401546001600160a01b0316610120820152612ecd908383613089565b60028381018054839290612eec90849062010000900461ffff166143ee565b82546101009290920a61ffff81810219909316918316021790915560028501548082166201000090910490911603905061281c576001830180546001600160801b03808516600160801b029116179055505050565b604080516001808252818301909252606091816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612f58575050604080516060810182523081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660208201526340c10f1960e01b91810191909152815191925090829060009061225857612258613d98565b6000826001600160a01b03168261753090604051600060405180830381858888f193505050503d8060008114613038576040519150601f19603f3d011682016040523d82523d6000602084013e61303d565b606091505b5090949350505050565b805160009063ffffffff16421180156130695750816020015163ffffffff1642105b801561150b57508160c0015161ffff168260e0015161ffff161092915050565b61309761ffff821683613bac565b6001600160801b03163410156130ef5760405162461bcd60e51b815260206004820152601860248201527f4c5044413a20496e73756666696369656e742076616c756500000000000000006044820152606401610938565b8260c0015161ffff166000036131475760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a2041756374696f6e20646f65736e742065786973740000000000006044820152606401610938565b8061ffff166131558461323d565b10156131a35760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a204e6f7420656e6f7567682072656d61696e696e670000000000006044820152606401610938565b6131ac83613047565b6131e95760405162461bcd60e51b815260206004820152600e60248201526d4c5044413a204e6f74204c69766560901b6044820152606401610938565b60008161ffff161161281c5760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a204d757374206269642061746c65617374203120726165000000006044820152606401610938565b60008160e001518260c00151613253919061440b565b61ffff1692915050565b60006020828403121561326f57600080fd5b5035919050565b6001600160a01b0381168114612d2757600080fd5b803561329681613276565b919050565b600080604083850312156132ae57600080fd5b82356132b981613276565b915060208301356132c981613276565b809150509250929050565b60008083601f8401126132e657600080fd5b5081356001600160401b038111156132fd57600080fd5b60208301915083602082850101111561331557600080fd5b9250929050565b60008060008060006080868803121561333457600080fd5b853561333f81613276565b9450602086013561334f81613276565b93506040860135925060608601356001600160401b0381111561337157600080fd5b61337d888289016132d4565b969995985093965092949392505050565b6000602082840312156133a057600080fd5b81356133ab81613276565b9392505050565b60008083601f8401126133c457600080fd5b5081356001600160401b038111156133db57600080fd5b6020830191508360208260051b850101111561331557600080fd5b60008060008060006080868803121561340e57600080fd5b853561341981613276565b9450602086013561342981613276565b93506040860135925060608601356001600160401b0381111561344b57600080fd5b61337d888289016133b2565b602081016004831061347957634e487b7160e01b600052602160045260246000fd5b91905290565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156134b8576134b861347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156134e6576134e661347f565b604052919050565b60006001600160401b038211156135075761350761347f565b5060051b60200190565b6000602080838503121561352457600080fd5b82356001600160401b0381111561353a57600080fd5b8301601f8101851361354b57600080fd5b803561355e613559826134ee565b6134be565b81815260059190911b8201830190838101908783111561357d57600080fd5b928401925b8284101561215757833561359581613276565b82529284019290840190613582565b60005b838110156135bf5781810151838201526020016135a7565b838111156135ce576000848401525b50505050565b600081518084526135ec8160208601602086016135a4565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561365557603f198886030184526136438583516135d4565b94509285019290850190600101613627565b5092979650505050505050565b600082601f83011261367357600080fd5b81356020613683613559836134ee565b82815260059290921b840181019181810190868411156136a257600080fd5b8286015b848110156136bd57803583529183019183016136a6565b509695505050505050565b6000602082840312156136da57600080fd5b81356001600160401b038111156136f057600080fd5b61259d84828501613662565b60008060006060848603121561371157600080fd5b8335925060208401356001600160401b0381111561372e57600080fd5b61373a86828701613662565b925050604084013590509250925092565b6000610140828403121561375e57600080fd5b50919050565b60008060008060008060008060008060006102008c8e03121561378657600080fd5b6001600160401b03808d35111561379c57600080fd5b6137a98e8e358f016133b2565b909c509a5060208d01358110156137bf57600080fd5b6137cf8e60208f01358f016133b2565b909a50985060408d01358110156137e557600080fd5b6137f58e60408f01358f016133b2565b90985096506138078e60608f0161374b565b95506138166101a08e0161328b565b94506101c08d01359350806101e08e0135111561383257600080fd5b506138448d6101e08e01358e016133b2565b81935080925050509295989b509295989b9093969950565b6000806040838503121561386f57600080fd5b823561387a81613276565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156138c0578351835292840192918401916001016138a4565b50909695505050505050565b61ffff81168114612d2757600080fd5b8035613296816138cc565b600080604083850312156138fa57600080fd5b823561390581613276565b915060208301356132c9816138cc565b6000806040838503121561392857600080fd5b82356001600160401b0381111561393e57600080fd5b61394a85828601613662565b95602094909401359450505050565b60008060008060008060008060a0898b03121561397557600080fd5b883561398081613276565b9750602089013561399081613276565b965060408901356001600160401b03808211156139ac57600080fd5b6139b88c838d016133b2565b909850965060608b01359150808211156139d157600080fd5b6139dd8c838d016133b2565b909650945060808b01359150808211156139f657600080fd5b50613a038b828c016132d4565b999c989b5096995094979396929594505050565b80516001600160a01b039081168352602080830151909116908301526040908101516001600160e01b031916910152565b6020808252825182820181905260009190848201906040850190845b818110156138c057613a77838551613a17565b9284019260609290920191600101613a64565b6020808252825182820181905260009190848201906040850190845b818110156138c05783516001600160a01b031683529284019291840191600101613aa6565b60008060408385031215613ade57600080fd5b50508035926020909101359150565b60008060008060008060a08789031215613b0657600080fd5b8635613b1181613276565b95506020870135613b2181613276565b9450604087013593506060870135925060808701356001600160401b03811115613b4a57600080fd5b613b5689828a016132d4565b979a9699509497509295939492505050565b60008060408385031215613b7b57600080fd5b8251613b8681613276565b6020939093015192949293505050565b634e487b7160e01b600052601160045260246000fd5b60006001600160801b0380831681851681830481118215151615613bd257613bd2613b96565b02949350505050565b600082821015613bed57613bed613b96565b500390565b6000816000190483118215151615613c0c57613c0c613b96565b500290565b600082613c2e57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613c4657613c46613b96565b500190565b60006001600160801b03808316818516808303821115613c6d57613c6d613b96565b01949350505050565b6001600160a01b0385168152606060208201819052600090613c9a908301866135d4565b82810360408401528381526001600160fb1b03841115613cb957600080fd5b8360051b80866020840137600091016020019081529695505050505050565b8051801515811461329657600080fd5b600082601f830112613cf957600080fd5b81516001600160401b03811115613d1257613d1261347f565b613d25601f8201601f19166020016134be565b818152846020838601011115613d3a57600080fd5b61259d8260208301602087016135a4565b60008060408385031215613d5e57600080fd5b613d6783613cd8565b915060208301516001600160401b03811115613d8257600080fd5b613d8e85828601613ce8565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b60006020808385031215613dc157600080fd5b82516001600160401b0380821115613dd857600080fd5b818501915085601f830112613dec57600080fd5b8151613dfa613559826134ee565b81815260059190911b83018401908481019088831115613e1957600080fd5b8585015b83811015613e5157805185811115613e355760008081fd5b613e438b89838a0101613ce8565b845250918601918601613e1d565b5098975050505050505050565b63ffffffff81168114612d2757600080fd5b803561329681613e5e565b6001600160401b0381168114612d2757600080fd5b803561329681613e7b565b6001600160801b0381168114612d2757600080fd5b803561329681613e9b565b60006101408284031215613ece57600080fd5b613ed6613495565b613edf83613e70565b8152613eed60208401613e70565b6020820152613efe60408401613e90565b6040820152613f0f60608401613eb0565b6060820152613f2060808401613eb0565b6080820152613f3160a08401613eb0565b60a0820152613f4260c084016138dc565b60c0820152613f5360e084016138dc565b60e0820152610100613f66818501613eb0565b90820152610120613f7884820161328b565b908201529392505050565b600060208284031215613f9557600080fd5b81516133ab81613276565b600060208284031215613fb257600080fd5b6133ab82613cd8565b6000813561150b81613e5e565b6000813561150b81613e7b565b6000813561150b81613e9b565b6000813561150b816138cc565b6000813561150b81613276565b813561400781613e5e565b63ffffffff811663ffffffff198354161782555061404c61402a60208401613fbb565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b61408d61405b60408401613fc8565b82546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff000000000000000016178255565b6140bc61409c60608401613fd5565b82546001600160801b031660809190911b6001600160801b031916178255565b600181016140ec6140cf60808501613fd5565b82546001600160801b0319166001600160801b0391909116178255565b6140fb61409c60a08501613fd5565b506002810161412261410f60c08501613fe2565b825461ffff191661ffff91909116178255565b61414b61413160e08501613fe2565b825463ffff0000191660109190911b63ffff000016178255565b61419561415b6101008501613fd5565b825473ffffffffffffffffffffffffffffffff00000000191660209190911b73ffffffffffffffffffffffffffffffff0000000016178255565b5061281e6141a66101208401613fef565b6003830180546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156141dc57600080fd5b81356133ab816138cc565b60208082528181018390526000908460408401835b868110156136bd57823561420f81613276565b6001600160a01b0316825291830191908301906001016141fc565b828152610160810161424c6020830161424285613e70565b63ffffffff169052565b61425860208401613e70565b63ffffffff811660408401525061427160408401613e90565b6001600160401b03811660608401525061428d60608401613eb0565b6001600160801b0381166080840152506142a960808401613eb0565b6001600160801b03811660a0840152506142c560a08401613eb0565b6001600160801b03811660c0840152506142e160c084016138dc565b61ffff811660e0840152506142f860e084016138dc565b61010061430a8185018361ffff169052565b614315818601613eb0565b91505061012061432f818501836001600160801b03169052565b61433a81860161328b565b9150506143536101408401826001600160a01b03169052565b509392505050565b6000602080838503121561436e57600080fd5b82516001600160401b0381111561438457600080fd5b8301601f8101851361439557600080fd5b80516143a3613559826134ee565b81815260059190911b820183019083810190878311156143c257600080fd5b928401925b82841015612157578351825292840192908401906143c7565b6060810161150b8284613a17565b600061ffff808316818516808303821115613c6d57613c6d613b96565b600061ffff8381169083168181101561442657614426613b96565b03939250505056fea2646970667358221220ff987becb65315d04ce1f645c1ee341ae3402f8d676ad9e0c2b0be3fddb22c5064736f6c634300080d003300000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e330000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea186000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e626d419dd60be8038c46381ad171a0b3d22ed25

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063884c05fb11610118578063bc197c81116100a0578063cf1675ef1161006f578063cf1675ef14610825578063dd1d259914610852578063e312bcc714610872578063e9833c2f14610887578063f23a6e61146108a757600080fd5b8063bc197c8114610794578063bc38d61f146107c3578063c3a07df6146107e3578063c69bebe41461080557600080fd5b8063ad2b3037116100e7578063ad2b303714610716578063b3f006741461072b578063b739e31b1461074b578063b86161951461075e578063bc063e1a1461077e57600080fd5b8063884c05fb1461055f5780638a4068dd1461058c5780639fd58ae5146105c0578063ac84e879146105f857600080fd5b80632d5d43171161019b5780635b68b04d1161016a5780635b68b04d1461047d57806364e76fe91461049d57806368ecbaa5146104bd5780637b103999146104f357806380e7a8451461052757600080fd5b80632d5d4317146103c85780632e08d602146103f557806343c686ae1461041557806358161a421461044d57600080fd5b8063150b7a02116101e2578063150b7a02146102e95780632189230f1461032e57806326469c7d1461035b5780632b5c58061461037b5780632cfcad831461039b57600080fd5b8063040141e514610214578063047fc9aa1461026557806308d7090a146102995780631284b0d3146102c7575b600080fd5b34801561022057600080fd5b506102487f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027157600080fd5b506102487f0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d81565b3480156102a557600080fd5b506102b96102b436600461325d565b6108d4565b60405190815260200161025c565b3480156102d357600080fd5b506102e76102e236600461329b565b6108fd565b005b3480156102f557600080fd5b5061031561030436600461331c565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161025c565b34801561033a57600080fd5b506102b961034936600461338e565b60066020526000908152604090205481565b34801561036757600080fd5b506102e761037636600461338e565b610c91565b34801561038757600080fd5b506102e76103963660046133f6565b61117c565b3480156103a757600080fd5b506103bb6103b636600461338e565b611441565b60405161025c9190613457565b3480156103d457600080fd5b506103e86103e3366004613511565b611511565b60405161025c9190613600565b34801561040157600080fd5b506102b96104103660046136c8565b61166c565b34801561042157600080fd5b506102b961043036600461329b565b600360209081526000928352604080842090915290825290205481565b34801561045957600080fd5b5061046d6104683660046136fc565b611706565b604051901515815260200161025c565b34801561048957600080fd5b50610248610498366004613764565b61174c565b3480156104a957600080fd5b506102486104b836600461385c565b611a42565b3480156104c957600080fd5b506102486104d836600461338e565b6005602052600090815260409020546001600160a01b031681565b3480156104ff57600080fd5b506102487f00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e3381565b34801561053357600080fd5b506102b961054236600461329b565b600260209081526000928352604080842090915290825290205481565b34801561056b57600080fd5b5061057f61057a366004613511565b611a7a565b60405161025c9190613888565b34801561059857600080fd5b506102487f000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea18681565b3480156105cc57600080fd5b506102b96105db36600461329b565b600460209081526000928352604080842090915290825290205481565b34801561060457600080fd5b5061069b61061336600461338e565b600760205260009081526040902080546001820154600283015460039093015463ffffffff80841694600160201b808604909216946001600160401b03600160401b820416946001600160801b03600160801b92839004811695828216959390920481169361ffff80821694620100008304909116939104909116906001600160a01b03168a565b6040805163ffffffff9b8c1681529a90991660208b01526001600160401b03909716978901979097526001600160801b039485166060890152928416608088015290831660a087015261ffff90811660c08701521660e08501529091166101008301526001600160a01b03166101208201526101400161025c565b34801561072257600080fd5b5061057f611bc2565b34801561073757600080fd5b50600154610248906001600160a01b031681565b6102e76107593660046138e7565b611c8d565b34801561076a57600080fd5b5061057f610779366004613915565b611dad565b34801561078a57600080fd5b506102b96104e281565b3480156107a057600080fd5b506103156107af366004613959565b63bc197c8160e01b98975050505050505050565b3480156107cf57600080fd5b506102b96107de36600461329b565b61201c565b3480156107ef57600080fd5b506107f8612162565b60405161025c9190613a48565b34801561081157600080fd5b506102e761082036600461338e565b612266565b34801561083157600080fd5b5061084561084036600461338e565b6122db565b60405161025c9190613a8a565b34801561085e57600080fd5b506102b961086d366004613acb565b612351565b34801561087e57600080fd5b506103e861239d565b34801561089357600080fd5b506102b96108a236600461338e565b612465565b3480156108b357600080fd5b506103156108c2366004613aed565b63f23a6e6160e01b9695505050505050565b60008119600101821682145b82156108f657600192831c9291909101906108e0565b9003919050565b6000546001146109415760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b60448201526064015b60405180910390fd5b600260008181556001600160a01b03808516825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c08801526201000082041660e08701529190910490921661010084015260039091015416610120820152610a0e816125a5565b610a535760405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b6001600160a01b0383811660009081526004602090815260408083209386168352929052908120805491905560c082015160e083015161ffff918216911603610c22576040516310b467bd60e21b81526001600160a01b03858116600483015260009182917f00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e3316906342d19ef4906024016040805180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190613b68565b604051637921219560e11b81523060048201526001600160a01b038881166024830152604482018390526064820187905260a06084830152600060a48301529294509092509083169063f242432a9060c401600060405180830381600087803b158015610b9057600080fd5b505af1158015610ba4573d6000803e3d6000fd5b50505050610bb88686858760a001516125ce565b846001600160a01b0316866001600160a01b03167f26edd63ecb990f043d4fcce6a3e407be52646e19b3bb19afa6e2840b8d803644858760a00151604051610c139291909182526001600160801b0316602082015260400190565b60405180910390a35050610c86565b610c2b826126d7565b15610c4557610c408484838560a001516125ce565b610c86565b60405162461bcd60e51b8152602060048201526016602482015275262822209d1020bab1ba34b7b7102727aa1037bb32b960511b6044820152606401610938565b505060016000555050565b600054600114610cd05760405162461bcd60e51b815260206004820152600a6024820152695245454e5452414e435960b01b6044820152606401610938565b600260008181556001600160a01b03838116825260076020908152604092839020835161014081018552815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416958201959095526001600160801b03600160801b95869004811660608301526001830154808216608084015295909504851660a08201529481015461ffff80821660c0880181905262010000830490911660e08801819052939091049094166101008601526003810154909216610120909401939093529114610de25760405162461bcd60e51b8152602060048201526012602482015271131411104e88139bdd081cdbdb19081bdd5d60721b6044820152606401610938565b6002810154600160201b90046001600160801b031615610e445760405162461bcd60e51b815260206004820152601d60248201527f4c5044413a2043757261746f7220616c726561647920636c61696d65640000006044820152606401610938565b60028101546001820154600091610e76916201000090910461ffff1690600160801b90046001600160801b0316613bac565b600283015460018401546001600160801b039283169350600092610ea59262010000900461ffff169116613bac565b6001600160801b031690506104e28115610f23576000610ec58385613bdb565b9050655af3107a4000610ed9846005613bf2565b610eeb83670de0b6b3a7640000613bf2565b610ef59190613c11565b610eff9190613c11565b610f0a9060fa613c33565b91506104e28211610f1b5781610f1f565b6104e25b9150505b6000612710610f328584613bf2565b610f3c9190613c11565b9050838560020160048282829054906101000a90046001600160801b0316610f649190613c4b565b82546001600160801b039182166101009390930a9283029190920219909116179055506001600160a01b0380871660009081526005602090815260408083205460069092528220549216919080831561102b5760405163152a902d60e11b815260048101849052602481018990526001600160a01b03851690632a55205a906044016040805180830381865afa158015611002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110269190613b68565b61102f565b6000805b9150915061103d8282612706565b816001600160a01b03168a6001600160a01b03167fbdf0502df1b76d58521b2a929580ca100c2121e0ae38717b260d9cfa44c23b328360405161108291815260200190565b60405180910390a36001546110a0906001600160a01b031686612706565b6001546040518681526001600160a01b03918216918c16907f4b39748ccad2b4ef6bcad79fe10f80215c9c855e0c1db6cf61bb7277a128e5039060200160405180910390a36003890154611111906001600160a01b031682611102888c613bdb565b61110c9190613bdb565b612706565b60038901546001600160a01b03908116908b167f7788f04afc4c336e7e8f6b6da2faf726900122643d0942085e63e643bf03d83e83611150898d613bdb565b61115a9190613bdb565b60405190815260200160405180910390a3505060016000555050505050505050565b6001600160a01b03808616600090815260076020908152604091829020825161014081018452815463ffffffff8082168352600160201b808304909116948301949094526001600160401b03600160401b820416948201949094526001600160801b03600160801b94859004811660608301526001830154808216608084015294909404841660a0820152600282015461ffff80821660c08401526201000082041660e083015292909204909216610100820152600390910154909116610120820152611248816126d7565b6112945760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a2041756374696f6e204e4f54205375636365737366756c000000006044820152606401610938565b8061012001516001600160a01b0316336001600160a01b0316146112ee5760405162461bcd60e51b8152602060048201526011602482015270262822209d102737ba1031bab930ba37b960791b6044820152606401610938565b6040516001600160a01b038087166024830152871660448201523360648201526084810185905260009060a40160408051601f198184030181529181526020820180516001600160e01b03166318c4eeed60e01b1790525163601b8af360e01b81529091506001600160a01b0388169063601b8af390611398907f000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea18690859089908990600401613c76565b6000604051808303816000875af11580156113b7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113df9190810190613d4b565b5050856001600160a01b0316336001600160a01b0316886001600160a01b03167fa46f01ffe5ddc1a516c5bd9e5d58a2ffcc4f36029cd4068c6a1d5019509f628b8860405161143091815260200190565b60405180910390a450505050505050565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116958301959095526001600160401b03600160401b820416938201939093526001600160801b03600160801b93849004811660608301526001830154808216608084015293909304831660a0820152600282015461ffff80821660c08401526201000082041660e083015293909304909116610100830152600301549092166101208301529061150b90612822565b92915050565b8051606090600090816115248583612880565b9050806001600160401b0381111561153e5761153e61347f565b60405190808252806020026020018201604052801561157157816020015b606081526020019060019003908161155c5790505b50935060005b8281101561166357600086828151811061159357611593613d98565b60200260200101516001600160a01b031663e312bcc76040518163ffffffff1660e01b8152600401600060405180830381865afa1580156115d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116009190810190613dae565b805190915060005b818110156116555782818151811061162257611622613d98565b602002602001015188888060010199508151811061164257611642613d98565b6020908102919091010152600101611608565b505050806001019050611577565b50505050919050565b600060018251116116ca5760405162461bcd60e51b815260206004820152602260248201527f776f6e742067656e657261746520726f6f7420666f722073696e676c65206c6560448201526130b360f11b6064820152608401610938565b6001825111156116e4576116dd82612920565b91506116ca565b816000815181106116f7576116f7613d98565b60200260200101519050919050565b600081815b8451811015611741576117378286838151811061172a5761172a613d98565b6020026020010151612351565b915060010161170b565b509093149392505050565b600061176561176036889003880188613ebb565b612a86565b60006117a38d8d80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a7a92505050565b905060006117b08261166c565b6040516339b4546760e11b8152600481018290529091507f00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e336001600160a01b031690637368a8ce906024016020604051808303816000875af115801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e9190613f83565b6040516301ffc9a760e01b815263152a902d60e11b60048201529093506001600160a01b038816906301ffc9a790602401602060405180830381865afa15801561188c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b09190613fa0565b156118f0576001600160a01b03838116600090815260056020908152604080832080546001600160a01b031916948c169490941790935560069052208690555b6001600160a01b038316600090815260076020526040902088906119148282613ffc565b50506040516323b872dd60e01b81523360048201526001600160a01b038481166024830152604482018890528816906323b872dd90606401600060405180830381600087803b15801561196657600080fd5b505af115801561197a573d6000803e3d6000fd5b505050506119a183308a60c001602081019061199691906141ca565b61ffff168888612d2a565b826001600160a01b03167f52365e9ef2d02ef2b8eb0ee7b91a0809adf17e90a5418ed54c7c137fe66aaa908f8f6040516119dc9291906141e7565b60405180910390a2866001600160a01b0316836001600160a01b03167f4a08e09eb1f4b221a4d4faff944c52d3bb85486dd0f7e647977d35b406e16e43888b604051611a2992919061422a565b60405180910390a350509b9a5050505050505050505050565b60086020528160005260406000208181548110611a5e57600080fd5b6000918252602090912001546001600160a01b03169150829050565b805160609060009081611a8d8583612880565b9050806001600160401b03811115611aa757611aa761347f565b604051908082528060200260200182016040528015611ad0578160200160208202803683370190505b50935060005b82811015611663576000868281518110611af257611af2613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa158015611b37573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b5f919081019061435b565b805190915060005b81811015611bb457828181518110611b8157611b81613d98565b6020026020010151888880600101995081518110611ba157611ba1613d98565b6020908102919091010152600101611b67565b505050806001019050611ad6565b60606000611bce612162565b8051909150806001600160401b03811115611beb57611beb61347f565b604051908082528060200260200182016040528015611c14578160200160208202803683370190505b50925060005b81811015611c8757828181518110611c3457611c34613d98565b6020026020010151604051602001611c4c91906143e0565b60405160208183030381529060405280519060200120848281518110611c7457611c74613d98565b6020908102919091010152600101611c1a565b50505090565b6001600160a01b038216600090815260076020526040812090611caf84612465565b9050611cbc828285612e17565b6001600160a01b038416600081815260086020908152604080832080546001810182559084528284200180546001600160a01b03191633908117909155938352600282528083209383529290529081208054349290611d1c908490613c33565b90915550506001600160a01b03841660009081526004602090815260408083203384529091528120805461ffff86169290611d58908490613c33565b90915550506040805161ffff851681526020810183905233916001600160a01b038716917fae93fedd66ff9e5925955058cd4f5eaa983abd5d5237e1d04fd0a02022561ef6910160405180910390a350505050565b60606001835111611e0c5760405162461bcd60e51b815260206004820152602360248201527f776f6e742067656e65726174652070726f6f6620666f722073696e676c65206c60448201526232b0b360e91b6064820152608401610938565b6000611e1884516108d4565b90506000816001600160401b03811115611e3457611e3461347f565b604051908082528060200260200182016040528015611e5d578160200160208202803683370190505b5090506000805b600187511115611f455760028606600103611eb957866001870381518110611e8e57611e8e613d98565b6020026020010151838381518110611ea857611ea8613d98565b602002602001018181525050611f29565b86518660010103611eed576000801b838381518110611eda57611eda613d98565b6020908102919091010152600101611f29565b868660010181518110611f0257611f02613d98565b6020026020010151838381518110611f1c57611f1c613d98565b6020026020010181815250505b600190910190600286049550611f3e87612920565b9650611e64565b6000611f518286613bdb565b6001600160401b03811115611f6857611f6861347f565b604051908082528060200260200182016040528015611f91578160200160208202803683370190505b50955060005b85811015612010576000801b858281518110611fb557611fb5613d98565b60200260200101511461200157848181518110611fd457611fd4613d98565b60200260200101518783830381518110611ff057611ff0613d98565b602002602001018181525050612008565b8160010191505b600101611f97565b50505050505092915050565b6001600160a01b038083166000818152600760209081526040808320815161014081018352815463ffffffff8082168352600160201b808304909116838701526001600160401b03600160401b830416838601526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a08401908152600285015461ffff80821660c08701526201000082041660e086015291909104821661010084015260039093015488166101208301529585526004845282852096881685529590925282205490519193928492612100929116613bf2565b6001600160a01b038087166000818152600360209081526040808320948a1680845294825280832054938352600282528083209483529390529190912054919250908261214d8383613bdb565b6121579190613bdb565b979650505050505050565b6040805160028082526060828101909352816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816121785790505090506121af612f41565b6000815181106121c1576121c1613d98565b6020026020010151816000815181106121dc576121dc613d98565b60200260200101819052506040518060600160405280306001600160a01b031681526020017f000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea1866001600160a01b031681526020016318c4eeed60e01b6001600160e01b0319168152508160018151811061225857612258613d98565b602002602001018190525090565b6001546001600160a01b031633146122b95760405162461bcd60e51b8152602060048201526016602482015275262822209d102737ba103332b2903932b1b2b4bb32b960511b6044820152606401610938565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526008602090815260409182902080548351818402810184019094528084526060939283018282801561234557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612327575b50505050509050919050565b60008261235f57508061150b565b8161236b57508161150b565b81831482841017156123805782600052816020525b818311156123915781600052826020525b50604060002092915050565b606060006123a9612162565b8051909150806001600160401b038111156123c6576123c661347f565b6040519080825280602002602001820160405280156123f957816020015b60608152602001906001900390816123e45790505b50925060005b81811015611c875782818151811061241957612419613d98565b602002602001015160405160200161243191906143e0565b60405160208183030381529060405284828151811061245257612452613d98565b60209081029190910101526001016123ff565b6001600160a01b038082166000908152600760209081526040808320815161014081018352815463ffffffff808216808452600160201b808404909216968401969096526001600160401b03600160401b8304169483018590526001600160801b03600160801b92839004811660608501526001850154808216608086015292909204821660a0840152600284015461ffff80821660c08601526201000082041660e0850152041661010082015260039091015490941661012085015291929183916125319042613bdb565b61253b9190613bf2565b905081606001516001600160801b0316811161256f578082606001516001600160801b031661256a9190613bdb565b612572565b60005b925081608001516001600160801b0316831161259b5781608001516001600160801b031661259d565b825b949350505050565b60006125b0826126d7565b8061150b575060c082015160e083015161ffff91821691161461150b565b6001600160a01b0380851660008181526002602090815260408083209488168084529482528083205493835260038252808320948352939052919091205461261f846001600160801b038516613bf2565b6126299190613c33565b6126339082613bdb565b905080156126d0576001600160a01b03808616600090815260036020908152604080832093881683529290529081208054839290612672908490613c33565b9091555061268290508482612706565b836001600160a01b0316856001600160a01b03167fec1e5ed733e00f1a00915d56caef57b4f52312dde4f9b3165f213319a0da156b836040516126c791815260200190565b60405180910390a35b5050505050565b6000816020015163ffffffff164211801561150b57508160c0015161ffff168260e0015161ffff161092915050565b6127108282612fe6565b61281e577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561276f57600080fd5b505af1158015612783573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af11580156127f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281c9190613fa0565b505b5050565b600061283682514263ffffffff9091161190565b1561284357506000919050565b61284c82613047565b1561285957506001919050565b60c082015160e083015161ffff91821691160361287857506002919050565b506003919050565b6000805b828110156129195783818151811061289e5761289e613d98565b60200260200101516001600160a01b031663ad2b30376040518163ffffffff1660e01b8152600401600060405180830381865afa1580156128e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261290b919081019061435b565b519190910190600101612884565b5092915050565b8051606090600180821690036129c957600181811c016001600160401b0381111561294d5761294d61347f565b604051908082528060200260200182016040528015612976578160200160208202803683370190505b5091506129a283600183038151811061299157612991613d98565b60200260200101516000801b612351565b826001845103815181106129b8576129b8613d98565b602002602001018181525050612a12565b600181901c6001600160401b038111156129e5576129e561347f565b604051908082528060200260200182016040528015612a0e578160200160208202803683370190505b5091505b6000805b60018303811015612a7e57612a53858281518110612a3657612a36613d98565b602002602001015186836001018151811061172a5761172a613d98565b848381518110612a6557612a65613d98565b6020908102919091010152600190910190600201612a16565b505050919050565b805163ffffffff42811691161015612ad55760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b806020015163ffffffff16816000015163ffffffff1610612b2d5760405162461bcd60e51b81526020600482015260126024820152714c5044413a20496e76616c69642074696d6560701b6044820152606401610938565b600081604001516001600160401b031611612b7f5760405162461bcd60e51b815260206004820152601260248201527104c5044413a20496e76616c69642064726f760741b6044820152606401610938565b80608001516001600160801b031681606001516001600160801b031611612bde5760405162461bcd60e51b81526020600482015260136024820152724c5044413a20496e76616c696420707269636560681b6044820152606401610938565b60a08101516001600160801b031615612c315760405162461bcd60e51b8152602060048201526015602482015274131411104e88125b9d985b1a59081b5a5b88189a59605a1b6044820152606401610938565b60008160c0015161ffff1611612c805760405162461bcd60e51b81526020600482015260146024820152734c5044413a20496e76616c696420737570706c7960601b6044820152606401610938565b60e081015161ffff1615612ccb5760405162461bcd60e51b8152602060048201526012602482015271131411104e88125b9d985b1a59081cdbdb1960721b6044820152606401610938565b6101008101516001600160801b031615612d275760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a20496e76616c69642063757261746f72436c61696d6564000000006044820152606401610938565b50565b6040516001600160a01b03851660248201526044810184905260009060640160408051601f198184030181529181526020820180516001600160e01b03166340c10f1960e01b1790525163601b8af360e01b81529091506001600160a01b0387169063601b8af390612dc6907f0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d90859088908890600401613c76565b6000604051808303816000875af1158015612de5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612e0d9190810190613d4b565b5050505050505050565b6040805161014081018252845463ffffffff8082168352600160201b80830490911660208401526001600160401b03600160401b830416938301939093526001600160801b03600160801b91829004811660608401526001870154808216608085015291909104811660a0830152600286015461ffff80821660c08501526201000082041660e08401529290920490911661010082015260038401546001600160a01b0316610120820152612ecd908383613089565b60028381018054839290612eec90849062010000900461ffff166143ee565b82546101009290920a61ffff81810219909316918316021790915560028501548082166201000090910490911603905061281c576001830180546001600160801b03808516600160801b029116179055505050565b604080516001808252818301909252606091816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612f58575050604080516060810182523081526001600160a01b037f0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d1660208201526340c10f1960e01b91810191909152815191925090829060009061225857612258613d98565b6000826001600160a01b03168261753090604051600060405180830381858888f193505050503d8060008114613038576040519150601f19603f3d011682016040523d82523d6000602084013e61303d565b606091505b5090949350505050565b805160009063ffffffff16421180156130695750816020015163ffffffff1642105b801561150b57508160c0015161ffff168260e0015161ffff161092915050565b61309761ffff821683613bac565b6001600160801b03163410156130ef5760405162461bcd60e51b815260206004820152601860248201527f4c5044413a20496e73756666696369656e742076616c756500000000000000006044820152606401610938565b8260c0015161ffff166000036131475760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a2041756374696f6e20646f65736e742065786973740000000000006044820152606401610938565b8061ffff166131558461323d565b10156131a35760405162461bcd60e51b815260206004820152601a60248201527f4c5044413a204e6f7420656e6f7567682072656d61696e696e670000000000006044820152606401610938565b6131ac83613047565b6131e95760405162461bcd60e51b815260206004820152600e60248201526d4c5044413a204e6f74204c69766560901b6044820152606401610938565b60008161ffff161161281c5760405162461bcd60e51b815260206004820152601c60248201527f4c5044413a204d757374206269642061746c65617374203120726165000000006044820152606401610938565b60008160e001518260c00151613253919061440b565b61ffff1692915050565b60006020828403121561326f57600080fd5b5035919050565b6001600160a01b0381168114612d2757600080fd5b803561329681613276565b919050565b600080604083850312156132ae57600080fd5b82356132b981613276565b915060208301356132c981613276565b809150509250929050565b60008083601f8401126132e657600080fd5b5081356001600160401b038111156132fd57600080fd5b60208301915083602082850101111561331557600080fd5b9250929050565b60008060008060006080868803121561333457600080fd5b853561333f81613276565b9450602086013561334f81613276565b93506040860135925060608601356001600160401b0381111561337157600080fd5b61337d888289016132d4565b969995985093965092949392505050565b6000602082840312156133a057600080fd5b81356133ab81613276565b9392505050565b60008083601f8401126133c457600080fd5b5081356001600160401b038111156133db57600080fd5b6020830191508360208260051b850101111561331557600080fd5b60008060008060006080868803121561340e57600080fd5b853561341981613276565b9450602086013561342981613276565b93506040860135925060608601356001600160401b0381111561344b57600080fd5b61337d888289016133b2565b602081016004831061347957634e487b7160e01b600052602160045260246000fd5b91905290565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b03811182821017156134b8576134b861347f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156134e6576134e661347f565b604052919050565b60006001600160401b038211156135075761350761347f565b5060051b60200190565b6000602080838503121561352457600080fd5b82356001600160401b0381111561353a57600080fd5b8301601f8101851361354b57600080fd5b803561355e613559826134ee565b6134be565b81815260059190911b8201830190838101908783111561357d57600080fd5b928401925b8284101561215757833561359581613276565b82529284019290840190613582565b60005b838110156135bf5781810151838201526020016135a7565b838111156135ce576000848401525b50505050565b600081518084526135ec8160208601602086016135a4565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561365557603f198886030184526136438583516135d4565b94509285019290850190600101613627565b5092979650505050505050565b600082601f83011261367357600080fd5b81356020613683613559836134ee565b82815260059290921b840181019181810190868411156136a257600080fd5b8286015b848110156136bd57803583529183019183016136a6565b509695505050505050565b6000602082840312156136da57600080fd5b81356001600160401b038111156136f057600080fd5b61259d84828501613662565b60008060006060848603121561371157600080fd5b8335925060208401356001600160401b0381111561372e57600080fd5b61373a86828701613662565b925050604084013590509250925092565b6000610140828403121561375e57600080fd5b50919050565b60008060008060008060008060008060006102008c8e03121561378657600080fd5b6001600160401b03808d35111561379c57600080fd5b6137a98e8e358f016133b2565b909c509a5060208d01358110156137bf57600080fd5b6137cf8e60208f01358f016133b2565b909a50985060408d01358110156137e557600080fd5b6137f58e60408f01358f016133b2565b90985096506138078e60608f0161374b565b95506138166101a08e0161328b565b94506101c08d01359350806101e08e0135111561383257600080fd5b506138448d6101e08e01358e016133b2565b81935080925050509295989b509295989b9093969950565b6000806040838503121561386f57600080fd5b823561387a81613276565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156138c0578351835292840192918401916001016138a4565b50909695505050505050565b61ffff81168114612d2757600080fd5b8035613296816138cc565b600080604083850312156138fa57600080fd5b823561390581613276565b915060208301356132c9816138cc565b6000806040838503121561392857600080fd5b82356001600160401b0381111561393e57600080fd5b61394a85828601613662565b95602094909401359450505050565b60008060008060008060008060a0898b03121561397557600080fd5b883561398081613276565b9750602089013561399081613276565b965060408901356001600160401b03808211156139ac57600080fd5b6139b88c838d016133b2565b909850965060608b01359150808211156139d157600080fd5b6139dd8c838d016133b2565b909650945060808b01359150808211156139f657600080fd5b50613a038b828c016132d4565b999c989b5096995094979396929594505050565b80516001600160a01b039081168352602080830151909116908301526040908101516001600160e01b031916910152565b6020808252825182820181905260009190848201906040850190845b818110156138c057613a77838551613a17565b9284019260609290920191600101613a64565b6020808252825182820181905260009190848201906040850190845b818110156138c05783516001600160a01b031683529284019291840191600101613aa6565b60008060408385031215613ade57600080fd5b50508035926020909101359150565b60008060008060008060a08789031215613b0657600080fd5b8635613b1181613276565b95506020870135613b2181613276565b9450604087013593506060870135925060808701356001600160401b03811115613b4a57600080fd5b613b5689828a016132d4565b979a9699509497509295939492505050565b60008060408385031215613b7b57600080fd5b8251613b8681613276565b6020939093015192949293505050565b634e487b7160e01b600052601160045260246000fd5b60006001600160801b0380831681851681830481118215151615613bd257613bd2613b96565b02949350505050565b600082821015613bed57613bed613b96565b500390565b6000816000190483118215151615613c0c57613c0c613b96565b500290565b600082613c2e57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115613c4657613c46613b96565b500190565b60006001600160801b03808316818516808303821115613c6d57613c6d613b96565b01949350505050565b6001600160a01b0385168152606060208201819052600090613c9a908301866135d4565b82810360408401528381526001600160fb1b03841115613cb957600080fd5b8360051b80866020840137600091016020019081529695505050505050565b8051801515811461329657600080fd5b600082601f830112613cf957600080fd5b81516001600160401b03811115613d1257613d1261347f565b613d25601f8201601f19166020016134be565b818152846020838601011115613d3a57600080fd5b61259d8260208301602087016135a4565b60008060408385031215613d5e57600080fd5b613d6783613cd8565b915060208301516001600160401b03811115613d8257600080fd5b613d8e85828601613ce8565b9150509250929050565b634e487b7160e01b600052603260045260246000fd5b60006020808385031215613dc157600080fd5b82516001600160401b0380821115613dd857600080fd5b818501915085601f830112613dec57600080fd5b8151613dfa613559826134ee565b81815260059190911b83018401908481019088831115613e1957600080fd5b8585015b83811015613e5157805185811115613e355760008081fd5b613e438b89838a0101613ce8565b845250918601918601613e1d565b5098975050505050505050565b63ffffffff81168114612d2757600080fd5b803561329681613e5e565b6001600160401b0381168114612d2757600080fd5b803561329681613e7b565b6001600160801b0381168114612d2757600080fd5b803561329681613e9b565b60006101408284031215613ece57600080fd5b613ed6613495565b613edf83613e70565b8152613eed60208401613e70565b6020820152613efe60408401613e90565b6040820152613f0f60608401613eb0565b6060820152613f2060808401613eb0565b6080820152613f3160a08401613eb0565b60a0820152613f4260c084016138dc565b60c0820152613f5360e084016138dc565b60e0820152610100613f66818501613eb0565b90820152610120613f7884820161328b565b908201529392505050565b600060208284031215613f9557600080fd5b81516133ab81613276565b600060208284031215613fb257600080fd5b6133ab82613cd8565b6000813561150b81613e5e565b6000813561150b81613e7b565b6000813561150b81613e9b565b6000813561150b816138cc565b6000813561150b81613276565b813561400781613e5e565b63ffffffff811663ffffffff198354161782555061404c61402a60208401613fbb565b825467ffffffff00000000191660209190911b67ffffffff0000000016178255565b61408d61405b60408401613fc8565b82546fffffffffffffffff0000000000000000191660409190911b6fffffffffffffffff000000000000000016178255565b6140bc61409c60608401613fd5565b82546001600160801b031660809190911b6001600160801b031916178255565b600181016140ec6140cf60808501613fd5565b82546001600160801b0319166001600160801b0391909116178255565b6140fb61409c60a08501613fd5565b506002810161412261410f60c08501613fe2565b825461ffff191661ffff91909116178255565b61414b61413160e08501613fe2565b825463ffff0000191660109190911b63ffff000016178255565b61419561415b6101008501613fd5565b825473ffffffffffffffffffffffffffffffff00000000191660209190911b73ffffffffffffffffffffffffffffffff0000000016178255565b5061281e6141a66101208401613fef565b6003830180546001600160a01b0319166001600160a01b0392909216919091179055565b6000602082840312156141dc57600080fd5b81356133ab816138cc565b60208082528181018390526000908460408401835b868110156136bd57823561420f81613276565b6001600160a01b0316825291830191908301906001016141fc565b828152610160810161424c6020830161424285613e70565b63ffffffff169052565b61425860208401613e70565b63ffffffff811660408401525061427160408401613e90565b6001600160401b03811660608401525061428d60608401613eb0565b6001600160801b0381166080840152506142a960808401613eb0565b6001600160801b03811660a0840152506142c560a08401613eb0565b6001600160801b03811660c0840152506142e160c084016138dc565b61ffff811660e0840152506142f860e084016138dc565b61010061430a8185018361ffff169052565b614315818601613eb0565b91505061012061432f818501836001600160801b03169052565b61433a81860161328b565b9150506143536101408401826001600160a01b03169052565b509392505050565b6000602080838503121561436e57600080fd5b82516001600160401b0381111561438457600080fd5b8301601f8101851361439557600080fd5b80516143a3613559826134ee565b81815260059190911b820183019083810190878311156143c257600080fd5b928401925b82841015612157578351825292840192908401906143c7565b6060810161150b8284613a17565b600061ffff808316818516808303821115613c6d57613c6d613b96565b600061ffff8381169083168181101561442657614426613b96565b03939250505056fea2646970667358221220ff987becb65315d04ce1f645c1ee341ae3402f8d676ad9e0c2b0be3fddb22c5064736f6c634300080d0033

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

00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e330000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea186000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e626d419dd60be8038c46381ad171a0b3d22ed25

-----Decoded View---------------
Arg [0] : _registry (address): 0x14f2A9c262cb47c5475F3cF16F735dA0D1e91E33
Arg [1] : _supply (address): 0x1604c61812b5851c440217d170aD1e5C5ad7290d
Arg [2] : _transfer (address): 0xCeA98aeC09aD1c41470FD041F10B2d2391aEa186
Arg [3] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : _feeReceiver (address): 0xE626d419Dd60BE8038C46381ad171A0b3d22ed25

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000014f2a9c262cb47c5475f3cf16f735da0d1e91e33
Arg [1] : 0000000000000000000000001604c61812b5851c440217d170ad1e5c5ad7290d
Arg [2] : 000000000000000000000000cea98aec09ad1c41470fd041f10b2d2391aea186
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 000000000000000000000000e626d419dd60be8038c46381ad171a0b3d22ed25


Deployed Bytecode Sourcemap

65936:9933:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40764:45;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;311:32:1;;;293:51;;281:2;266:18;40764:45:0;;;;;;;;59344:31;;;;;;;;;;;;;;;12473:1399;;;;;;;;;;-1:-1:-1;12473:1399:0;;;;;:::i;:::-;;:::i;:::-;;;894:25:1;;;882:2;867:18;12473:1399:0;748:177:1;69554:835:0;;;;;;;;;;-1:-1:-1;69554:835:0;;;;;:::i;:::-;;:::i;:::-;;58016:226;;;;;;;;;;-1:-1:-1;58016:226:0;;;;;:::i;:::-;-1:-1:-1;;;58016:226:0;;;;;;;;;;;-1:-1:-1;;;;;;2871:33:1;;;2853:52;;2841:2;2826:18;58016:226:0;2709:202:1;66991:54:0;;;;;;;;;;-1:-1:-1;66991:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;70521:1362;;;;;;;;;;-1:-1:-1;70521:1362:0;;;;;:::i;:::-;;:::i;72222:681::-;;;;;;;;;;-1:-1:-1;72222:681:0;;;;;:::i;:::-;;:::i;74017:138::-;;;;;;;;;;-1:-1:-1;74017:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15264:749::-;;;;;;;;;;-1:-1:-1;15264:749:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8836:265::-;;;;;;;;;;-1:-1:-1;8836:265:0;;;;;:::i;:::-;;:::i;66636:70::-;;;;;;;;;;-1:-1:-1;66636:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8215:471;;;;;;;;;;-1:-1:-1;8215:471:0;;;;;:::i;:::-;;:::i;:::-;;;9688:14:1;;9681:22;9663:41;;9651:2;9636:18;8215:471:0;9523:187:1;67746:979:0;;;;;;;;;;-1:-1:-1;67746:979:0;;;;;:::i;:::-;;:::i;67229:53::-;;;;;;;;;;-1:-1:-1;67229:53:0;;;;;:::i;:::-;;:::i;66889:52::-;;;;;;;;;;-1:-1:-1;66889:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;66889:52:0;;;66113:33;;;;;;;;;;;;;;;66492:73;;;;;;;;;;-1:-1:-1;66492:73:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14234:739;;;;;;;;;;-1:-1:-1;14234:739:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66206:33::-;;;;;;;;;;;;;;;66778:64;;;;;;;;;;-1:-1:-1;66778:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;67107:49;;;;;;;;;;-1:-1:-1;67107:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67107:49:0;;;;;;;-1:-1:-1;;;;;;;;67107:49:0;;;;-1:-1:-1;;;;;;;;67107:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67107:49:0;;;;;;;13305:10:1;13342:15;;;13324:34;;13394:15;;;;13389:2;13374:18;;13367:43;-1:-1:-1;;;;;13446:31:1;;;13426:18;;;13419:59;;;;-1:-1:-1;;;;;13567:15:1;;;13562:2;13547:18;;13540:43;13620:15;;;13614:3;13599:19;;13592:44;13673:15;;;13667:3;13652:19;;13645:44;13708:6;13751:15;;;13745:3;13730:19;;13723:44;13804:15;13798:3;13783:19;;13776:44;13857:15;;;13851:3;13836:19;;13829:44;-1:-1:-1;;;;;13910:32:1;13904:3;13889:19;;13882:61;13282:3;13267:19;67107:49:0;12906:1043:1;4796:388:0;;;;;;;;;;;;;:::i;66310:26::-;;;;;;;;;;-1:-1:-1;66310:26:0;;;;-1:-1:-1;;;;;66310:26:0;;;68889:470;;;;;;:::i;:::-;;:::i;9325:1773::-;;;;;;;;;;-1:-1:-1;9325:1773:0;;;;;:::i;:::-;;:::i;66387:38::-;;;;;;;;;;;;66421:4;66387:38;;58642:279;;;;;;;;;;-1:-1:-1;58642:279:0;;;;;:::i;:::-;-1:-1:-1;;;58642:279:0;;;;;;;;;;;74394:405;;;;;;;;;;-1:-1:-1;74394:405:0;;;;;:::i;:::-;;:::i;75027:362::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;73007:168::-;;;;;;;;;;-1:-1:-1;73007:168:0;;;;;:::i;:::-;;:::i;73746:125::-;;;;;;;;;;-1:-1:-1;73746:125:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7181:789::-;;;;;;;;;;-1:-1:-1;7181:789:0;;;;;:::i;:::-;;:::i;5405:381::-;;;;;;;;;;;;;:::i;73367:371::-;;;;;;;;;;-1:-1:-1;73367:371:0;;;;;:::i;:::-;;:::i;58318:247::-;;;;;;;;;;-1:-1:-1;58318:247:0;;;;;:::i;:::-;-1:-1:-1;;;58318:247:0;;;;;;;;;12473:1399;12529:12;13552:6;;13560:1;13548:14;13544:22;;13541:29;;13746:81;13753:5;;13746:81;;13785:1;13779:7;;;;13805:6;;;;;13746:81;;;13841:12;;;12473:1399;-1:-1:-1;12473:1399:0:o;69554:835::-;61074:6;;61084:1;61074:11;61066:34;;;;-1:-1:-1;;;61066:34:0;;19322:2:1;61066:34:0;;;19304:21:1;19361:2;19341:18;;;19334:30;-1:-1:-1;;;19380:18:1;;;19373:40;19430:18;;61066:34:0;;;;;;;;;61122:1;61113:6;:10;;;-1:-1:-1;;;;;69666:21:0;;::::1;::::0;;:13:::1;:21;::::0;;;;;;;;69643:44;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;69643:44:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;;;;69643:44:0;::::1;;::::0;;;;;;;-1:-1:-1;;;;;;;;69643:44:0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;;;;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;69706:13:::1;69643:44:::0;69706:11:::1;:13::i;:::-;69698:48;;;::::0;-1:-1:-1;;;69698:48:0;;19661:2:1;69698:48:0::1;::::0;::::1;19643:21:1::0;19700:2;19680:18;;;19673:30;-1:-1:-1;;;19719:18:1;;;19712:52;19781:18;;69698:48:0::1;19459:346:1::0;69698:48:0::1;-1:-1:-1::0;;;;;69774:17:0;;::::1;69757:14;69774:17:::0;;;:9:::1;:17;::::0;;;;;;;:26;;::::1;::::0;;;;;;;;;;69811:33;;;21762:12;;;;21745:13;;;;:29;;;;;;;69855:527:::1;;69925:45;::::0;-1:-1:-1;;;69925:45:0;;-1:-1:-1;;;;;311:32:1;;;69925:45:0::1;::::0;::::1;293:51:1::0;69896:13:0::1;::::0;;;69940:8:::1;69925:37;::::0;::::1;::::0;266:18:1;;69925:45:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69985:72;::::0;-1:-1:-1;;;69985:72:0;;70026:4:::1;69985:72;::::0;::::1;20460:34:1::0;-1:-1:-1;;;;;20530:15:1;;;20510:18;;;20503:43;20562:18;;;20555:34;;;20605:18;;;20598:34;;;20440:3;20648:19;;;20641:32;-1:-1:-1;20689:19:1;;;20682:30;69895:75:0;;-1:-1:-1;69895:75:0;;-1:-1:-1;69985:32:0;;::::1;::::0;::::1;::::0;20729:19:1;;69985:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;70072:52;70087:6;70095:7;70104:6;70112:4;:11;;;70072:14;:52::i;:::-;70163:7;-1:-1:-1::0;;;;;70144:48:0::1;70155:6;-1:-1:-1::0;;;;;70144:48:0::1;;70172:6;70180:4;:11;;;70144:48;;;;;;20933:25:1::0;;;-1:-1:-1;;;;;20994:47:1;20989:2;20974:18;;20967:75;20921:2;20906:18;;20759:289;70144:48:0::1;;;;;;;;69880:324;;69855:527;;;70214:22;:4;:20;:22::i;:::-;70210:172;;;70253:52;70268:6;70276:7;70285:6;70293:4;:11;;;70253:14;:52::i;:::-;70210:172;;;70338:32;::::0;-1:-1:-1;;;70338:32:0;;19661:2:1;70338:32:0::1;::::0;::::1;19643:21:1::0;19700:2;19680:18;;;19673:30;-1:-1:-1;;;19719:18:1;;;19712:52;19781:18;;70338:32:0::1;19459:346:1::0;70210:172:0::1;-1:-1:-1::0;;61159:1:0;61150:6;:10;-1:-1:-1;;69554:835:0:o;70521:1362::-;61074:6;;61084:1;61074:11;61066:34;;;;-1:-1:-1;;;61066:34:0;;19322:2:1;61066:34:0;;;19304:21:1;19361:2;19341:18;;;19334:30;-1:-1:-1;;;19380:18:1;;;19373:40;19430:18;;61066:34:0;19120:334:1;61066:34:0;61122:1;61113:6;:10;;;-1:-1:-1;;;;;70617:21:0;;::::1;::::0;;:13:::1;:21;::::0;;;;;;;;70657:17;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;70657:17:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;;;;;;70657:17:0;::::1;;::::0;;;;;;;-1:-1:-1;;;;;;;;70657:17:0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;70617:21;21745:29;70649:50:::1;;;::::0;-1:-1:-1;;;70649:50:0;;21255:2:1;70649:50:0::1;::::0;::::1;21237:21:1::0;21294:2;21274:18;;;21267:30;-1:-1:-1;;;21313:18:1;;;21306:48;21371:18;;70649:50:0::1;21053:342:1::0;70649:50:0::1;70718:19;::::0;::::1;::::0;-1:-1:-1;;;70718:19:0;::::1;-1:-1:-1::0;;;;;70718:19:0::1;:24:::0;70710:66:::1;;;::::0;-1:-1:-1;;;70710:66:0;;21602:2:1;70710:66:0::1;::::0;::::1;21584:21:1::0;21641:2;21621:18;;;21614:30;21680:31;21660:18;;;21653:59;21729:18;;70710:66:0::1;21400:353:1::0;70710:66:0::1;70817:12;::::0;::::1;::::0;70803:11:::1;::::0;::::1;::::0;70787:13:::1;::::0;70803:26:::1;::::0;70817:12;;;::::1;;;::::0;-1:-1:-1;;;70803:11:0;::::1;-1:-1:-1::0;;;;;70803:11:0::1;:26;:::i;:::-;70870:12;::::0;::::1;::::0;70854:13:::1;::::0;::::1;::::0;-1:-1:-1;;;;;70787:42:0;;::::1;::::0;-1:-1:-1;70840:11:0::1;::::0;70854:28:::1;::::0;70870:12;;::::1;;;::::0;70854:13:::1;:28;:::i;:::-;-1:-1:-1::0;;;;;70840:42:0::1;::::0;-1:-1:-1;66421:4:0::1;70936:8:::0;;70932:206:::1;;70961:12;70976:11;70984:3:::0;70976:5;:11:::1;:::i;:::-;70961:26:::0;-1:-1:-1;71044:4:0::1;71033:7;:3:::0;71039:1:::1;71033:7;:::i;:::-;71017:11;:4:::0;71024::::1;71017:11;:::i;:::-;71016:25;;;;:::i;:::-;:32;;;;:::i;:::-;71015:40;::::0;71052:3:::1;71015:40;:::i;:::-;71002:53;;66421:4;71083:10;:20;:43;;71116:10;71083:43;;;66421:4;71083:43;71070:56;;70946:192;70932:206;71148:11;71185:3;71163:18;71176:5:::0;71163:10;:18:::1;:::i;:::-;71162:26;;;;:::i;:::-;71148:40;;71230:5;71199:4;:19;;;:37;;;;;;;;;;-1:-1:-1::0;;;;;71199:37:0::1;;;;;:::i;:::-;::::0;;-1:-1:-1;;;;;71199:37:0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;71263:25:0;;::::1;-1:-1:-1::0;71263:25:0;;;:17:::1;:25;::::0;;;;;;;;71312:19:::1;:27:::0;;;;;;71263:25;::::1;::::0;71312:27;-1:-1:-1;71401:19:0;;:104:::1;;71467:38;::::0;-1:-1:-1;;;71467:38:0;;::::1;::::0;::::1;23404:25:1::0;;;23445:18;;;23438:34;;;-1:-1:-1;;;;;71467:27:0;::::1;::::0;::::1;::::0;23377:18:1;;71467:38:0::1;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71401:104;;;71445:1;71449::::0;71401:104:::1;71350:155;;;;71516:46;71531:15;71548:13;71516:14;:46::i;:::-;71598:15;-1:-1:-1::0;;;;;71578:51:0::1;71590:6;-1:-1:-1::0;;;;;71578:51:0::1;;71615:13;71578:51;;;;894:25:1::0;;882:2;867:18;;748:177;71578:51:0::1;;;;;;;;71655:11;::::0;71640:32:::1;::::0;-1:-1:-1;;;;;71655:11:0::1;71668:3:::0;71640:14:::1;:32::i;:::-;71709:11;::::0;71688:38:::1;::::0;894:25:1;;;-1:-1:-1;;;;;71709:11:0;;::::1;::::0;71688:38;::::1;::::0;::::1;::::0;882:2:1;867:18;71688:38:0::1;;;;;;;71752:12;::::0;::::1;::::0;71737:57:::1;::::0;-1:-1:-1;;;;;71752:12:0::1;71780:13:::0;71766:11:::1;71774:3:::0;71766:5;:11:::1;:::i;:::-;:27;;;;:::i;:::-;71737:14;:57::i;:::-;71833:12;::::0;::::1;::::0;-1:-1:-1;;;;;71833:12:0;;::::1;::::0;71810:65;::::1;;71861:13:::0;71847:11:::1;71855:3:::0;71847:5;:11:::1;:::i;:::-;:27;;;;:::i;:::-;71810:65;::::0;894:25:1;;;882:2;867:18;71810:65:0::1;;;;;;;-1:-1:-1::0;;61159:1:0;61150:6;:10;-1:-1:-1;;;;;;;;70521:1362:0:o;72222:681::-;-1:-1:-1;;;;;72425:21:0;;;72402:20;72425:21;;;:13;:21;;;;;;;;;72402:44;;;;;;;;;;;;;;;-1:-1:-1;;;72402:44:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;72402:44:0;;;;;;;;;;-1:-1:-1;;;;;;;;72402:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72465:22;72402:44;72465:20;:22::i;:::-;72457:63;;;;-1:-1:-1;;;72457:63:0;;23685:2:1;72457:63:0;;;23667:21:1;23724:2;23704:18;;;23697:30;23763;23743:18;;;23736:58;23811:18;;72457:63:0;23483:352:1;72457:63:0;72553:4;:12;;;-1:-1:-1;;;;;72539:26:0;:10;-1:-1:-1;;;;;72539:26:0;;72531:56;;;;-1:-1:-1;;;72531:56:0;;24042:2:1;72531:56:0;;;24024:21:1;24081:2;24061:18;;;24054:30;-1:-1:-1;;;24100:18:1;;;24093:47;24157:18;;72531:56:0;23840:341:1;72531:56:0;72620:121;;-1:-1:-1;;;;;24473:15:1;;;72620:121:0;;;24455:34:1;24525:15;;24505:18;;;24498:43;72709:10:0;24557:18:1;;;24550:43;24609:18;;;24602:34;;;72600:17:0;;24389:19:1;;72620:121:0;;;-1:-1:-1;;72620:121:0;;;;;;;;;;;;;;-1:-1:-1;;;;;72620:121:0;-1:-1:-1;;;72620:121:0;;;72752:69;-1:-1:-1;;;72752:69:0;;72620:121;;-1:-1:-1;;;;;;72752:31:0;;;;;:69;;72784:8;;72620:121;;72800:20;;;;72752:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72752:69:0;;;;;;;;;;;;:::i;:::-;;;72878:6;-1:-1:-1;;;;;72839:56:0;72866:10;-1:-1:-1;;;;;72839:56:0;72858:6;-1:-1:-1;;;;;72839:56:0;;72886:8;72839:56;;;;894:25:1;;882:2;867:18;;748:177;72839:56:0;;;;;;;;72391:512;;72222:681;;;;;:::o;74017:138::-;-1:-1:-1;;;;;74108:21:0;;;74079:9;74108:21;;;:13;:21;;;;;;;;:37;;;;;;;;;;;;;;;-1:-1:-1;;;74108:37:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;74108:37:0;;;;;;;;;;-1:-1:-1;;;;;;;;74108:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74079:9;74108:39;;:37;:39::i;:::-;74101:46;74017:138;-1:-1:-1;;74017:138:0:o;15264:749::-;15462:15;;15375:19;;15412:15;;;15507:37;15462:8;:15;15507:12;:37::i;:::-;15488:56;;15574:8;-1:-1:-1;;;;;15562:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15555:28;;15679:9;15674:321;15694:13;15690:1;:17;15674:321;;;15733:21;15765:8;15774:1;15765:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;15757:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15757:40:0;;;;;;;;;;;;:::i;:::-;15839:13;;15733:64;;-1:-1:-1;15816:20:0;15871:109;15891:12;15887:1;:16;15871:109;;;15951:6;15958:1;15951:9;;;;;;;;:::i;:::-;;;;;;;15933:4;15938:9;;;;;;15933:15;;;;;;;;:::i;:::-;;;;;;;;;;:27;15905:3;;15871:109;;;;15714:281;;15709:3;;;;;15674:321;;;;15401:612;;;15264:749;;;:::o;8836:265::-;8898:7;8941:1;8926:5;:12;:16;8918:63;;;;-1:-1:-1;;;8918:63:0;;27949:2:1;8918:63:0;;;27931:21:1;27988:2;27968:18;;;27961:30;28027:34;28007:18;;;28000:62;-1:-1:-1;;;28078:18:1;;;28071:32;28120:19;;8918:63:0;27747:398:1;8918:63:0;9014:1;8999:5;:12;:16;8992:76;;;9040:16;9050:5;9040:9;:16::i;:::-;9032:24;;8992:76;;;9085:5;9091:1;9085:8;;;;;;;;:::i;:::-;;;;;;;9078:15;;8836:265;;;:::o;8215:471::-;8354:4;8451:13;8354:4;8500:130;8524:6;:13;8520:1;:17;8500:130;;;8577:37;8591:11;8604:6;8611:1;8604:9;;;;;;;;:::i;:::-;;;;;;;8577:13;:37::i;:::-;8563:51;-1:-1:-1;8539:3:0;;8500:130;;;-1:-1:-1;8658:20:0;;;;8215:471;-1:-1:-1;;;8215:471:0:o;67746:979::-;68032:13;68058:31;:29;;;;;;;:9;:29;:::i;:::-;;:31::i;:::-;68100:26;68129:28;68148:8;;68129:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68129:18:0;;-1:-1:-1;;;68129:28:0:i;:::-;68100:57;;68168:18;68189;68197:9;68189:7;:18::i;:::-;68226:43;;-1:-1:-1;;;68226:43:0;;;;;894:25:1;;;68168:39:0;;-1:-1:-1;68241:8:0;-1:-1:-1;;;;;68226:31:0;;;;867:18:1;;68226:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68284:61;;-1:-1:-1;;;68284:61:0;;-1:-1:-1;;;68284:61:0;;;2853:52:1;68218:51:0;;-1:-1:-1;;;;;;68284:33:0;;;;;2826:18:1;;68284:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68280:149;;;-1:-1:-1;;;;;68361:24:0;;;;;;;:17;:24;;;;;;;;:33;;-1:-1:-1;;;;;;68361:33:0;;;;;;;;;;;68396:19;:26;;;:32;;;68280:149;-1:-1:-1;;;;;68442:20:0;;;;;;:13;:20;;;;;68465:9;;68442:32;68465:9;68442:20;:32;:::i;:::-;-1:-1:-1;;68487:52:0;;-1:-1:-1;;;68487:52:0;;68516:10;68487:52;;;34710:34:1;-1:-1:-1;;;;;34780:15:1;;;34760:18;;;34753:43;34812:18;;;34805:34;;;68487:28:0;;;;;34645:18:1;;68487:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68550:61;68560:5;68575:4;68582:9;:16;;;;;;;;;;:::i;:::-;68550:61;;68600:10;;68550:9;:61::i;:::-;68643:5;-1:-1:-1;;;;;68629:30:0;;68650:8;;68629:30;;;;;;;:::i;:::-;;;;;;;;68694:6;-1:-1:-1;;;;;68675:42:0;68687:5;-1:-1:-1;;;;;68675:42:0;;68702:3;68707:9;68675:42;;;;;;;:::i;:::-;;;;;;;;68047:678;;67746:979;;;;;;;;;;;;;:::o;67229:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67229:53:0;;-1:-1:-1;67229:53:0;;-1:-1:-1;67229:53:0:o;14234:739::-;14426:15;;14337:21;;14376:15;;;14471:37;14426:8;:15;14471:12;:37::i;:::-;14452:56;;14540:8;-1:-1:-1;;;;;14526:23:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14526:23:0;;14519:30;;14645:9;14640:315;14660:13;14656:1;:17;14640:315;;;14699:23;14733:8;14742:1;14733:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;14725:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14725:32:0;;;;;;;;;;;;:::i;:::-;14799:13;;14699:58;;-1:-1:-1;14776:20:0;14831:109;14851:12;14847:1;:16;14831:109;;;14911:6;14918:1;14911:9;;;;;;;;:::i;:::-;;;;;;;14893:4;14898:9;;;;;;14893:15;;;;;;;;:::i;:::-;;;;;;;;;;:27;14865:3;;14831:109;;;;14680:275;;14675:3;;;;;14640:315;;4796:388;4840:23;4876:31;4910:16;:14;:16::i;:::-;4954:18;;4876:50;;-1:-1:-1;4954:18:0;-1:-1:-1;;;;;4992:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4992:21:0;;4983:30;;5054:9;5049:117;5069:6;5065:1;:10;5049:117;;;5134:11;5146:1;5134:14;;;;;;;;:::i;:::-;;;;;;;5123:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;5113:37;;;;;;5101:6;5108:1;5101:9;;;;;;;;:::i;:::-;;;;;;;;;;:49;5077:3;;5049:117;;;;4865:319;;4796:388;:::o;68889:470::-;-1:-1:-1;;;;;68991:21:0;;68967;68991;;;:13;:21;;;;;;69039:20;69005:6;69039:12;:20::i;:::-;69023:36;-1:-1:-1;69070:50:0;:4;69023:36;69112:7;69070:25;:50::i;:::-;-1:-1:-1;;;;;69133:24:0;;;;;;:16;:24;;;;;;;;:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;69133:41:0;69163:10;69133:41;;;;;;69185:26;;;:18;:26;;;;;:38;;;;;;;;;:51;;69227:9;;69133:24;69185:51;;69227:9;;69185:51;:::i;:::-;;;;-1:-1:-1;;;;;;;69247:17:0;;;;;;:9;:17;;;;;;;;69265:10;69247:29;;;;;;;:40;;;;;;:17;:40;;;;;:::i;:::-;;;;-1:-1:-1;;69305:46:0;;;38703:6:1;38691:19;;38673:38;;38742:2;38727:18;;38720:34;;;69324:10:0;;-1:-1:-1;;;;;69305:46:0;;;;;38646:18:1;69305:46:0;;;;;;;68956:403;;68889:470;;:::o;9325:1773::-;9430:22;9493:1;9478:5;:12;:16;9470:64;;;;-1:-1:-1;;;9470:64:0;;38967:2:1;9470:64:0;;;38949:21:1;39006:2;38986:18;;;38979:30;39045:34;39025:18;;;39018:62;-1:-1:-1;;;39096:18:1;;;39089:33;39139:19;;9470:64:0;38765:399:1;9470:64:0;9622:12;9637:28;9652:5;:12;9637:14;:28::i;:::-;9622:43;;9676:23;9716:4;-1:-1:-1;;;;;9702:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9702:19:0;;9676:45;;9732:11;9754:15;10086:502;10108:1;10093:5;:12;:16;10086:502;;;10167:1;10159:5;:9;10172:1;10159:14;10155:308;;10212:5;10226:1;10218:5;:9;10212:16;;;;;;;;:::i;:::-;;;;;;;10198:6;10205:3;10198:11;;;;;;;;:::i;:::-;;;;;;:30;;;;;10155:308;;;10271:5;:12;10258:5;10266:1;10258:9;:25;10254:209;;10330:1;10322:10;;10308:6;10315:3;10308:11;;;;;;;;:::i;:::-;;;;;;;;;;:24;10355:9;;10254:209;;;10427:5;10433;10441:1;10433:9;10427:16;;;;;;;;:::i;:::-;;;;;;;10413:6;10420:3;10413:11;;;;;;;;:::i;:::-;;;;;;:30;;;;;10254:209;10481:5;;;;;10521:1;10513:5;:9;10505:17;;10560:16;10570:5;10560:9;:16::i;:::-;10552:24;;10086:502;;;10759:14;10806;10813:7;10806:4;:14;:::i;:::-;-1:-1:-1;;;;;10792:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10792:29:0;;10784:37;;10862:9;10857:223;10877:4;10873:1;:8;10857:223;;;10932:1;10924:10;;10911:6;10918:1;10911:9;;;;;;;;:::i;:::-;;;;;;;:23;10907:158;;10979:6;10986:1;10979:9;;;;;;;;:::i;:::-;;;;;;;10959:5;10969:6;10965:1;:10;10959:17;;;;;;;;:::i;:::-;;;;;;:29;;;;;10907:158;;;11037:8;;;;;10907:158;10883:3;;10857:223;;;;9459:1639;;;;;9325:1773;;;;:::o;74394:405::-;-1:-1:-1;;;;;74511:21:0;;;74468:7;74511:21;;;:13;:21;;;;;;;;74488:44;;;;;;;;;;;;;;;-1:-1:-1;;;74488:44:0;;;;;;;;;;-1:-1:-1;;;;;;;;74488:44:0;;;;;;;-1:-1:-1;;;;;;;;74488:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74577:17;;;74488:44;74577:17;;;;;:26;;;;;;;;;;;;74563:11;;74468:7;;74488:44;74468:7;;74563:40;;74577:26;74563:40;;:::i;:::-;-1:-1:-1;;;;;74640:23:0;;;74614;74640;;;:15;:23;;;;;;;;:32;;;;;;;;;;;;;74701:26;;;:18;:26;;;;;:35;;;;;;;;;;;74543:60;;-1:-1:-1;74640:32:0;74543:60;74754:25;74640:32;74701:35;74754:25;:::i;:::-;:37;;;;:::i;:::-;74747:44;74394:405;-1:-1:-1;;;;;;;74394:405:0:o;75027:362::-;75207:19;;;75224:1;75207:19;;;75144:31;75207:19;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;75207:19:0;;-1:-1:-1;;75207:19:0;;;;;;;;;;;75193:33;;75254:22;:20;:22::i;:::-;75277:1;75254:25;;;;;;;;:::i;:::-;;;;;;;75237:11;75249:1;75237:14;;;;;;;;:::i;:::-;;;;;;:42;;;;75307:74;;;;;;;;75326:4;-1:-1:-1;;;;;75307:74:0;;;;;75333:8;-1:-1:-1;;;;;75307:74:0;;;;;75343:37;;;-1:-1:-1;;;;;75307:74:0;;;;;75290:11;75302:1;75290:14;;;;;;;;:::i;:::-;;;;;;:91;;;;75027:362;:::o;73007:168::-;73095:11;;-1:-1:-1;;;;;73095:11:0;73081:10;:25;73073:60;;;;-1:-1:-1;;;73073:60:0;;39371:2:1;73073:60:0;;;39353:21:1;39410:2;39390:18;;;39383:30;-1:-1:-1;;;39429:18:1;;;39422:52;39491:18;;73073:60:0;39169:346:1;73073:60:0;73144:11;:23;;-1:-1:-1;;;;;;73144:23:0;-1:-1:-1;;;;;73144:23:0;;;;;;;;;;73007:168::o;73746:125::-;-1:-1:-1;;;;;73839:24:0;;;;;;:16;:24;;;;;;;;;73832:31;;;;;;;;;;;;;;;;;73803:16;;73832:31;;;73839:24;73832:31;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73832:31:0;;;;;;;;;;;;;;;;;;;;;;;73746:125;;;:::o;7181:789::-;7256:12;7357:5;7353:38;;-1:-1:-1;7385:6:0;7378:13;;7353:38;7406:6;7402:38;;-1:-1:-1;7435:5:0;7428:12;;7402:38;7686:6;7679:5;7676:17;7667:6;7660:5;7657:17;7654:40;7651:134;;;7726:5;7721:3;7714:18;7763:6;7757:4;7750:20;7651:134;7812:6;7805:5;7802:17;7799:111;;;7851:6;7846:3;7839:19;7889:5;7883:4;7876:19;7799:111;-1:-1:-1;7947:4:0;7942:3;7932:20;7181:789;;;;:::o;5405:381::-;5457:21;5491:31;5525:16;:14;:16::i;:::-;5569:18;;5491:50;;-1:-1:-1;5569:18:0;-1:-1:-1;;;;;5607:19:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5598:28;;5667:9;5662:106;5682:6;5678:1;:10;5662:106;;;5737:11;5749:1;5737:14;;;;;;;;:::i;:::-;;;;;;;5726:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;5714:6;5721:1;5714:9;;;;;;;;:::i;:::-;;;;;;;;;;:38;5690:3;;5662:106;;73367:371;-1:-1:-1;;;;;73475:21:0;;;73426:13;73475:21;;;:13;:21;;;;;;;;73452:44;;;;;;;;;;;;;;;;-1:-1:-1;;;73452:44:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;73452:44:0;;;;;;;;;-1:-1:-1;;;;;;;;73452:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73426:13;;73452:44;73426:13;;73528:32;;:15;:32;:::i;:::-;73527:55;;;;:::i;:::-;73507:75;;73614:4;:15;;;-1:-1:-1;;;;;73602:27:0;:9;:27;73601:63;;73655:9;73637:4;:15;;;-1:-1:-1;;;;;73637:27:0;;;;;:::i;:::-;73601:63;;;73633:1;73601:63;73593:71;;73692:4;:13;;;-1:-1:-1;;;;;73684:21:0;:5;:21;73683:47;;73717:4;:13;;;-1:-1:-1;;;;;73683:47:0;;;;73709:5;73683:47;73675:55;73367:371;-1:-1:-1;;;;73367:371:0:o;21967:141::-;22029:4;22054:22;22070:5;22054:15;:22::i;:::-;:45;;;-1:-1:-1;21762:12:0;;;;21745:13;;;;:29;;;;;;;22080:19;21652:131;75397:469;-1:-1:-1;;;;;75565:26:0;;;75550:12;75565:26;;;:18;:26;;;;;;;;:35;;;;;;;;;;;;;75639:23;;;:15;:23;;;;;:32;;;;;;;;;;;75620:16;75630:6;-1:-1:-1;;;;;75620:16:0;;;:::i;:::-;:51;;;;:::i;:::-;75611:61;;;;:::i;:::-;;-1:-1:-1;75687:8:0;;75683:176;;-1:-1:-1;;;;;75712:23:0;;;;;;;:15;:23;;;;;;;;:32;;;;;;;;;;;:40;;75748:4;;75712:23;:40;;75748:4;;75712:40;:::i;:::-;;;;-1:-1:-1;75767:29:0;;-1:-1:-1;75782:7:0;75791:4;75767:14;:29::i;:::-;75833:7;-1:-1:-1;;;;;75816:31:0;75825:6;-1:-1:-1;;;;;75816:31:0;;75842:4;75816:31;;;;894:25:1;;882:2;867:18;;748:177;75816:31:0;;;;;;;;75683:176;75539:327;75397:469;;;;:::o;21791:168::-;21862:4;21905:5;:13;;;21887:31;;:15;:31;:63;;;;;21938:5;:12;;;21922:28;;:5;:13;;;:28;;;21879:72;21791:168;-1:-1:-1;;21791:168:0:o;41599:244::-;41677:32;41697:3;41702:6;41677:19;:32::i;:::-;41672:164;;41731:12;-1:-1:-1;;;;;41726:26:0;;41760:6;41726:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41784:40:0;;-1:-1:-1;;;41784:40:0;;-1:-1:-1;;;;;39712:32:1;;;41784:40:0;;;39694:51:1;39761:18;;;39754:34;;;41789:12:0;41784:27;;-1:-1:-1;41784:27:0;;-1:-1:-1;39667:18:1;;;-1:-1:-1;41784:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;41672:164;41599:244;;:::o;20972:302::-;21043:9;21069:16;21079:5;21372:15;21390;21372:33;;;;;;21282:132;21069:16;21065:46;;;-1:-1:-1;21094:17:0;;20972:302;-1:-1:-1;20972:302:0:o;21065:46::-;21126:13;21133:5;21126:6;:13::i;:::-;21122:40;;;-1:-1:-1;21148:14:0;;20972:302;-1:-1:-1;20972:302:0:o;21122:40::-;21762:12;;;;21745:13;;;;:29;;;;;;;21173:52;;-1:-1:-1;21205:20:0;;20972:302;-1:-1:-1;20972:302:0:o;21173:52::-;-1:-1:-1;21243:23:0;;20972:302;-1:-1:-1;20972:302:0:o;16264:305::-;16380:12;16440:9;16435:116;16455:7;16451:1;:11;16435:116;;;16504:8;16513:1;16504:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16496:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16496:32:0;;;;;;;;;;;;:::i;:::-;:39;16488:47;;;;;16464:3;;16435:116;;;;16264:305;;;;:::o;11264:977::-;11644:12;;11329:23;;11684:3;11675:12;;;:17;;11671:266;;11747:1;11737:11;;;11736:17;-1:-1:-1;;;;;11722:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11722:32:0;;11713:41;;11801:44;11815:5;11830:1;11821:6;:10;11815:17;;;;;;;;:::i;:::-;;;;;;;11842:1;11834:10;;11801:13;:44::i;:::-;11773:6;11796:1;11780:6;:13;:17;11773:25;;;;;;;;:::i;:::-;;;;;;:72;;;;;11671:266;;;11919:1;11909:6;:11;;-1:-1:-1;;;;;11895:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11895:26:0;;11886:35;;11671:266;12047:11;12078:9;12073:150;12102:1;12093:6;:10;12089:1;:14;12073:150;;;12146:37;12160:5;12166:1;12160:8;;;;;;;;:::i;:::-;;;;;;;12170:5;12176:1;12180;12176:5;12170:12;;;;;;;;:::i;12146:37::-;12132:6;12139:3;12132:11;;;;;;;;:::i;:::-;;;;;;;;;;:51;12202:5;;;;;12110:1;12105:6;12073:150;;;;11602:632;;11264:977;;;:::o;22548:631::-;22633:15;;:42;22659:15;22633:42;;;;;;22625:73;;;;-1:-1:-1;;;22625:73:0;;40001:2:1;22625:73:0;;;39983:21:1;40040:2;40020:18;;;40013:30;-1:-1:-1;;;40059:18:1;;;40052:48;40117:18;;22625:73:0;39799:342:1;22625:73:0;22735:5;:13;;;22717:31;;:5;:15;;;:31;;;22709:62;;;;-1:-1:-1;;;22709:62:0;;40001:2:1;22709:62:0;;;39983:21:1;40040:2;40020:18;;;40013:30;-1:-1:-1;;;40059:18:1;;;40052:48;40117:18;;22709:62:0;39799:342:1;22709:62:0;22812:1;22790:5;:19;;;-1:-1:-1;;;;;22790:23:0;;22782:54;;;;-1:-1:-1;;;22782:54:0;;40348:2:1;22782:54:0;;;40330:21:1;40387:2;40367:18;;;40360:30;-1:-1:-1;;;40406:18:1;;;40399:48;40464:18;;22782:54:0;40146:342:1;22782:54:0;22874:5;:14;;;-1:-1:-1;;;;;22855:33:0;:5;:16;;;-1:-1:-1;;;;;22855:33:0;;22847:65;;;;-1:-1:-1;;;22847:65:0;;40695:2:1;22847:65:0;;;40677:21:1;40734:2;40714:18;;;40707:30;-1:-1:-1;;;40753:18:1;;;40746:49;40812:18;;22847:65:0;40493:343:1;22847:65:0;22931:12;;;;-1:-1:-1;;;;;22931:17:0;;22923:51;;;;-1:-1:-1;;;22923:51:0;;41043:2:1;22923:51:0;;;41025:21:1;41082:2;41062:18;;;41055:30;-1:-1:-1;;;41101:18:1;;;41094:51;41162:18;;22923:51:0;40841:345:1;22923:51:0;23008:1;22993:5;:12;;;:16;;;22985:49;;;;-1:-1:-1;;;22985:49:0;;41393:2:1;22985:49:0;;;41375:21:1;41432:2;41412:18;;;41405:30;-1:-1:-1;;;41451:18:1;;;41444:50;41511:18;;22985:49:0;41191:344:1;22985:49:0;23053:13;;;;:18;;;23045:49;;;;-1:-1:-1;;;23045:49:0;;41742:2:1;23045:49:0;;;41724:21:1;41781:2;41761:18;;;41754:30;-1:-1:-1;;;41800:18:1;;;41793:48;41858:18;;23045:49:0;41540:342:1;23045:49:0;23113:20;;;;-1:-1:-1;;;;;23113:25:0;;23105:66;;;;-1:-1:-1;;;23105:66:0;;42089:2:1;23105:66:0;;;42071:21:1;42128:2;42108:18;;;42101:30;42167;42147:18;;;42140:58;42215:18;;23105:66:0;41887:352:1;23105:66:0;22548:631;:::o;60311:305::-;60493:47;;-1:-1:-1;;;;;39712:32:1;;60493:47:0;;;39694:51:1;39761:18;;;39754:34;;;60473:17:0;;39667:18:1;;60493:47:0;;;-1:-1:-1;;60493:47:0;;;;;;;;;;;;;;-1:-1:-1;;;;;60493:47:0;-1:-1:-1;;;60493:47:0;;;60551:57;-1:-1:-1;;;60551:57:0;;60493:47;;-1:-1:-1;;;;;;60551:31:0;;;;;:57;;60583:6;;60493:47;;60597:10;;;;60551:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60551:57:0;;;;;;;;;;;;:::i;:::-;;;60462:154;60311:305;;;;;:::o;22260:280::-;22398:34;;;;;;;;;;;;;;;;-1:-1:-1;;;22398:34:0;;;;;;;;;;-1:-1:-1;;;;;;;;22398:34:0;;;;;;;;;;-1:-1:-1;;;;;;;;22398:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22398:34:0;;;;;;;22418:5;22425:6;22398:12;:34::i;:::-;22443:13;;;;:23;;22460:6;;22443:13;:23;;22460:6;;22443:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;22498:12;;;;;;;22481:13;;;;;;;:29;;-1:-1:-1;22477:55:0;;22512:12;;;:20;;-1:-1:-1;;;;;22512:20:0;;;-1:-1:-1;;;22512:20:0;;;;;;22260:280;;;:::o;59728:300::-;59917:19;;;59934:1;59917:19;;;;;;;;;59854:31;;59917:19;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;59917:19:0;;-1:-1:-1;;59917:19:0;;;;;;;;-1:-1:-1;;59964:56:0;;;;;;;;59983:4;59964:56;;-1:-1:-1;;;;;59990:6:0;59964:56;;;;;-1:-1:-1;;;59964:56:0;;;;;;;59947:14;;;;-1:-1:-1;59964:56:0;59947:14;;-1:-1:-1;;59947:14:0;;;;:::i;41085:380::-;41161:12;41418:3;-1:-1:-1;;;;;41418:8:0;41434:6;41447:5;41418:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41404:53:0;;41085:380;-1:-1:-1;;;;41085:380:0:o;21422:222::-;21527:15;;21484:4;;21509:33;;:15;:33;:81;;;;;21577:5;:13;;;21559:31;;:15;:31;21509:81;:126;;;;;21623:5;:12;;;21607:28;;:5;:13;;;:28;;;21501:135;21422:222;-1:-1:-1;;21422:222:0:o;23187:470::-;23343:14;;;;:5;:14;:::i;:::-;-1:-1:-1;;;;;23329:29:0;:9;:29;;23321:66;;;;-1:-1:-1;;;23321:66:0;;42885:2:1;23321:66:0;;;42867:21:1;42924:2;42904:18;;;42897:30;42963:26;42943:18;;;42936:54;43007:18;;23321:66:0;42683:348:1;23321:66:0;23406:5;:12;;;:17;;23422:1;23406:17;23398:56;;;;-1:-1:-1;;;23398:56:0;;43238:2:1;23398:56:0;;;43220:21:1;43277:2;43257:18;;;43250:30;43316:28;43296:18;;;43289:56;43362:18;;23398:56:0;43036:350:1;23398:56:0;23499:6;23473:32;;:22;23489:5;23473:15;:22::i;:::-;:32;;23465:71;;;;-1:-1:-1;;;23465:71:0;;43593:2:1;23465:71:0;;;43575:21:1;43632:2;43612:18;;;43605:30;43671:28;43651:18;;;43644:56;43717:18;;23465:71:0;43391:350:1;23465:71:0;23555:13;23562:5;23555:6;:13::i;:::-;23547:40;;;;-1:-1:-1;;;23547:40:0;;43948:2:1;23547:40:0;;;43930:21:1;43987:2;43967:18;;;43960:30;-1:-1:-1;;;44006:18:1;;;43999:44;44060:18;;23547:40:0;43746:338:1;23547:40:0;23615:1;23606:6;:10;;;23598:51;;;;-1:-1:-1;;;23598:51:0;;44291:2:1;23598:51:0;;;44273:21:1;44330:2;44310:18;;;44303:30;44369;44349:18;;;44342:58;44417:18;;23598:51:0;44089:352:1;22116:136:0;22187:7;22230:5;:13;;;22215:5;:12;;;:28;;;;:::i;:::-;22207:37;;;22116:136;-1:-1:-1;;22116:136:0:o;563:180:1:-;622:6;675:2;663:9;654:7;650:23;646:32;643:52;;;691:1;688;681:12;643:52;-1:-1:-1;714:23:1;;563:180;-1:-1:-1;563:180:1:o;930:131::-;-1:-1:-1;;;;;1005:31:1;;995:42;;985:70;;1051:1;1048;1041:12;1066:134;1134:20;;1163:31;1134:20;1163:31;:::i;:::-;1066:134;;;:::o;1205:388::-;1273:6;1281;1334:2;1322:9;1313:7;1309:23;1305:32;1302:52;;;1350:1;1347;1340:12;1302:52;1389:9;1376:23;1408:31;1433:5;1408:31;:::i;:::-;1458:5;-1:-1:-1;1515:2:1;1500:18;;1487:32;1528:33;1487:32;1528:33;:::i;:::-;1580:7;1570:17;;;1205:388;;;;;:::o;1598:347::-;1649:8;1659:6;1713:3;1706:4;1698:6;1694:17;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;-1:-1:-1;1754:20:1;;-1:-1:-1;;;;;1786:30:1;;1783:50;;;1829:1;1826;1819:12;1783:50;1866:4;1858:6;1854:17;1842:29;;1918:3;1911:4;1902:6;1894;1890:19;1886:30;1883:39;1880:59;;;1935:1;1932;1925:12;1880:59;1598:347;;;;;:::o;1950:754::-;2047:6;2055;2063;2071;2079;2132:3;2120:9;2111:7;2107:23;2103:33;2100:53;;;2149:1;2146;2139:12;2100:53;2188:9;2175:23;2207:31;2232:5;2207:31;:::i;:::-;2257:5;-1:-1:-1;2314:2:1;2299:18;;2286:32;2327:33;2286:32;2327:33;:::i;:::-;2379:7;-1:-1:-1;2433:2:1;2418:18;;2405:32;;-1:-1:-1;2488:2:1;2473:18;;2460:32;-1:-1:-1;;;;;2504:30:1;;2501:50;;;2547:1;2544;2537:12;2501:50;2586:58;2636:7;2627:6;2616:9;2612:22;2586:58;:::i;:::-;1950:754;;;;-1:-1:-1;1950:754:1;;-1:-1:-1;2663:8:1;;2560:84;1950:754;-1:-1:-1;;;1950:754:1:o;2916:247::-;2975:6;3028:2;3016:9;3007:7;3003:23;2999:32;2996:52;;;3044:1;3041;3034:12;2996:52;3083:9;3070:23;3102:31;3127:5;3102:31;:::i;:::-;3152:5;2916:247;-1:-1:-1;;;2916:247:1:o;3168:367::-;3231:8;3241:6;3295:3;3288:4;3280:6;3276:17;3272:27;3262:55;;3313:1;3310;3303:12;3262:55;-1:-1:-1;3336:20:1;;-1:-1:-1;;;;;3368:30:1;;3365:50;;;3411:1;3408;3401:12;3365:50;3448:4;3440:6;3436:17;3424:29;;3508:3;3501:4;3491:6;3488:1;3484:14;3476:6;3472:27;3468:38;3465:47;3462:67;;;3525:1;3522;3515:12;3540:782;3653:6;3661;3669;3677;3685;3738:3;3726:9;3717:7;3713:23;3709:33;3706:53;;;3755:1;3752;3745:12;3706:53;3794:9;3781:23;3813:31;3838:5;3813:31;:::i;:::-;3863:5;-1:-1:-1;3920:2:1;3905:18;;3892:32;3933:33;3892:32;3933:33;:::i;:::-;3985:7;-1:-1:-1;4039:2:1;4024:18;;4011:32;;-1:-1:-1;4094:2:1;4079:18;;4066:32;-1:-1:-1;;;;;4110:30:1;;4107:50;;;4153:1;4150;4143:12;4107:50;4192:70;4254:7;4245:6;4234:9;4230:22;4192:70;:::i;4327:342::-;4473:2;4458:18;;4506:1;4495:13;;4485:144;;4551:10;4546:3;4542:20;4539:1;4532:31;4586:4;4583:1;4576:15;4614:4;4611:1;4604:15;4485:144;4638:25;;;4327:342;:::o;4674:127::-;4735:10;4730:3;4726:20;4723:1;4716:31;4766:4;4763:1;4756:15;4790:4;4787:1;4780:15;4806:252;4878:2;4872:9;4920:3;4908:16;;-1:-1:-1;;;;;4939:34:1;;4975:22;;;4936:62;4933:88;;;5001:18;;:::i;:::-;5037:2;5030:22;4806:252;:::o;5063:275::-;5134:2;5128:9;5199:2;5180:13;;-1:-1:-1;;5176:27:1;5164:40;;-1:-1:-1;;;;;5219:34:1;;5255:22;;;5216:62;5213:88;;;5281:18;;:::i;:::-;5317:2;5310:22;5063:275;;-1:-1:-1;5063:275:1:o;5343:183::-;5403:4;-1:-1:-1;;;;;5428:6:1;5425:30;5422:56;;;5458:18;;:::i;:::-;-1:-1:-1;5503:1:1;5499:14;5515:4;5495:25;;5343:183::o;5531:966::-;5615:6;5646:2;5689;5677:9;5668:7;5664:23;5660:32;5657:52;;;5705:1;5702;5695:12;5657:52;5745:9;5732:23;-1:-1:-1;;;;;5770:6:1;5767:30;5764:50;;;5810:1;5807;5800:12;5764:50;5833:22;;5886:4;5878:13;;5874:27;-1:-1:-1;5864:55:1;;5915:1;5912;5905:12;5864:55;5951:2;5938:16;5974:60;5990:43;6030:2;5990:43;:::i;:::-;5974:60;:::i;:::-;6068:15;;;6150:1;6146:10;;;;6138:19;;6134:28;;;6099:12;;;;6174:19;;;6171:39;;;6206:1;6203;6196:12;6171:39;6230:11;;;;6250:217;6266:6;6261:3;6258:15;6250:217;;;6346:3;6333:17;6363:31;6388:5;6363:31;:::i;:::-;6407:18;;6283:12;;;;6445;;;;6250:217;;6502:258;6574:1;6584:113;6598:6;6595:1;6592:13;6584:113;;;6674:11;;;6668:18;6655:11;;;6648:39;6620:2;6613:10;6584:113;;;6715:6;6712:1;6709:13;6706:48;;;6750:1;6741:6;6736:3;6732:16;6725:27;6706:48;;6502:258;;;:::o;6765:257::-;6806:3;6844:5;6838:12;6871:6;6866:3;6859:19;6887:63;6943:6;6936:4;6931:3;6927:14;6920:4;6913:5;6909:16;6887:63;:::i;:::-;7004:2;6983:15;-1:-1:-1;;6979:29:1;6970:39;;;;7011:4;6966:50;;6765:257;-1:-1:-1;;6765:257:1:o;7027:800::-;7187:4;7216:2;7256;7245:9;7241:18;7286:2;7275:9;7268:21;7309:6;7344;7338:13;7375:6;7367;7360:22;7413:2;7402:9;7398:18;7391:25;;7475:2;7465:6;7462:1;7458:14;7447:9;7443:30;7439:39;7425:53;;7513:2;7505:6;7501:15;7534:1;7544:254;7558:6;7555:1;7552:13;7544:254;;;7651:2;7647:7;7635:9;7627:6;7623:22;7619:36;7614:3;7607:49;7679:39;7711:6;7702;7696:13;7679:39;:::i;:::-;7669:49;-1:-1:-1;7776:12:1;;;;7741:15;;;;7580:1;7573:9;7544:254;;;-1:-1:-1;7815:6:1;;7027:800;-1:-1:-1;;;;;;;7027:800:1:o;7832:662::-;7886:5;7939:3;7932:4;7924:6;7920:17;7916:27;7906:55;;7957:1;7954;7947:12;7906:55;7993:6;7980:20;8019:4;8043:60;8059:43;8099:2;8059:43;:::i;8043:60::-;8137:15;;;8223:1;8219:10;;;;8207:23;;8203:32;;;8168:12;;;;8247:15;;;8244:35;;;8275:1;8272;8265:12;8244:35;8311:2;8303:6;8299:15;8323:142;8339:6;8334:3;8331:15;8323:142;;;8405:17;;8393:30;;8443:12;;;;8356;;8323:142;;;-1:-1:-1;8483:5:1;7832:662;-1:-1:-1;;;;;;7832:662:1:o;8499:348::-;8583:6;8636:2;8624:9;8615:7;8611:23;8607:32;8604:52;;;8652:1;8649;8642:12;8604:52;8692:9;8679:23;-1:-1:-1;;;;;8717:6:1;8714:30;8711:50;;;8757:1;8754;8747:12;8711:50;8780:61;8833:7;8824:6;8813:9;8809:22;8780:61;:::i;9034:484::-;9136:6;9144;9152;9205:2;9193:9;9184:7;9180:23;9176:32;9173:52;;;9221:1;9218;9211:12;9173:52;9257:9;9244:23;9234:33;;9318:2;9307:9;9303:18;9290:32;-1:-1:-1;;;;;9337:6:1;9334:30;9331:50;;;9377:1;9374;9367:12;9331:50;9400:61;9453:7;9444:6;9433:9;9429:22;9400:61;:::i;:::-;9390:71;;;9508:2;9497:9;9493:18;9480:32;9470:42;;9034:484;;;;;:::o;9715:157::-;9776:5;9821:3;9812:6;9807:3;9803:16;9799:26;9796:46;;;9838:1;9835;9828:12;9796:46;-1:-1:-1;9860:6:1;9715:157;-1:-1:-1;9715:157:1:o;9877:1642::-;10125:6;10133;10141;10149;10157;10165;10173;10181;10189;10197;10205:7;10259:3;10247:9;10238:7;10234:23;10230:33;10227:53;;;10276:1;10273;10266:12;10227:53;-1:-1:-1;;;;;10357:2:1;10345:9;10332:23;10329:31;10326:51;;;10373:1;10370;10363:12;10326:51;10412:87;10491:7;10478:9;10465:23;10454:9;10450:39;10412:87;:::i;:::-;10518:8;;-1:-1:-1;10545:8:1;-1:-1:-1;10596:2:1;10581:18;;10568:32;10565:40;-1:-1:-1;10562:60:1;;;10618:1;10615;10608:12;10562:60;10657:96;10745:7;10738:2;10727:9;10723:18;10710:32;10699:9;10695:48;10657:96;:::i;:::-;10772:8;;-1:-1:-1;10799:8:1;-1:-1:-1;10850:2:1;10835:18;;10822:32;10819:40;-1:-1:-1;10816:60:1;;;10872:1;10869;10862:12;10816:60;10911:96;10999:7;10992:2;10981:9;10977:18;10964:32;10953:9;10949:48;10911:96;:::i;:::-;11026:8;;-1:-1:-1;11053:8:1;-1:-1:-1;11080:64:1;11136:7;11131:2;11116:18;;11080:64;:::i;:::-;11070:74;;11163:39;11197:3;11186:9;11182:19;11163:39;:::i;:::-;11153:49;;11249:3;11238:9;11234:19;11221:33;11211:43;;11304:2;11297:3;11286:9;11282:19;11269:33;11266:41;11263:61;;;11320:1;11317;11310:12;11263:61;;11360:97;11449:7;11441:3;11430:9;11426:19;11413:33;11402:9;11398:49;11360:97;:::i;:::-;11476:8;11466:18;;11504:9;11493:20;;;;9877:1642;;;;;;;;;;;;;;:::o;11524:315::-;11592:6;11600;11653:2;11641:9;11632:7;11628:23;11624:32;11621:52;;;11669:1;11666;11659:12;11621:52;11708:9;11695:23;11727:31;11752:5;11727:31;:::i;:::-;11777:5;11829:2;11814:18;;;;11801:32;;-1:-1:-1;;;11524:315:1:o;11844:632::-;12015:2;12067:21;;;12137:13;;12040:18;;;12159:22;;;11986:4;;12015:2;12238:15;;;;12212:2;12197:18;;;11986:4;12281:169;12295:6;12292:1;12289:13;12281:169;;;12356:13;;12344:26;;12425:15;;;;12390:12;;;;12317:1;12310:9;12281:169;;;-1:-1:-1;12467:3:1;;11844:632;-1:-1:-1;;;;;;11844:632:1:o;13954:117::-;14039:6;14032:5;14028:18;14021:5;14018:29;14008:57;;14061:1;14058;14051:12;14076:132;14143:20;;14172:30;14143:20;14172:30;:::i;14213:386::-;14280:6;14288;14341:2;14329:9;14320:7;14316:23;14312:32;14309:52;;;14357:1;14354;14347:12;14309:52;14396:9;14383:23;14415:31;14440:5;14415:31;:::i;:::-;14465:5;-1:-1:-1;14522:2:1;14507:18;;14494:32;14535;14494;14535;:::i;14604:416::-;14697:6;14705;14758:2;14746:9;14737:7;14733:23;14729:32;14726:52;;;14774:1;14771;14764:12;14726:52;14814:9;14801:23;-1:-1:-1;;;;;14839:6:1;14836:30;14833:50;;;14879:1;14876;14869:12;14833:50;14902:61;14955:7;14946:6;14935:9;14931:22;14902:61;:::i;:::-;14892:71;15010:2;14995:18;;;;14982:32;;-1:-1:-1;;;;14604:416:1:o;15025:1338::-;15185:6;15193;15201;15209;15217;15225;15233;15241;15294:3;15282:9;15273:7;15269:23;15265:33;15262:53;;;15311:1;15308;15301:12;15262:53;15350:9;15337:23;15369:31;15394:5;15369:31;:::i;:::-;15419:5;-1:-1:-1;15476:2:1;15461:18;;15448:32;15489:33;15448:32;15489:33;:::i;:::-;15541:7;-1:-1:-1;15599:2:1;15584:18;;15571:32;-1:-1:-1;;;;;15652:14:1;;;15649:34;;;15679:1;15676;15669:12;15649:34;15718:70;15780:7;15771:6;15760:9;15756:22;15718:70;:::i;:::-;15807:8;;-1:-1:-1;15692:96:1;-1:-1:-1;15895:2:1;15880:18;;15867:32;;-1:-1:-1;15911:16:1;;;15908:36;;;15940:1;15937;15930:12;15908:36;15979:72;16043:7;16032:8;16021:9;16017:24;15979:72;:::i;:::-;16070:8;;-1:-1:-1;15953:98:1;-1:-1:-1;16158:3:1;16143:19;;16130:33;;-1:-1:-1;16175:16:1;;;16172:36;;;16204:1;16201;16194:12;16172:36;;16243:60;16295:7;16284:8;16273:9;16269:24;16243:60;:::i;:::-;15025:1338;;;;-1:-1:-1;15025:1338:1;;-1:-1:-1;15025:1338:1;;;;;;16322:8;-1:-1:-1;;;15025:1338:1:o;16368:290::-;16486:12;;-1:-1:-1;;;;;16482:21:1;;;16470:34;;16557:4;16546:16;;;16540:23;16536:32;;;16520:14;;;16513:56;16622:4;16611:16;;;16605:23;-1:-1:-1;;;;;;16601:50:1;16585:14;;16578:74;16368:290::o;16663:708::-;16886:2;16938:21;;;17008:13;;16911:18;;;17030:22;;;16857:4;;16886:2;17109:15;;;;17083:2;17068:18;;;16857:4;17152:193;17166:6;17163:1;17160:13;17152:193;;;17215:48;17259:3;17250:6;17244:13;17215:48;:::i;:::-;17320:15;;;;17292:4;17283:14;;;;;17188:1;17181:9;17152:193;;17376:658;17547:2;17599:21;;;17669:13;;17572:18;;;17691:22;;;17518:4;;17547:2;17770:15;;;;17744:2;17729:18;;;17518:4;17813:195;17827:6;17824:1;17821:13;17813:195;;;17892:13;;-1:-1:-1;;;;;17888:39:1;17876:52;;17983:15;;;;17948:12;;;;17924:1;17842:9;17813:195;;18039:248;18107:6;18115;18168:2;18156:9;18147:7;18143:23;18139:32;18136:52;;;18184:1;18181;18174:12;18136:52;-1:-1:-1;;18207:23:1;;;18277:2;18262:18;;;18249:32;;-1:-1:-1;18039:248:1:o;18292:823::-;18398:6;18406;18414;18422;18430;18438;18491:3;18479:9;18470:7;18466:23;18462:33;18459:53;;;18508:1;18505;18498:12;18459:53;18547:9;18534:23;18566:31;18591:5;18566:31;:::i;:::-;18616:5;-1:-1:-1;18673:2:1;18658:18;;18645:32;18686:33;18645:32;18686:33;:::i;:::-;18738:7;-1:-1:-1;18792:2:1;18777:18;;18764:32;;-1:-1:-1;18843:2:1;18828:18;;18815:32;;-1:-1:-1;18898:3:1;18883:19;;18870:33;-1:-1:-1;;;;;18915:30:1;;18912:50;;;18958:1;18955;18948:12;18912:50;18997:58;19047:7;19038:6;19027:9;19023:22;18997:58;:::i;:::-;18292:823;;;;-1:-1:-1;18292:823:1;;-1:-1:-1;18292:823:1;;19074:8;;18292:823;-1:-1:-1;;;18292:823:1:o;19810:312::-;19889:6;19897;19950:2;19938:9;19929:7;19925:23;19921:32;19918:52;;;19966:1;19963;19956:12;19918:52;19998:9;19992:16;20017:31;20042:5;20017:31;:::i;:::-;20112:2;20097:18;;;;20091:25;20067:5;;20091:25;;-1:-1:-1;;;19810:312:1:o;21758:127::-;21819:10;21814:3;21810:20;21807:1;21800:31;21850:4;21847:1;21840:15;21874:4;21871:1;21864:15;21890:287;21930:7;-1:-1:-1;;;;;22023:2:1;22020:1;22016:10;22053:2;22050:1;22046:10;22109:3;22105:2;22101:12;22096:3;22093:21;22086:3;22079:11;22072:19;22068:47;22065:73;;;22118:18;;:::i;:::-;22158:13;;21890:287;-1:-1:-1;;;;21890:287:1:o;22182:125::-;22222:4;22250:1;22247;22244:8;22241:34;;;22255:18;;:::i;:::-;-1:-1:-1;22292:9:1;;22182:125::o;22312:168::-;22352:7;22418:1;22414;22410:6;22406:14;22403:1;22400:21;22395:1;22388:9;22381:17;22377:45;22374:71;;;22425:18;;:::i;:::-;-1:-1:-1;22465:9:1;;22312:168::o;22617:217::-;22657:1;22683;22673:132;;22727:10;22722:3;22718:20;22715:1;22708:31;22762:4;22759:1;22752:15;22790:4;22787:1;22780:15;22673:132;-1:-1:-1;22819:9:1;;22617:217::o;22839:128::-;22879:3;22910:1;22906:6;22903:1;22900:13;22897:39;;;22916:18;;:::i;:::-;-1:-1:-1;22952:9:1;;22839:128::o;22972:253::-;23012:3;-1:-1:-1;;;;;23101:2:1;23098:1;23094:10;23131:2;23128:1;23124:10;23162:3;23158:2;23154:12;23149:3;23146:21;23143:47;;;23170:18;;:::i;:::-;23206:13;;22972:253;-1:-1:-1;;;;22972:253:1:o;24647:737::-;-1:-1:-1;;;;;24910:32:1;;24892:51;;24979:2;24974;24959:18;;24952:30;;;-1:-1:-1;;25005:44:1;;25030:18;;25022:6;25005:44;:::i;:::-;25085:22;;;25080:2;25065:18;;25058:50;25117:22;;;-1:-1:-1;;;;;25151:31:1;;25148:51;;;25195:1;25192;25185:12;25148:51;25229:6;25226:1;25222:14;25283:6;25275;25270:2;25262:6;25258:15;25245:45;25357:1;25313:19;;25334:2;25309:28;25346:13;;;25309:28;24647:737;-1:-1:-1;;;;;;24647:737:1:o;25389:164::-;25465:13;;25514;;25507:21;25497:32;;25487:60;;25543:1;25540;25533:12;25558:496;25611:5;25664:3;25657:4;25649:6;25645:17;25641:27;25631:55;;25682:1;25679;25672:12;25631:55;25711:6;25705:13;-1:-1:-1;;;;;25733:2:1;25730:26;25727:52;;;25759:18;;:::i;:::-;25803:55;25846:2;25827:13;;-1:-1:-1;;25823:27:1;25852:4;25819:38;25803:55;:::i;:::-;25883:2;25874:7;25867:19;25929:3;25922:4;25917:2;25909:6;25905:15;25901:26;25898:35;25895:55;;;25946:1;25943;25936:12;25895:55;25959:64;26020:2;26013:4;26004:7;26000:18;25993:4;25985:6;25981:17;25959:64;:::i;26059:414::-;26144:6;26152;26205:2;26193:9;26184:7;26180:23;26176:32;26173:52;;;26221:1;26218;26211:12;26173:52;26244:37;26271:9;26244:37;:::i;:::-;26234:47;;26325:2;26314:9;26310:18;26304:25;-1:-1:-1;;;;;26344:6:1;26341:30;26338:50;;;26384:1;26381;26374:12;26338:50;26407:60;26459:7;26450:6;26439:9;26435:22;26407:60;:::i;:::-;26397:70;;;26059:414;;;;;:::o;26478:127::-;26539:10;26534:3;26530:20;26527:1;26520:31;26570:4;26567:1;26560:15;26594:4;26591:1;26584:15;26610:1132;26714:6;26745:2;26788;26776:9;26767:7;26763:23;26759:32;26756:52;;;26804:1;26801;26794:12;26756:52;26837:9;26831:16;-1:-1:-1;;;;;26907:2:1;26899:6;26896:14;26893:34;;;26923:1;26920;26913:12;26893:34;26961:6;26950:9;26946:22;26936:32;;27006:7;26999:4;26995:2;26991:13;26987:27;26977:55;;27028:1;27025;27018:12;26977:55;27057:2;27051:9;27080:60;27096:43;27136:2;27096:43;:::i;27080:60::-;27174:15;;;27256:1;27252:10;;;;27244:19;;27240:28;;;27205:12;;;;27280:19;;;27277:39;;;27312:1;27309;27302:12;27277:39;27344:2;27340;27336:11;27356:356;27372:6;27367:3;27364:15;27356:356;;;27451:3;27445:10;27487:2;27474:11;27471:19;27468:109;;;27531:1;27560:2;27556;27549:14;27468:109;27602:67;27661:7;27656:2;27642:11;27638:2;27634:20;27630:29;27602:67;:::i;:::-;27590:80;;-1:-1:-1;27690:12:1;;;;27389;;27356:356;;;-1:-1:-1;27731:5:1;26610:1132;-1:-1:-1;;;;;;;;26610:1132:1:o;28150:121::-;28235:10;28228:5;28224:22;28217:5;28214:33;28204:61;;28261:1;28258;28251:12;28276:132;28343:20;;28372:30;28343:20;28372:30;:::i;28413:129::-;-1:-1:-1;;;;;28491:5:1;28487:30;28480:5;28477:41;28467:69;;28532:1;28529;28522:12;28547:132;28614:20;;28643:30;28614:20;28643:30;:::i;28684:146::-;-1:-1:-1;;;;;28763:5:1;28759:46;28752:5;28749:57;28739:85;;28820:1;28817;28810:12;28835:134;28903:20;;28932:31;28903:20;28932:31;:::i;28974:972::-;29059:6;29112:3;29100:9;29091:7;29087:23;29083:33;29080:53;;;29129:1;29126;29119:12;29080:53;29155:22;;:::i;:::-;29200:28;29218:9;29200:28;:::i;:::-;29193:5;29186:43;29261:37;29294:2;29283:9;29279:18;29261:37;:::i;:::-;29256:2;29249:5;29245:14;29238:61;29331:37;29364:2;29353:9;29349:18;29331:37;:::i;:::-;29326:2;29319:5;29315:14;29308:61;29401:38;29435:2;29424:9;29420:18;29401:38;:::i;:::-;29396:2;29389:5;29385:14;29378:62;29473:39;29507:3;29496:9;29492:19;29473:39;:::i;:::-;29467:3;29460:5;29456:15;29449:64;29546:39;29580:3;29569:9;29565:19;29546:39;:::i;:::-;29540:3;29533:5;29529:15;29522:64;29619:38;29652:3;29641:9;29637:19;29619:38;:::i;:::-;29613:3;29606:5;29602:15;29595:63;29691:38;29724:3;29713:9;29709:19;29691:38;:::i;:::-;29685:3;29678:5;29674:15;29667:63;29749:3;29784:38;29818:2;29807:9;29803:18;29784:38;:::i;:::-;29768:14;;;29761:62;29842:3;29877:38;29896:18;;;29877:38;:::i;:::-;29861:14;;;29854:62;29865:5;28974:972;-1:-1:-1;;;28974:972:1:o;29951:251::-;30021:6;30074:2;30062:9;30053:7;30049:23;30045:32;30042:52;;;30090:1;30087;30080:12;30042:52;30122:9;30116:16;30141:31;30166:5;30141:31;:::i;30207:202::-;30274:6;30327:2;30315:9;30306:7;30302:23;30298:32;30295:52;;;30343:1;30340;30333:12;30295:52;30366:37;30393:9;30366:37;:::i;30414:174::-;30458:11;30510:3;30497:17;30523:30;30547:5;30523:30;:::i;30807:174::-;30851:11;30903:3;30890:17;30916:30;30940:5;30916:30;:::i;31232:176::-;31277:11;31329:3;31316:17;31342:31;31367:5;31342:31;:::i;31885:174::-;31929:11;31981:3;31968:17;31994:30;32018:5;31994:30;:::i;32687:176::-;32732:11;32784:3;32771:17;32797:31;32822:5;32797:31;:::i;33068:1397::-;33235:5;33222:19;33250:32;33274:7;33250:32;:::i;:::-;33355:10;33346:7;33342:24;33328:10;33324:15;33317:4;33311:11;33307:33;33304:63;33298:4;33291:77;;33377:95;33429:42;33467:2;33460:5;33456:14;33429:42;:::i;:::-;30685:11;;-1:-1:-1;;30721:32:1;30763:2;30759:14;;;;30775:18;30755:39;30718:77;30705:91;;30593:209;33377:95;33481;33533:42;33571:2;33564:5;33560:14;33533:42;:::i;:::-;31078:11;;-1:-1:-1;;31114:48:1;31172:2;31168:14;;;;31184:34;31164:55;31111:109;31098:123;;30986:241;33481:95;33585:101;33642:43;33681:2;33674:5;33670:14;33642:43;:::i;:::-;31510:11;;-1:-1:-1;;;;;31546:43:1;31599:3;31595:15;;;;-1:-1:-1;;;;;;31591:61:1;31543:110;31530:124;;31413:247;33585:101;33723:1;33717:4;33713:12;33734:107;33796:44;33835:3;33828:5;33824:15;33796:44;:::i;:::-;31771:11;;-1:-1:-1;;;;;;31767:57:1;-1:-1:-1;;;;;31826:46:1;;;;31764:109;31751:123;;31665:215;33734:107;33850:108;33913:44;33952:3;33945:5;33941:15;33913:44;:::i;33850:108::-;;33997:1;33991:4;33987:12;34008:106;34070:43;34108:3;34101:5;34097:15;34070:43;:::i;:::-;32168:11;;-1:-1:-1;;32164:28:1;32205:6;32194:18;;;;32161:52;32148:66;;32064:156;34008:106;34123:104;34183:43;34221:3;34214:5;34210:15;34183:43;:::i;:::-;32317:11;;-1:-1:-1;;32353:24:1;32387:2;32383:14;;;;32399:10;32379:31;32350:61;32337:75;;32225:193;34123:104;34236:107;34298:44;34337:3;34330:5;34326:15;34298:44;:::i;:::-;32517:11;;-1:-1:-1;;32553:56:1;32619:2;32615:14;;;;32631:42;32611:63;32550:125;32537:139;;32423:259;34236:107;;34352;34414:44;34453:3;34446:5;34442:15;34414:44;:::i;:::-;34410:1;34404:4;34400:12;32972:11;;-1:-1:-1;;;;;;32968:54:1;-1:-1:-1;;;;;33024:31:1;;;;32965:91;;;;32952:105;;32868:195;34850:245;34908:6;34961:2;34949:9;34940:7;34936:23;34932:32;34929:52;;;34977:1;34974;34967:12;34929:52;35016:9;35003:23;35035:30;35059:5;35035:30;:::i;35100:705::-;35281:2;35333:21;;;35306:18;;;35389:22;;;35252:4;;35468:6;35442:2;35427:18;;35252:4;35502:277;35516:6;35513:1;35510:13;35502:277;;;35591:6;35578:20;35611:31;35636:5;35611:31;:::i;:::-;-1:-1:-1;;;;;35667:31:1;35655:44;;35754:15;;;;35719:12;;;;35695:1;35531:9;35502:277;;35810:1543;36039:25;;;36026:3;36011:19;;36073:64;36133:2;36118:18;;36091:25;36109:6;36091:25;:::i;:::-;12557:10;12546:22;12534:35;;12481:94;36073:64;36166:34;36196:2;36188:6;36184:15;36166:34;:::i;:::-;12557:10;12546:22;;36256:2;36241:18;;12534:35;36209:51;36291:34;36321:2;36313:6;36309:15;36291:34;:::i;:::-;-1:-1:-1;;;;;12645:30:1;;36383:2;36368:18;;12633:43;36334:53;36418:35;36449:2;36441:6;36437:15;36418:35;:::i;:::-;-1:-1:-1;;;;;12753:46:1;;36512:3;36497:19;;12741:59;36462:55;36548:36;36579:3;36571:6;36567:16;36548:36;:::i;:::-;-1:-1:-1;;;;;12753:46:1;;36643:3;36628:19;;12741:59;36593:55;36679:36;36710:3;36702:6;36698:16;36679:36;:::i;:::-;-1:-1:-1;;;;;12753:46:1;;36774:3;36759:19;;12741:59;36724:55;36810:35;36840:3;36832:6;36828:16;36810:35;:::i;:::-;12887:6;12876:18;;36903:3;36888:19;;12864:31;36854:54;36939:35;36969:3;36961:6;36957:16;36939:35;:::i;:::-;36993:3;37005:53;37054:2;37043:9;37039:18;37023:14;12887:6;12876:18;12864:31;;12811:90;37005:53;37089:35;37120:2;37112:6;37108:15;37089:35;:::i;:::-;37067:57;;;37143:3;37155:54;37205:2;37194:9;37190:18;37174:14;-1:-1:-1;;;;;12753:46:1;12741:59;;12687:119;37155:54;37240:35;37271:2;37263:6;37259:15;37240:35;:::i;:::-;37218:57;;;37284:63;37342:3;37331:9;37327:19;37311:14;-1:-1:-1;;;;;88:31:1;76:44;;14:112;37284:63;;35810:1543;;;;;:::o;37358:881::-;37453:6;37484:2;37527;37515:9;37506:7;37502:23;37498:32;37495:52;;;37543:1;37540;37533:12;37495:52;37576:9;37570:16;-1:-1:-1;;;;;37601:6:1;37598:30;37595:50;;;37641:1;37638;37631:12;37595:50;37664:22;;37717:4;37709:13;;37705:27;-1:-1:-1;37695:55:1;;37746:1;37743;37736:12;37695:55;37775:2;37769:9;37798:60;37814:43;37854:2;37814:43;:::i;37798:60::-;37892:15;;;37974:1;37970:10;;;;37962:19;;37958:28;;;37923:12;;;;37998:19;;;37995:39;;;38030:1;38027;38020:12;37995:39;38054:11;;;;38074:135;38090:6;38085:3;38082:15;38074:135;;;38156:10;;38144:23;;38107:12;;;;38187;;;;38074:135;;38244:251;38430:2;38415:18;;38442:47;38419:9;38471:6;38442:47;:::i;42244:224::-;42283:3;42311:6;42344:2;42341:1;42337:10;42374:2;42371:1;42367:10;42405:3;42401:2;42397:12;42392:3;42389:21;42386:47;;;42413:18;;:::i;44446:217::-;44485:4;44514:6;44570:10;;;;44540;;44592:12;;;44589:38;;;44607:18;;:::i;:::-;44644:13;;44446:217;-1:-1:-1;;;44446:217:1:o

Swarm Source

ipfs://ff987becb65315d04ce1f645c1ee341ae3402f8d676ad9e0c2b0be3fddb22c50

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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