ETH Price: $3,429.99 (-1.94%)
Gas: 5 Gwei

Contract

0x311eB72906C65D1b11432e9Ec862A084a9B397D4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...193874472024-03-08 2:23:47132 days ago1709864627IN
Bored Stackers: B$ Token
0 ETH0.0022790148.8628782
Set Approval For...190749002024-01-24 7:06:35175 days ago1706079995IN
Bored Stackers: B$ Token
0 ETH0.000367387.87681806
Set Approval For...188740622023-12-27 2:34:47204 days ago1703644487IN
Bored Stackers: B$ Token
0 ETH0.0003163312.74861427
Set Approval For...188066652023-12-17 15:34:11213 days ago1702827251IN
Bored Stackers: B$ Token
0 ETH0.0010601342.72512718
Set Approval For...188066642023-12-17 15:33:59213 days ago1702827239IN
Bored Stackers: B$ Token
0 ETH0.0011175845.19321486
Set Approval For...186019282023-11-18 23:16:23242 days ago1700349383IN
Bored Stackers: B$ Token
0 ETH0.0004759719.24767241
Set Approval For...185074822023-11-05 18:06:59255 days ago1699207619IN
Bored Stackers: B$ Token
0 ETH0.0011402224.44690137
Set Approval For...183092292023-10-09 0:06:23283 days ago1696809983IN
Bored Stackers: B$ Token
0 ETH0.000126685.10553893
Set Approval For...182629512023-10-02 12:49:11289 days ago1696250951IN
Bored Stackers: B$ Token
0 ETH0.0005300211.36387174
Set Approval For...182549132023-10-01 9:52:23290 days ago1696153943IN
Bored Stackers: B$ Token
0 ETH0.000328387.04065264
Set Approval For...180533902023-09-03 3:48:47319 days ago1693712927IN
Bored Stackers: B$ Token
0 ETH0.0005197911.14462244
Set Approval For...180519162023-09-02 22:51:59319 days ago1693695119IN
Bored Stackers: B$ Token
0 ETH0.000439779.42402352
Set Approval For...179579702023-08-20 19:13:47332 days ago1692558827IN
Bored Stackers: B$ Token
0 ETH0.0010059521.56803206
Set Approval For...179090532023-08-13 22:55:47339 days ago1691967347IN
Bored Stackers: B$ Token
0 ETH0.0005599812.00632404
Set Approval For...178945332023-08-11 22:10:11341 days ago1691791811IN
Bored Stackers: B$ Token
0 ETH0.0008711518.67790553
Transfer From176673952023-07-11 2:25:59373 days ago1689042359IN
Bored Stackers: B$ Token
0 ETH0.000722515.96765795
Transfer From176673782023-07-11 2:22:35373 days ago1689042155IN
Bored Stackers: B$ Token
0 ETH0.000768416.18690644
Transfer From176673722023-07-11 2:21:23373 days ago1689042083IN
Bored Stackers: B$ Token
0 ETH0.0014202516.92576922
Set Approval For...173649522023-05-29 13:30:47415 days ago1685367047IN
Bored Stackers: B$ Token
0 ETH0.0021708246.54318489
Set Approval For...171315632023-04-26 16:22:11448 days ago1682526131IN
Bored Stackers: B$ Token
0 ETH0.0018179938.97844364
Set Approval For...170685692023-04-17 19:30:23457 days ago1681759823IN
Bored Stackers: B$ Token
0 ETH0.0018918340.56159527
Set Approval For...169205842023-03-27 18:44:59478 days ago1679942699IN
Bored Stackers: B$ Token
0 ETH0.0016373235.1049183
Set Approval For...168740042023-03-21 5:42:11484 days ago1679377331IN
Bored Stackers: B$ Token
0 ETH0.0004770810.21050625
Set Approval For...168671042023-03-20 6:28:59485 days ago1679293739IN
Bored Stackers: B$ Token
0 ETH0.0003736915.060412
Set Approval For...168621042023-03-19 13:36:35486 days ago1679232995IN
Bored Stackers: B$ Token
0 ETH0.0003462613.95502095
View all transactions

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
150017722022-06-21 10:11:46757 days ago1655806306
Bored Stackers: B$ Token
23.472 ETH
150017722022-06-21 10:11:46757 days ago1655806306
Bored Stackers: B$ Token
0.978 ETH
149642782022-06-14 22:48:30764 days ago1655246910
Bored Stackers: B$ Token
55.344 ETH
149642782022-06-14 22:48:30764 days ago1655246910
Bored Stackers: B$ Token
2.306 ETH
149492742022-06-12 8:51:10766 days ago1655023870
Bored Stackers: B$ Token
146.856 ETH
149492742022-06-12 8:51:10766 days ago1655023870
Bored Stackers: B$ Token
6.119 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BoredStackers

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-11
*/

/**
*                                                       .....................
*                   ,dOOOOOOOOOOkkkkkkxxxl'           .o0XXXXXXXXXXXXXXXXXXXKx'
*                  '0MMMMMMMMMMMMMMMMMMMMMX;          cWMMMMMMMMMMMMMMMMMMMMMMx.
*                  .xWMMMMMMMMMMMMMMMMMMMMWc          'kNWMMMMMMWMMMMMMMMMMMMMk.
*                   .;lloooookNMMMMMMMMMMMX;            ';;;;;;;lKMMMMMMMMMMMWo
*                            .xWMMMMMMMMMWd.                     :XMMMMMMMMMNx.
*                             .c0WMMMMMW0c.                       'd0NWWWX0x;
*                               .,codoc,.                           .',;,..
*
*
*                                        .cdoc;,'''''',;:coxOOd,
*                                       .xWMMMMWNNNNNWWMMMMMMMMx.
*                                        c0NMMMMMMMMMMMMMMWNX0x,
*                                         .,:looddddddollc;'..
*                   .','...                                                ..,:cll,
*                 ,kXWWNXK0Oxdlc;,'.....                     .....';:clodxOKXWMMMMNo.
*                .kMMMWMMMMMMMMMMWNXXK000OOkkkkxkkkkkkOOOOOO00KKXNWWMMMMMMMMMMMMMMWk.
*                .dWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNl
*                 .kWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWk.
*                  .xNWMMMMMMMMMMMMMN0OO0KKXNNNNWWMMMWNNXXK0Okxd0MMMMMMMMMMMMMMMW0'
*                   .lXMMMMMMMMMMMMMK;  ......'':0MMWx,'....    cWMMMMMMMMMMMMMWO'
*                     ,kNMMMMMMMMMMMK;       .:d0NMMMXko,       :NMMMMMMMMMMMMNx.
*                       ;kNMMMMMMMMMX;      ;0WN0KWMMXXNO.      ;XMMMMMMMMMMWO:.
*                         ;xXMMMMMMMX;     .kMWx'oWMMx''.       ;XMMMMMMMMNO:.
*                           'o0WMMMMN:      ;0WNKXWMMKc.        ;XMMMMMNOo,.
*                             .OMMMMWo       .;ld0WMMMMXk;      :NMMMMMd.
*                              cNMMMMk.          ,KMMXxOWNo.    oWMMMMNc
*                              '0MMMMX;     .:;. 'OMMK,:NMO.   .OMMMMM0'
*                              .dWMMMWd.    lNWKkkXMMNk0MNc    :NMMMMWo
*                               ,0MMMMX:     ,lx0XWMMMWXk;    .OMMMMM0'
*                                :XMMMMK:       .,OMMWx.     .dWMMMMXc
*                                 :XMMMMNd'       :O00;     .oNMMMMNo
*                                  ,OWMMMMXd;.      ..    .;kNMMMMWd.
*                                   .c0WMMMMWXOxolllcclloxKWMMMMMXl.
*                                     .:kNMMMMMMMMMMMMMMMMMMMMMXd'
*                                        'cx0NWMMMMMMMMMMMWN0xc.
*                                           ..,:llooooollc;'.
*
*/

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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

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

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

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

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: bord-stack.sol


pragma solidity ^ 0.8 .4;








contract BoredStackers is ERC721A, Pausable, Ownable {
    using Strings for uint256;

    enum SalePhase {
        Phase01,
        Phase02,
        Phase03
    }

    enum CouponType {
        Vip,
        Normal,
        Raffle,
        Public
    }

    struct Coupon {
        bytes32 r;
        bytes32 s;
        uint8 v;
    }

    uint64 public maxSupply = 5000;
    uint64 private constant mintPrice_TypeVip =  0.10 ether;
    uint64 private constant mintPrice_TypeNormal =  0.125 ether;
    uint64 private constant mintPrice_TypeRaffle =  0.15 ether;
    uint64 private mintPrice_Phase03_TypeAll =  0.15 ether;
    uint64 private constant maxMints_GiveAway = 100;
    uint64 private maxMints_PerAddress = 20;
    uint8 private constant maxMint_TypeVip_PerAddress = 5;
    uint8 private constant maxMint_TypeNormal_PerAddress = 3;
    uint8 private constant maxMint_TypeRaffle_PerAddress = 1;

    bool private isGiveAway;

    string private baseURI = "https://nft.boredstackers.com/metadata/";

    address private constant _adminSigner = 0x948C509D377b94e500d1ed97a4E28d4DF3289d14;
    address private constant treasuryAddress = 0xAc05046Eb1271489B061C8E95204800ac0bcaB72;

    mapping(address => uint256) public MintsCount;

    event NewURI(string newURI, address updatedBy);
    event WithdrawnPayment(uint256 tresuryBalance, address tresuryAddress, uint256 ownerBalance, address owner);
    event updatePhase(SalePhase phase, address updatedBy);
    event updateAdminSigner(address adminSigner, address updatedBy);
    event updateGiveAwayAddress(address giveAwayAddress, address updatedBy);
    event updateMaxSupply(uint256 newMaxSupply, address updatedBy);
    event updateMaxMintsPerAddress(uint256 newMaxMintsPerAddress, address updatedBy);
    event updateMintPricePhase03TypeAll(uint256 MintPricePhase03TypeAll, address updatedBy);

    SalePhase public phase = SalePhase.Phase01;

    constructor() ERC721A("Bored Stackers", "B$") {
        pause();
    }


    modifier onlyPhase03() {
        require(phase == SalePhase.Phase03, "Invalid phase");
        _;
    }

    /**
     * @dev setMaxSupply updates maxSupply
     *
     * Emits a {updateMaxSupply} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setMaxSupply(uint64 newMaxSupply)
    external
    onlyOwner {
        require(newMaxSupply > totalSupply(), "Invalid max supply");
        maxSupply = newMaxSupply;
        emit updateMaxSupply(newMaxSupply, msg.sender);
    }

    /**
     * @dev setMaxMintsPerAddress updates maxMintsPerAddress
     *
     * Emits a {updateMaxMintsPerAddress} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setMaxMintsPerAddress(uint8 max)
    external
    onlyOwner
    onlyPhase03 {
        maxMints_PerAddress = max;
        emit updateMaxMintsPerAddress(max, msg.sender);
    }

    /**
     * @dev setMintPricePhase03TypeAll updates mintPrice_Phase03_TypeAll
     *
     * Emits a {updateMintPricePhase03TypeAll} event.
     * Requirements:
     *
     * - Only the owner can call this function
     */
    function setMintPricePhase03TypeAll(uint8 max)
    external
    onlyOwner
    onlyPhase03 {
        mintPrice_Phase03_TypeAll = max;
        emit updateMintPricePhase03TypeAll(max, msg.sender);
    }

    /**
     * @dev setPhase updates the price and the phase to (Locked, Private, Presale or Public).
     $
     * Emits a {Unpaused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     */

    function setPhase(SalePhase phase_)
    external
    onlyOwner {
        phase = phase_;
        emit updatePhase(phase_, msg.sender);
    }


    /**
     * @dev setBaseUri updates the new token URI in contract.
     *
     * Emits a {NewURI} event.
     *
     * Requirements:
     *
     * - Only owner of contract can call this function
     **/

    function setBaseUri(string memory uri)
    external
    onlyOwner {
        baseURI = uri;
        emit NewURI(uri, msg.sender);
    }

    /**
     * @dev Mint to mint nft
     *
     * Emits [Transfer] event.
     *
     * Requirements:
     *
     * - should have a valid coupon if we are ()
     **/

    function mint(uint64 amount, Coupon memory coupon, CouponType couponType)
    external
    payable
    whenNotPaused {

        // verify coupon
        bytes32 digest = keccak256(
            abi.encode(couponType, msg.sender)
        );
        require(_isVerifiedCoupon(digest, coupon), "Invalid coupon");

        // check if user can mint
        if(phase == SalePhase.Phase01) {
            require(couponType == CouponType.Vip || couponType == CouponType.Normal,
                "Invalid coupon");
            if(couponType == CouponType.Vip) {
                _checkMint(amount, maxMint_TypeVip_PerAddress, mintPrice_TypeVip);
            }
            else if(couponType == CouponType.Normal) {
                _checkMint(amount, maxMint_TypeNormal_PerAddress, mintPrice_TypeNormal);
            }
        } else if(phase == SalePhase.Phase02) {
             require(couponType == CouponType.Vip || couponType == CouponType.Normal || couponType == CouponType.Raffle,
                "Invalid coupon");
            if(couponType == CouponType.Vip) {
                _checkMint(amount, maxMint_TypeVip_PerAddress, mintPrice_TypeVip);
            } else if(couponType == CouponType.Normal) {
                _checkMint(amount, maxMint_TypeNormal_PerAddress, mintPrice_TypeNormal);
            } else {
                _checkMint(amount, maxMint_TypeRaffle_PerAddress, mintPrice_TypeRaffle);
            }
        } else {
            require(couponType == CouponType.Vip || couponType == CouponType.Normal
                        || couponType == CouponType.Raffle || couponType == CouponType.Public,
                "Invalid coupon");
            _checkMint(amount, maxMints_PerAddress, mintPrice_Phase03_TypeAll);
        }

        // increment mint count
        unchecked {
            MintsCount[msg.sender] = MintsCount[msg.sender] + amount;
        }

        // mint
        _mint(msg.sender, amount);
    }

    function _checkMint(uint64 amount, uint64 maxMint, uint64 price) internal {
        require(amount < maxMint + 1, "Invalid amount");
        require(msg.value > amount * price - 1, "Insufficient funds in the wallet");
        require(MintsCount[msg.sender] + amount < maxMint + 1,
            "Maximum amount per wallet already minted for this phase");
        require(totalSupply() + amount < maxSupply + 1,
            "Max supply reached");
    }

    /**
     * @dev giveAway mints 100 NFT once.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - Only the giveAwayAddress call this function
     */

    function giveAway() external {
        require(msg.sender == treasuryAddress, "Invalid user");
        require(!isGiveAway, "Already minted");
        uint256 _tokenId = _nextTokenId();
        require(_tokenId + maxMints_GiveAway < maxSupply + 1, "Max supply limit reached");
        _mint(msg.sender, maxMints_GiveAway);
        isGiveAway = true;
    }

    /**
     * @dev _isVerifiedCoupon verify the coupon
     *
     */

    function _isVerifiedCoupon(bytes32 digest, Coupon memory coupon)
    internal
    pure
    returns(bool) {
        address signer = ecrecover(digest, coupon.v, coupon.r, coupon.s);
        require(signer != address(0), "ECDSA: invalid signature"); // Added check for zero address
        return signer == _adminSigner;
    }

    /**
     * @dev getAdminSigner returns the adminSigner address
     *
     */

    function getAdminSigner() public pure returns(address) {
        return _adminSigner;
    }

    /**
     * @dev getTreasuryAddress returns the treasury address
     *
     */

    function getTreasuryAddress() public pure returns(address) {
        return treasuryAddress;
    }

    /**
         * @dev getMintsCount returns count mints by address
     *
     */
    function getMintsCount(address _address) public view returns(uint256) {
        return MintsCount[_address];
    }

    /**
     * @dev getbaseURI returns the base uri
     *
     */

    function getbaseURI() public view returns(string memory) {
        return baseURI;
    }

    /**
     * @dev tokenURI returns the uri to meta data
     *
     */

    function tokenURI(uint256 tokenId)
    public
    view
    override
    returns(string memory) {
        require(_exists(tokenId), "ERC721A: Query for non-existent token");
            return bytes(baseURI).length > 0 ?
                string(abi.encodePacked(baseURI, tokenId.toString())) :
                "";

    }

    /// @dev Returns the starting token ID.
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }


    /**
     * @dev pause() is used to pause contract.
     *
     * Emits a {Paused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function pause() public onlyOwner whenNotPaused {
        _pause();
    }

    /**
     * @dev unpause() is used to unpause contract.
     *
     * Emits a {Unpaused} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function unpause() public onlyOwner whenPaused {
        _unpause();
    }

    /**
     * @dev withdraw is used to withdraw payment from contract.
     *
     * Emits a {WithdrawnPayment} event.
     *
     * Requirements:
     *
     * - Only the owner can call this function
     **/

    function withdraw() public {
        require(msg.sender == treasuryAddress || msg.sender == owner(), "Invalid user");
        uint256 balanceOwner = address(this).balance * 400 / 10000;
        address owner = owner();
        (bool success, ) = payable(owner).call{ value: balanceOwner }("");
        require(success, "Failed Transfer funds to owner");
        uint256 balanceTreasury = address(this).balance;
        (success, ) = payable(treasuryAddress).call{ value: balanceTreasury }("");
        require(success, "Failed Transfer funds to treasury");
        emit WithdrawnPayment(balanceTreasury, treasuryAddress, balanceOwner, owner);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"NewURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tresuryBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"tresuryAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"ownerBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"WithdrawnPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"adminSigner","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updateAdminSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"giveAwayAddress","type":"address"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updateGiveAwayAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxMintsPerAddress","type":"uint256"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updateMaxMintsPerAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxSupply","type":"uint256"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updateMaxSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"MintPricePhase03TypeAll","type":"uint256"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updateMintPricePhase03TypeAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum BoredStackers.SalePhase","name":"phase","type":"uint8"},{"indexed":false,"internalType":"address","name":"updatedBy","type":"address"}],"name":"updatePhase","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"MintsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdminSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTreasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getbaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveAway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"amount","type":"uint64"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"}],"internalType":"struct BoredStackers.Coupon","name":"coupon","type":"tuple"},{"internalType":"enum BoredStackers.CouponType","name":"couponType","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"enum BoredStackers.SalePhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"max","type":"uint8"}],"name":"setMaxMintsPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"newMaxSupply","type":"uint64"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"max","type":"uint8"}],"name":"setMintPricePhase03TypeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum BoredStackers.SalePhase","name":"phase_","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611388600860156101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550670214e8348c4f0000600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506014600960086101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604051806060016040528060278152602001620053a860279139600a9080519060200190620000bb92919062000492565b506000600c60006101000a81548160ff02191690836002811115620000e557620000e46200067d565b5b0217905550348015620000f757600080fd5b506040518060400160405280600e81526020017f426f72656420537461636b6572730000000000000000000000000000000000008152506040518060400160405280600281526020017f422400000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200017c92919062000492565b5080600390805190602001906200019592919062000492565b50620001a6620001ff60201b60201c565b60008190555050506000600860006101000a81548160ff021916908315150217905550620001e9620001dd6200020860201b60201c565b6200021060201b60201c565b620001f9620002d660201b60201c565b6200072d565b60006001905090565b600033905090565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e66200020860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200030c6200038760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000365576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200035c90620005e0565b60405180910390fd5b62000375620003b160201b60201c565b620003856200040660201b60201c565b565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620003c16200047b60201b60201c565b1562000404576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fb90620005be565b60405180910390fd5b565b62000416620003b160201b60201c565b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620004626200020860201b60201c565b604051620004719190620005a1565b60405180910390a1565b6000600860009054906101000a900460ff16905090565b828054620004a09062000647565b90600052602060002090601f016020900481019282620004c4576000855562000510565b82601f10620004df57805160ff191683800117855562000510565b8280016001018555821562000510579182015b828111156200050f578251825591602001919060010190620004f2565b5b5090506200051f919062000523565b5090565b5b808211156200053e57600081600090555060010162000524565b5090565b6200054d8162000613565b82525050565b60006200056260108362000602565b91506200056f82620006db565b602082019050919050565b60006200058960208362000602565b9150620005968262000704565b602082019050919050565b6000602082019050620005b8600083018462000542565b92915050565b60006020820190508181036000830152620005d98162000553565b9050919050565b60006020820190508181036000830152620005fb816200057a565b9050919050565b600082825260208201905092915050565b6000620006208262000627565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200066057607f821691505b60208210811415620006775762000676620006ac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614c6b806200073d6000396000f3fe6080604052600436106102045760003560e01c80638456cb5911610118578063c03afb59116100a0578063e00246041161006f578063e0024604146106fa578063e985e9c514610725578063ecc72bc614610762578063efa278571461079f578063f2fde38b146107c857610204565b8063c03afb5914610652578063c87b56dd1461067b578063d0c433d3146106b8578063d5abeb01146106cf57610204565b8063a0bcfc7f116100e7578063a0bcfc7f14610581578063a22cb465146105aa578063a4cfd20a146105d3578063b1c9fe6e146105fe578063b88d4fde1461062957610204565b80638456cb59146104eb5780638da5cb5b1461050257806395d89b411461052d5780639c4f3d0a1461055857610204565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146104065780635c975abb1461042f5780636352211e1461045a57806370a0823114610497578063715018a6146104d457610204565b806323b872dd146103845780633370e34c146103ad5780633ccfd60b146103d85780633f4ba83a146103ef57610204565b8063095ea7b3116101d7578063095ea7b3146102eb5780631618762e1461031457806318160ddd1461033d57806321238d3e1461036857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc1461027157806308606346146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906136e5565b6107f1565b60405161023d9190613d80565b60405180910390f35b34801561025257600080fd5b5061025b610883565b6040516102689190613e4d565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906137b5565b610915565b6040516102a59190613d19565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613522565b610991565b6040516102e291906140df565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d91906136a5565b6109a9565b005b34801561032057600080fd5b5061033b60048036038101906103369190613862565b610b50565b005b34801561034957600080fd5b50610352610ca9565b60405161035f91906140df565b60405180910390f35b610382600480360381019061037d919061380f565b610cc0565b005b34801561039057600080fd5b506103ab60048036038101906103a6919061358f565b61122a565b005b3480156103b957600080fd5b506103c261123a565b6040516103cf9190613e4d565b60405180910390f35b3480156103e457600080fd5b506103ed6112cc565b005b3480156103fb57600080fd5b5061040461157e565b005b34801561041257600080fd5b5061042d6004803603810190610428919061358f565b61160c565b005b34801561043b57600080fd5b5061044461162c565b6040516104519190613d80565b60405180910390f35b34801561046657600080fd5b50610481600480360381019061047c91906137b5565b611643565b60405161048e9190613d19565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613522565b611655565b6040516104cb91906140df565b60405180910390f35b3480156104e057600080fd5b506104e961170e565b005b3480156104f757600080fd5b50610500611796565b005b34801561050e57600080fd5b50610517611824565b6040516105249190613d19565b60405180910390f35b34801561053957600080fd5b5061054261184e565b60405161054f9190613e4d565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a91906137e2565b6118e0565b005b34801561058d57600080fd5b506105a860048036038101906105a3919061376c565b611a14565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613665565b611ae3565b005b3480156105df57600080fd5b506105e8611c5b565b6040516105f59190613d19565b60405180910390f35b34801561060a57600080fd5b50610613611c77565b6040516106209190613e09565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b91906135e2565b611c8a565b005b34801561065e57600080fd5b506106796004803603810190610674919061373f565b611cfd565b005b34801561068757600080fd5b506106a2600480360381019061069d91906137b5565b611ddf565b6040516106af9190613e4d565b60405180910390f35b3480156106c457600080fd5b506106cd611e87565b005b3480156106db57600080fd5b506106e461201c565b6040516106f1919061413f565b60405180910390f35b34801561070657600080fd5b5061070f612036565b60405161071c9190613d19565b60405180910390f35b34801561073157600080fd5b5061074c6004803603810190610747919061354f565b612052565b6040516107599190613d80565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613522565b6120e6565b60405161079691906140df565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613862565b61212f565b005b3480156107d457600080fd5b506107ef60048036038101906107ea9190613522565b612288565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061087c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610892906145ae565b80601f01602080910402602001604051908101604052809291908181526020018280546108be906145ae565b801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b5050505050905090565b600061092082612380565b610956576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b6020528060005260406000206000915090505481565b60006109b4826123df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3b6124ad565b73ffffffffffffffffffffffffffffffffffffffff1614610a9e57610a6781610a626124ad565b612052565b610a9d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b586124b5565b73ffffffffffffffffffffffffffffffffffffffff16610b76611824565b73ffffffffffffffffffffffffffffffffffffffff1614610bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc390613fdf565b60405180910390fd5b600280811115610bdf57610bde6146e9565b5b600c60009054906101000a900460ff166002811115610c0157610c006146e9565b5b14610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613f7f565b60405180910390fd5b8060ff16600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd630e82c70ec82fd72643ba0405d5c8f1adb8a623bfba5f861e50114785c94518133604051610c9e929190614183565b60405180910390a150565b6000610cb36124bd565b6001546000540303905090565b610cc86124c6565b60008133604051602001610cdd929190613de0565b604051602081830303815290604052805190602001209050610cff8184612510565b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613f3f565b60405180910390fd5b60006002811115610d5257610d516146e9565b5b600c60009054906101000a900460ff166002811115610d7457610d736146e9565b5b1415610ea45760006003811115610d8e57610d8d6146e9565b5b826003811115610da157610da06146e9565b5b1480610dd1575060016003811115610dbc57610dbb6146e9565b5b826003811115610dcf57610dce6146e9565b5b145b610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790613f3f565b60405180910390fd5b60006003811115610e2457610e236146e9565b5b826003811115610e3757610e366146e9565b5b1415610e5957610e5484600560ff1667016345785d8a000061262c565b610e9f565b60016003811115610e6d57610e6c6146e9565b5b826003811115610e8057610e7f6146e9565b5b1415610e9e57610e9d84600360ff166701bc16d674ec800061262c565b5b5b611181565b60016002811115610eb857610eb76146e9565b5b600c60009054906101000a900460ff166002811115610eda57610ed96146e9565b5b14156110555760006003811115610ef457610ef36146e9565b5b826003811115610f0757610f066146e9565b5b1480610f37575060016003811115610f2257610f216146e9565b5b826003811115610f3557610f346146e9565b5b145b80610f66575060026003811115610f5157610f506146e9565b5b826003811115610f6457610f636146e9565b5b145b610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613f3f565b60405180910390fd5b60006003811115610fb957610fb86146e9565b5b826003811115610fcc57610fcb6146e9565b5b1415610fee57610fe984600560ff1667016345785d8a000061262c565b611050565b60016003811115611002576110016146e9565b5b826003811115611015576110146146e9565b5b14156110375761103284600360ff166701bc16d674ec800061262c565b61104f565b61104e84600160ff16670214e8348c4f000061262c565b5b5b611180565b60006003811115611069576110686146e9565b5b82600381111561107c5761107b6146e9565b5b14806110ac575060016003811115611097576110966146e9565b5b8260038111156110aa576110a96146e9565b5b145b806110db5750600260038111156110c6576110c56146e9565b5b8260038111156110d9576110d86146e9565b5b145b8061110957506003808111156110f4576110f36146e9565b5b826003811115611107576111066146e9565b5b145b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613f3f565b60405180910390fd5b61117f84600960089054906101000a900467ffffffffffffffff16600960009054906101000a900467ffffffffffffffff1661262c565b5b5b8367ffffffffffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611224338567ffffffffffffffff1661282c565b50505050565b611235838383612a00565b505050565b6060600a8054611249906145ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611275906145ae565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b73ac05046eb1271489b061c8e95204800ac0bcab7273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061134c575061131d611824565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61138b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113829061405f565b60405180910390fd5b60006127106101904761139e919061435b565b6113a8919061432a565b905060006113b4611824565b905060008173ffffffffffffffffffffffffffffffffffffffff16836040516113dc90613d04565b60006040518083038185875af1925050503d8060008114611419576040519150601f19603f3d011682016040523d82523d6000602084013e61141e565b606091505b5050905080611462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611459906140bf565b60405180910390fd5b600047905073ac05046eb1271489b061c8e95204800ac0bcab7273ffffffffffffffffffffffffffffffffffffffff168160405161149f90613d04565b60006040518083038185875af1925050503d80600081146114dc576040519150601f19603f3d011682016040523d82523d6000602084013e6114e1565b606091505b50508092505081611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90613fff565b60405180910390fd5b7faa696d9f892bba4f2c871ec07aeb6a47d34d969ad02c4c130e6bffd405f256408173ac05046eb1271489b061c8e95204800ac0bcab72868660405161157094939291906140fa565b60405180910390a150505050565b6115866124b5565b73ffffffffffffffffffffffffffffffffffffffff166115a4611824565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f190613fdf565b60405180910390fd5b611602612daa565b61160a612df3565b565b61162783838360405180602001604052806000815250611c8a565b505050565b6000600860009054906101000a900460ff16905090565b600061164e826123df565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116bd576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117166124b5565b73ffffffffffffffffffffffffffffffffffffffff16611734611824565b73ffffffffffffffffffffffffffffffffffffffff161461178a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178190613fdf565b60405180910390fd5b6117946000612e56565b565b61179e6124b5565b73ffffffffffffffffffffffffffffffffffffffff166117bc611824565b73ffffffffffffffffffffffffffffffffffffffff1614611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613fdf565b60405180910390fd5b61181a6124c6565b611822612f1c565b565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461185d906145ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611889906145ae565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050905090565b6118e86124b5565b73ffffffffffffffffffffffffffffffffffffffff16611906611824565b73ffffffffffffffffffffffffffffffffffffffff161461195c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195390613fdf565b60405180910390fd5b611964610ca9565b8167ffffffffffffffff16116119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690613fbf565b60405180910390fd5b80600860156101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd5f9bd9640bc04288d4d058b332f0fda9e0defc23bc26fe4670d64c72d00f5348133604051611a0992919061415a565b60405180910390a150565b611a1c6124b5565b73ffffffffffffffffffffffffffffffffffffffff16611a3a611824565b73ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790613fdf565b60405180910390fd5b80600a9080519060200190611aa6929190613269565b507fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a483958133604051611ad8929190613e6f565b60405180910390a150565b611aeb6124ad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b50576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b5d6124ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0a6124ad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c4f9190613d80565b60405180910390a35050565b600073948c509d377b94e500d1ed97a4e28d4df3289d14905090565b600c60009054906101000a900460ff1681565b611c95848484612a00565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cf757611cc084848484612f7f565b611cf6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d056124b5565b73ffffffffffffffffffffffffffffffffffffffff16611d23611824565b73ffffffffffffffffffffffffffffffffffffffff1614611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090613fdf565b60405180910390fd5b80600c60006101000a81548160ff02191690836002811115611d9e57611d9d6146e9565b5b02179055507fef57dc11a302505b6b5cd8f89b729654e0838e587256a07f79a3af539eb5317e8133604051611dd4929190613e24565b60405180910390a150565b6060611dea82612380565b611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090613eff565b60405180910390fd5b6000600a8054611e38906145ae565b905011611e545760405180602001604052806000815250611e80565b600a611e5f836130df565b604051602001611e70929190613ce0565b6040516020818303038152906040525b9050919050565b73ac05046eb1271489b061c8e95204800ac0bcab7273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f009061405f565b60405180910390fd5b600960109054906101000a900460ff1615611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090613ebf565b60405180910390fd5b6000611f63613240565b90506001600860159054906101000a900467ffffffffffffffff16611f8891906142ec565b67ffffffffffffffff16606467ffffffffffffffff1682611fa99190614296565b10611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe09061409f565b60405180910390fd5b611ffe33606467ffffffffffffffff1661282c565b6001600960106101000a81548160ff02191690831515021790555050565b600860159054906101000a900467ffffffffffffffff1681565b600073ac05046eb1271489b061c8e95204800ac0bcab72905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6121376124b5565b73ffffffffffffffffffffffffffffffffffffffff16612155611824565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290613fdf565b60405180910390fd5b6002808111156121be576121bd6146e9565b5b600c60009054906101000a900460ff1660028111156121e0576121df6146e9565b5b14612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790613f7f565b60405180910390fd5b8060ff16600960086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f0d9807cbba1fd733b1763354801f2cee9683249ec3915c1b9e1c2413ec744ad8813360405161227d929190614183565b60405180910390a150565b6122906124b5565b73ffffffffffffffffffffffffffffffffffffffff166122ae611824565b73ffffffffffffffffffffffffffffffffffffffff1614612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90613fdf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b90613f1f565b60405180910390fd5b61237d81612e56565b50565b60008161238b6124bd565b1115801561239a575060005482105b80156123d8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806123ee6124bd565b11612476576000548110156124755760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612473575b600081141561246957600460008360019003935083815260200190815260200160002054905061243e565b80925050506124a8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b6124ce61162c565b1561250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590613f9f565b60405180910390fd5b565b600080600184846040015185600001518660200151604051600081526020016040526040516125429493929190613d9b565b6020604051602081039080840390855afa158015612564573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d790613e9f565b60405180910390fd5b73948c509d377b94e500d1ed97a4e28d4df3289d1473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b60018261263991906142ec565b67ffffffffffffffff168367ffffffffffffffff161061268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590613f5f565b60405180910390fd5b6001818461269c91906143b5565b6126a6919061442b565b67ffffffffffffffff1634116126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e89061401f565b60405180910390fd5b6001826126fe91906142ec565b67ffffffffffffffff168367ffffffffffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461275d9190614296565b1061279d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127949061407f565b60405180910390fd5b6001600860159054906101000a900467ffffffffffffffff166127c091906142ec565b67ffffffffffffffff168367ffffffffffffffff166127dd610ca9565b6127e79190614296565b10612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061403f565b60405180910390fd5b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612899576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156128d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128e16000848385613249565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16129466001841461324f565b901b60a042901b61295685613259565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061297c578160008190555050506129fb6000848385613263565b505050565b6000612a0b826123df565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a72576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a936124ad565b73ffffffffffffffffffffffffffffffffffffffff161480612ac25750612ac185612abc6124ad565b612052565b5b80612b075750612ad06124ad565b73ffffffffffffffffffffffffffffffffffffffff16612aef84610915565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ba7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bb48585856001613249565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612cb186613259565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612d3b576000600184019050600060046000838152602001908152602001600020541415612d39576000548114612d38578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612da38585856001613263565b5050505050565b612db261162c565b612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de890613edf565b60405180910390fd5b565b612dfb612daa565b6000600860006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612e3f6124b5565b604051612e4c9190613d19565b60405180910390a1565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f246124c6565b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f686124b5565b604051612f759190613d19565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fa56124ad565b8786866040518563ffffffff1660e01b8152600401612fc79493929190613d34565b602060405180830381600087803b158015612fe157600080fd5b505af192505050801561301257506040513d601f19601f8201168201806040525081019061300f9190613712565b60015b61308c573d8060008114613042576040519150601f19603f3d011682016040523d82523d6000602084013e613047565b606091505b50600081511415613084576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613127576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061323b565b600082905060005b6000821461315957808061314290614611565b915050600a82613152919061432a565b915061312f565b60008167ffffffffffffffff81111561317557613174614776565b5b6040519080825280601f01601f1916602001820160405280156131a75781602001600182028036833780820191505090505b5090505b60008514613234576001826131c091906143f7565b9150600a856131cf919061465a565b60306131db9190614296565b60f81b8183815181106131f1576131f0614747565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561322d919061432a565b94506131ab565b8093505050505b919050565b60008054905090565b50505050565b6000819050919050565b6000819050919050565b50505050565b828054613275906145ae565b90600052602060002090601f01602090048101928261329757600085556132de565b82601f106132b057805160ff19168380011785556132de565b828001600101855582156132de579182015b828111156132dd5782518255916020019190600101906132c2565b5b5090506132eb91906132ef565b5090565b5b808211156133085760008160009055506001016132f0565b5090565b600061331f61331a846141d1565b6141ac565b90508281526020810184848401111561333b5761333a6147af565b5b61334684828561456c565b509392505050565b600061336161335c84614202565b6141ac565b90508281526020810184848401111561337d5761337c6147af565b5b61338884828561456c565b509392505050565b60008135905061339f81614b74565b92915050565b6000813590506133b481614b8b565b92915050565b6000813590506133c981614ba2565b92915050565b6000813590506133de81614bb9565b92915050565b6000815190506133f381614bb9565b92915050565b600082601f83011261340e5761340d6147a5565b5b813561341e84826020860161330c565b91505092915050565b60008135905061343681614bd0565b92915050565b60008135905061344b81614be0565b92915050565b600082601f830112613466576134656147a5565b5b813561347684826020860161334e565b91505092915050565b600060608284031215613495576134946147aa565b5b61349f60606141ac565b905060006134af848285016133ba565b60008301525060206134c3848285016133ba565b60208301525060406134d78482850161350d565b60408301525092915050565b6000813590506134f281614bf0565b92915050565b60008135905061350781614c07565b92915050565b60008135905061351c81614c1e565b92915050565b600060208284031215613538576135376147b9565b5b600061354684828501613390565b91505092915050565b60008060408385031215613566576135656147b9565b5b600061357485828601613390565b925050602061358585828601613390565b9150509250929050565b6000806000606084860312156135a8576135a76147b9565b5b60006135b686828701613390565b93505060206135c786828701613390565b92505060406135d8868287016134e3565b9150509250925092565b600080600080608085870312156135fc576135fb6147b9565b5b600061360a87828801613390565b945050602061361b87828801613390565b935050604061362c878288016134e3565b925050606085013567ffffffffffffffff81111561364d5761364c6147b4565b5b613659878288016133f9565b91505092959194509250565b6000806040838503121561367c5761367b6147b9565b5b600061368a85828601613390565b925050602061369b858286016133a5565b9150509250929050565b600080604083850312156136bc576136bb6147b9565b5b60006136ca85828601613390565b92505060206136db858286016134e3565b9150509250929050565b6000602082840312156136fb576136fa6147b9565b5b6000613709848285016133cf565b91505092915050565b600060208284031215613728576137276147b9565b5b6000613736848285016133e4565b91505092915050565b600060208284031215613755576137546147b9565b5b60006137638482850161343c565b91505092915050565b600060208284031215613782576137816147b9565b5b600082013567ffffffffffffffff8111156137a05761379f6147b4565b5b6137ac84828501613451565b91505092915050565b6000602082840312156137cb576137ca6147b9565b5b60006137d9848285016134e3565b91505092915050565b6000602082840312156137f8576137f76147b9565b5b6000613806848285016134f8565b91505092915050565b600080600060a08486031215613828576138276147b9565b5b6000613836868287016134f8565b93505060206138478682870161347f565b925050608061385886828701613427565b9150509250925092565b600060208284031215613878576138776147b9565b5b60006138868482850161350d565b91505092915050565b6138988161445f565b82525050565b6138a781614471565b82525050565b6138b68161447d565b82525050565b60006138c782614248565b6138d1818561425e565b93506138e181856020860161457b565b6138ea816147be565b840191505092915050565b6138fe81614524565b82525050565b61390d81614536565b82525050565b600061391e82614253565b613928818561427a565b935061393881856020860161457b565b613941816147be565b840191505092915050565b600061395782614253565b613961818561428b565b935061397181856020860161457b565b80840191505092915050565b6000815461398a816145ae565b613994818661428b565b945060018216600081146139af57600181146139c0576139f3565b60ff198316865281860193506139f3565b6139c985614233565b60005b838110156139eb578154818901526001820191506020810190506139cc565b838801955050505b50505092915050565b6000613a0960188361427a565b9150613a14826147cf565b602082019050919050565b6000613a2c600e8361427a565b9150613a37826147f8565b602082019050919050565b6000613a4f60148361427a565b9150613a5a82614821565b602082019050919050565b6000613a7260258361427a565b9150613a7d8261484a565b604082019050919050565b6000613a9560268361427a565b9150613aa082614899565b604082019050919050565b6000613ab8600e8361427a565b9150613ac3826148e8565b602082019050919050565b6000613adb600e8361427a565b9150613ae682614911565b602082019050919050565b6000613afe600d8361427a565b9150613b098261493a565b602082019050919050565b6000613b2160108361427a565b9150613b2c82614963565b602082019050919050565b6000613b4460128361427a565b9150613b4f8261498c565b602082019050919050565b6000613b6760208361427a565b9150613b72826149b5565b602082019050919050565b6000613b8a60218361427a565b9150613b95826149de565b604082019050919050565b6000613bad60208361427a565b9150613bb882614a2d565b602082019050919050565b6000613bd060008361426f565b9150613bdb82614a56565b600082019050919050565b6000613bf360128361427a565b9150613bfe82614a59565b602082019050919050565b6000613c16600c8361427a565b9150613c2182614a82565b602082019050919050565b6000613c3960378361427a565b9150613c4482614aab565b604082019050919050565b6000613c5c60188361427a565b9150613c6782614afa565b602082019050919050565b6000613c7f601e8361427a565b9150613c8a82614b23565b602082019050919050565b613c9e816144f9565b82525050565b613cad81614548565b82525050565b613cbc81614503565b82525050565b613ccb8161455a565b82525050565b613cda81614517565b82525050565b6000613cec828561397d565b9150613cf8828461394c565b91508190509392505050565b6000613d0f82613bc3565b9150819050919050565b6000602082019050613d2e600083018461388f565b92915050565b6000608082019050613d49600083018761388f565b613d56602083018661388f565b613d636040830185613c95565b8181036060830152613d7581846138bc565b905095945050505050565b6000602082019050613d95600083018461389e565b92915050565b6000608082019050613db060008301876138ad565b613dbd6020830186613cd1565b613dca60408301856138ad565b613dd760608301846138ad565b95945050505050565b6000604082019050613df560008301856138f5565b613e02602083018461388f565b9392505050565b6000602082019050613e1e6000830184613904565b92915050565b6000604082019050613e396000830185613904565b613e46602083018461388f565b9392505050565b60006020820190508181036000830152613e678184613913565b905092915050565b60006040820190508181036000830152613e898185613913565b9050613e98602083018461388f565b9392505050565b60006020820190508181036000830152613eb8816139fc565b9050919050565b60006020820190508181036000830152613ed881613a1f565b9050919050565b60006020820190508181036000830152613ef881613a42565b9050919050565b60006020820190508181036000830152613f1881613a65565b9050919050565b60006020820190508181036000830152613f3881613a88565b9050919050565b60006020820190508181036000830152613f5881613aab565b9050919050565b60006020820190508181036000830152613f7881613ace565b9050919050565b60006020820190508181036000830152613f9881613af1565b9050919050565b60006020820190508181036000830152613fb881613b14565b9050919050565b60006020820190508181036000830152613fd881613b37565b9050919050565b60006020820190508181036000830152613ff881613b5a565b9050919050565b6000602082019050818103600083015261401881613b7d565b9050919050565b6000602082019050818103600083015261403881613ba0565b9050919050565b6000602082019050818103600083015261405881613be6565b9050919050565b6000602082019050818103600083015261407881613c09565b9050919050565b6000602082019050818103600083015261409881613c2c565b9050919050565b600060208201905081810360008301526140b881613c4f565b9050919050565b600060208201905081810360008301526140d881613c72565b9050919050565b60006020820190506140f46000830184613c95565b92915050565b600060808201905061410f6000830187613c95565b61411c602083018661388f565b6141296040830185613c95565b614136606083018461388f565b95945050505050565b60006020820190506141546000830184613cb3565b92915050565b600060408201905061416f6000830185613ca4565b61417c602083018461388f565b9392505050565b60006040820190506141986000830185613cc2565b6141a5602083018461388f565b9392505050565b60006141b66141c7565b90506141c282826145e0565b919050565b6000604051905090565b600067ffffffffffffffff8211156141ec576141eb614776565b5b6141f5826147be565b9050602081019050919050565b600067ffffffffffffffff82111561421d5761421c614776565b5b614226826147be565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142a1826144f9565b91506142ac836144f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142e1576142e061468b565b5b828201905092915050565b60006142f782614503565b915061430283614503565b92508267ffffffffffffffff0382111561431f5761431e61468b565b5b828201905092915050565b6000614335826144f9565b9150614340836144f9565b9250826143505761434f6146ba565b5b828204905092915050565b6000614366826144f9565b9150614371836144f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143aa576143a961468b565b5b828202905092915050565b60006143c082614503565b91506143cb83614503565b92508167ffffffffffffffff04831182151516156143ec576143eb61468b565b5b828202905092915050565b6000614402826144f9565b915061440d836144f9565b9250828210156144205761441f61468b565b5b828203905092915050565b600061443682614503565b915061444183614503565b9250828210156144545761445361468b565b5b828203905092915050565b600061446a826144d9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506144c182614b4c565b919050565b60008190506144d482614b60565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061452f826144b3565b9050919050565b6000614541826144c6565b9050919050565b600061455382614503565b9050919050565b600061456582614517565b9050919050565b82818337600083830152505050565b60005b8381101561459957808201518184015260208101905061457e565b838111156145a8576000848401525b50505050565b600060028204905060018216806145c657607f821691505b602082108114156145da576145d9614718565b5b50919050565b6145e9826147be565b810181811067ffffffffffffffff8211171561460857614607614776565b5b80604052505050565b600061461c826144f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561464f5761464e61468b565b5b600182019050919050565b6000614665826144f9565b9150614670836144f9565b9250826146805761467f6146ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231413a20517565727920666f72206e6f6e2d6578697374656e742060008201527f746f6b656e000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420636f75706f6e000000000000000000000000000000000000600082015250565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f496e76616c696420706861736500000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f496e76616c6964206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c6564205472616e736665722066756e647320746f207472656173757260008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320696e207468652077616c6c6574600082015250565b50565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f496e76616c696420757365720000000000000000000000000000000000000000600082015250565b7f4d6178696d756d20616d6f756e74207065722077616c6c657420616c7265616460008201527f79206d696e74656420666f722074686973207068617365000000000000000000602082015250565b7f4d617820737570706c79206c696d697420726561636865640000000000000000600082015250565b7f4661696c6564205472616e736665722066756e647320746f206f776e65720000600082015250565b60048110614b5d57614b5c6146e9565b5b50565b60038110614b7157614b706146e9565b5b50565b614b7d8161445f565b8114614b8857600080fd5b50565b614b9481614471565b8114614b9f57600080fd5b50565b614bab8161447d565b8114614bb657600080fd5b50565b614bc281614487565b8114614bcd57600080fd5b50565b60048110614bdd57600080fd5b50565b60038110614bed57600080fd5b50565b614bf9816144f9565b8114614c0457600080fd5b50565b614c1081614503565b8114614c1b57600080fd5b50565b614c2781614517565b8114614c3257600080fd5b5056fea2646970667358221220da91db777af0e22088f964ecd1470bbb0d71dfc384b8b6b8295baf13df501d2e64736f6c6343000807003368747470733a2f2f6e66742e626f726564737461636b6572732e636f6d2f6d657461646174612f

Deployed Bytecode

0x6080604052600436106102045760003560e01c80638456cb5911610118578063c03afb59116100a0578063e00246041161006f578063e0024604146106fa578063e985e9c514610725578063ecc72bc614610762578063efa278571461079f578063f2fde38b146107c857610204565b8063c03afb5914610652578063c87b56dd1461067b578063d0c433d3146106b8578063d5abeb01146106cf57610204565b8063a0bcfc7f116100e7578063a0bcfc7f14610581578063a22cb465146105aa578063a4cfd20a146105d3578063b1c9fe6e146105fe578063b88d4fde1461062957610204565b80638456cb59146104eb5780638da5cb5b1461050257806395d89b411461052d5780639c4f3d0a1461055857610204565b806323b872dd1161019b57806342842e0e1161016a57806342842e0e146104065780635c975abb1461042f5780636352211e1461045a57806370a0823114610497578063715018a6146104d457610204565b806323b872dd146103845780633370e34c146103ad5780633ccfd60b146103d85780633f4ba83a146103ef57610204565b8063095ea7b3116101d7578063095ea7b3146102eb5780631618762e1461031457806318160ddd1461033d57806321238d3e1461036857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc1461027157806308606346146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b91906136e5565b6107f1565b60405161023d9190613d80565b60405180910390f35b34801561025257600080fd5b5061025b610883565b6040516102689190613e4d565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906137b5565b610915565b6040516102a59190613d19565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613522565b610991565b6040516102e291906140df565b60405180910390f35b3480156102f757600080fd5b50610312600480360381019061030d91906136a5565b6109a9565b005b34801561032057600080fd5b5061033b60048036038101906103369190613862565b610b50565b005b34801561034957600080fd5b50610352610ca9565b60405161035f91906140df565b60405180910390f35b610382600480360381019061037d919061380f565b610cc0565b005b34801561039057600080fd5b506103ab60048036038101906103a6919061358f565b61122a565b005b3480156103b957600080fd5b506103c261123a565b6040516103cf9190613e4d565b60405180910390f35b3480156103e457600080fd5b506103ed6112cc565b005b3480156103fb57600080fd5b5061040461157e565b005b34801561041257600080fd5b5061042d6004803603810190610428919061358f565b61160c565b005b34801561043b57600080fd5b5061044461162c565b6040516104519190613d80565b60405180910390f35b34801561046657600080fd5b50610481600480360381019061047c91906137b5565b611643565b60405161048e9190613d19565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613522565b611655565b6040516104cb91906140df565b60405180910390f35b3480156104e057600080fd5b506104e961170e565b005b3480156104f757600080fd5b50610500611796565b005b34801561050e57600080fd5b50610517611824565b6040516105249190613d19565b60405180910390f35b34801561053957600080fd5b5061054261184e565b60405161054f9190613e4d565b60405180910390f35b34801561056457600080fd5b5061057f600480360381019061057a91906137e2565b6118e0565b005b34801561058d57600080fd5b506105a860048036038101906105a3919061376c565b611a14565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613665565b611ae3565b005b3480156105df57600080fd5b506105e8611c5b565b6040516105f59190613d19565b60405180910390f35b34801561060a57600080fd5b50610613611c77565b6040516106209190613e09565b60405180910390f35b34801561063557600080fd5b50610650600480360381019061064b91906135e2565b611c8a565b005b34801561065e57600080fd5b506106796004803603810190610674919061373f565b611cfd565b005b34801561068757600080fd5b506106a2600480360381019061069d91906137b5565b611ddf565b6040516106af9190613e4d565b60405180910390f35b3480156106c457600080fd5b506106cd611e87565b005b3480156106db57600080fd5b506106e461201c565b6040516106f1919061413f565b60405180910390f35b34801561070657600080fd5b5061070f612036565b60405161071c9190613d19565b60405180910390f35b34801561073157600080fd5b5061074c6004803603810190610747919061354f565b612052565b6040516107599190613d80565b60405180910390f35b34801561076e57600080fd5b5061078960048036038101906107849190613522565b6120e6565b60405161079691906140df565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613862565b61212f565b005b3480156107d457600080fd5b506107ef60048036038101906107ea9190613522565b612288565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061087c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610892906145ae565b80601f01602080910402602001604051908101604052809291908181526020018280546108be906145ae565b801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b5050505050905090565b600061092082612380565b610956576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b6020528060005260406000206000915090505481565b60006109b4826123df565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3b6124ad565b73ffffffffffffffffffffffffffffffffffffffff1614610a9e57610a6781610a626124ad565b612052565b610a9d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610b586124b5565b73ffffffffffffffffffffffffffffffffffffffff16610b76611824565b73ffffffffffffffffffffffffffffffffffffffff1614610bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc390613fdf565b60405180910390fd5b600280811115610bdf57610bde6146e9565b5b600c60009054906101000a900460ff166002811115610c0157610c006146e9565b5b14610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613f7f565b60405180910390fd5b8060ff16600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd630e82c70ec82fd72643ba0405d5c8f1adb8a623bfba5f861e50114785c94518133604051610c9e929190614183565b60405180910390a150565b6000610cb36124bd565b6001546000540303905090565b610cc86124c6565b60008133604051602001610cdd929190613de0565b604051602081830303815290604052805190602001209050610cff8184612510565b610d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3590613f3f565b60405180910390fd5b60006002811115610d5257610d516146e9565b5b600c60009054906101000a900460ff166002811115610d7457610d736146e9565b5b1415610ea45760006003811115610d8e57610d8d6146e9565b5b826003811115610da157610da06146e9565b5b1480610dd1575060016003811115610dbc57610dbb6146e9565b5b826003811115610dcf57610dce6146e9565b5b145b610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790613f3f565b60405180910390fd5b60006003811115610e2457610e236146e9565b5b826003811115610e3757610e366146e9565b5b1415610e5957610e5484600560ff1667016345785d8a000061262c565b610e9f565b60016003811115610e6d57610e6c6146e9565b5b826003811115610e8057610e7f6146e9565b5b1415610e9e57610e9d84600360ff166701bc16d674ec800061262c565b5b5b611181565b60016002811115610eb857610eb76146e9565b5b600c60009054906101000a900460ff166002811115610eda57610ed96146e9565b5b14156110555760006003811115610ef457610ef36146e9565b5b826003811115610f0757610f066146e9565b5b1480610f37575060016003811115610f2257610f216146e9565b5b826003811115610f3557610f346146e9565b5b145b80610f66575060026003811115610f5157610f506146e9565b5b826003811115610f6457610f636146e9565b5b145b610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613f3f565b60405180910390fd5b60006003811115610fb957610fb86146e9565b5b826003811115610fcc57610fcb6146e9565b5b1415610fee57610fe984600560ff1667016345785d8a000061262c565b611050565b60016003811115611002576110016146e9565b5b826003811115611015576110146146e9565b5b14156110375761103284600360ff166701bc16d674ec800061262c565b61104f565b61104e84600160ff16670214e8348c4f000061262c565b5b5b611180565b60006003811115611069576110686146e9565b5b82600381111561107c5761107b6146e9565b5b14806110ac575060016003811115611097576110966146e9565b5b8260038111156110aa576110a96146e9565b5b145b806110db5750600260038111156110c6576110c56146e9565b5b8260038111156110d9576110d86146e9565b5b145b8061110957506003808111156110f4576110f36146e9565b5b826003811115611107576111066146e9565b5b145b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613f3f565b60405180910390fd5b61117f84600960089054906101000a900467ffffffffffffffff16600960009054906101000a900467ffffffffffffffff1661262c565b5b5b8367ffffffffffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611224338567ffffffffffffffff1661282c565b50505050565b611235838383612a00565b505050565b6060600a8054611249906145ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611275906145ae565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b73ac05046eb1271489b061c8e95204800ac0bcab7273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061134c575061131d611824565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61138b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113829061405f565b60405180910390fd5b60006127106101904761139e919061435b565b6113a8919061432a565b905060006113b4611824565b905060008173ffffffffffffffffffffffffffffffffffffffff16836040516113dc90613d04565b60006040518083038185875af1925050503d8060008114611419576040519150601f19603f3d011682016040523d82523d6000602084013e61141e565b606091505b5050905080611462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611459906140bf565b60405180910390fd5b600047905073ac05046eb1271489b061c8e95204800ac0bcab7273ffffffffffffffffffffffffffffffffffffffff168160405161149f90613d04565b60006040518083038185875af1925050503d80600081146114dc576040519150601f19603f3d011682016040523d82523d6000602084013e6114e1565b606091505b50508092505081611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90613fff565b60405180910390fd5b7faa696d9f892bba4f2c871ec07aeb6a47d34d969ad02c4c130e6bffd405f256408173ac05046eb1271489b061c8e95204800ac0bcab72868660405161157094939291906140fa565b60405180910390a150505050565b6115866124b5565b73ffffffffffffffffffffffffffffffffffffffff166115a4611824565b73ffffffffffffffffffffffffffffffffffffffff16146115fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f190613fdf565b60405180910390fd5b611602612daa565b61160a612df3565b565b61162783838360405180602001604052806000815250611c8a565b505050565b6000600860009054906101000a900460ff16905090565b600061164e826123df565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116bd576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117166124b5565b73ffffffffffffffffffffffffffffffffffffffff16611734611824565b73ffffffffffffffffffffffffffffffffffffffff161461178a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178190613fdf565b60405180910390fd5b6117946000612e56565b565b61179e6124b5565b73ffffffffffffffffffffffffffffffffffffffff166117bc611824565b73ffffffffffffffffffffffffffffffffffffffff1614611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613fdf565b60405180910390fd5b61181a6124c6565b611822612f1c565b565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461185d906145ae565b80601f0160208091040260200160405190810160405280929190818152602001828054611889906145ae565b80156118d65780601f106118ab576101008083540402835291602001916118d6565b820191906000526020600020905b8154815290600101906020018083116118b957829003601f168201915b5050505050905090565b6118e86124b5565b73ffffffffffffffffffffffffffffffffffffffff16611906611824565b73ffffffffffffffffffffffffffffffffffffffff161461195c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195390613fdf565b60405180910390fd5b611964610ca9565b8167ffffffffffffffff16116119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690613fbf565b60405180910390fd5b80600860156101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507fd5f9bd9640bc04288d4d058b332f0fda9e0defc23bc26fe4670d64c72d00f5348133604051611a0992919061415a565b60405180910390a150565b611a1c6124b5565b73ffffffffffffffffffffffffffffffffffffffff16611a3a611824565b73ffffffffffffffffffffffffffffffffffffffff1614611a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8790613fdf565b60405180910390fd5b80600a9080519060200190611aa6929190613269565b507fc7908db8c8588ac430ee4efe758e7ba70a0d22e32a138b548fd0d34fa8a483958133604051611ad8929190613e6f565b60405180910390a150565b611aeb6124ad565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b50576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611b5d6124ad565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611c0a6124ad565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c4f9190613d80565b60405180910390a35050565b600073948c509d377b94e500d1ed97a4e28d4df3289d14905090565b600c60009054906101000a900460ff1681565b611c95848484612a00565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cf757611cc084848484612f7f565b611cf6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d056124b5565b73ffffffffffffffffffffffffffffffffffffffff16611d23611824565b73ffffffffffffffffffffffffffffffffffffffff1614611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090613fdf565b60405180910390fd5b80600c60006101000a81548160ff02191690836002811115611d9e57611d9d6146e9565b5b02179055507fef57dc11a302505b6b5cd8f89b729654e0838e587256a07f79a3af539eb5317e8133604051611dd4929190613e24565b60405180910390a150565b6060611dea82612380565b611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2090613eff565b60405180910390fd5b6000600a8054611e38906145ae565b905011611e545760405180602001604052806000815250611e80565b600a611e5f836130df565b604051602001611e70929190613ce0565b6040516020818303038152906040525b9050919050565b73ac05046eb1271489b061c8e95204800ac0bcab7273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f009061405f565b60405180910390fd5b600960109054906101000a900460ff1615611f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5090613ebf565b60405180910390fd5b6000611f63613240565b90506001600860159054906101000a900467ffffffffffffffff16611f8891906142ec565b67ffffffffffffffff16606467ffffffffffffffff1682611fa99190614296565b10611fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe09061409f565b60405180910390fd5b611ffe33606467ffffffffffffffff1661282c565b6001600960106101000a81548160ff02191690831515021790555050565b600860159054906101000a900467ffffffffffffffff1681565b600073ac05046eb1271489b061c8e95204800ac0bcab72905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6121376124b5565b73ffffffffffffffffffffffffffffffffffffffff16612155611824565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a290613fdf565b60405180910390fd5b6002808111156121be576121bd6146e9565b5b600c60009054906101000a900460ff1660028111156121e0576121df6146e9565b5b14612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221790613f7f565b60405180910390fd5b8060ff16600960086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055507f0d9807cbba1fd733b1763354801f2cee9683249ec3915c1b9e1c2413ec744ad8813360405161227d929190614183565b60405180910390a150565b6122906124b5565b73ffffffffffffffffffffffffffffffffffffffff166122ae611824565b73ffffffffffffffffffffffffffffffffffffffff1614612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90613fdf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b90613f1f565b60405180910390fd5b61237d81612e56565b50565b60008161238b6124bd565b1115801561239a575060005482105b80156123d8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806123ee6124bd565b11612476576000548110156124755760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612473575b600081141561246957600460008360019003935083815260200190815260200160002054905061243e565b80925050506124a8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b6124ce61162c565b1561250e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250590613f9f565b60405180910390fd5b565b600080600184846040015185600001518660200151604051600081526020016040526040516125429493929190613d9b565b6020604051602081039080840390855afa158015612564573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d790613e9f565b60405180910390fd5b73948c509d377b94e500d1ed97a4e28d4df3289d1473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161491505092915050565b60018261263991906142ec565b67ffffffffffffffff168367ffffffffffffffff161061268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590613f5f565b60405180910390fd5b6001818461269c91906143b5565b6126a6919061442b565b67ffffffffffffffff1634116126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e89061401f565b60405180910390fd5b6001826126fe91906142ec565b67ffffffffffffffff168367ffffffffffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461275d9190614296565b1061279d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127949061407f565b60405180910390fd5b6001600860159054906101000a900467ffffffffffffffff166127c091906142ec565b67ffffffffffffffff168367ffffffffffffffff166127dd610ca9565b6127e79190614296565b10612827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281e9061403f565b60405180910390fd5b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612899576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008214156128d4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128e16000848385613249565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16129466001841461324f565b901b60a042901b61295685613259565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061297c578160008190555050506129fb6000848385613263565b505050565b6000612a0b826123df565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a72576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612a936124ad565b73ffffffffffffffffffffffffffffffffffffffff161480612ac25750612ac185612abc6124ad565b612052565b5b80612b075750612ad06124ad565b73ffffffffffffffffffffffffffffffffffffffff16612aef84610915565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612b40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ba7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bb48585856001613249565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b612cb186613259565b1717600460008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612d3b576000600184019050600060046000838152602001908152602001600020541415612d39576000548114612d38578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612da38585856001613263565b5050505050565b612db261162c565b612df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de890613edf565b60405180910390fd5b565b612dfb612daa565b6000600860006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612e3f6124b5565b604051612e4c9190613d19565b60405180910390a1565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612f246124c6565b6001600860006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f686124b5565b604051612f759190613d19565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fa56124ad565b8786866040518563ffffffff1660e01b8152600401612fc79493929190613d34565b602060405180830381600087803b158015612fe157600080fd5b505af192505050801561301257506040513d601f19601f8201168201806040525081019061300f9190613712565b60015b61308c573d8060008114613042576040519150601f19603f3d011682016040523d82523d6000602084013e613047565b606091505b50600081511415613084576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613127576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061323b565b600082905060005b6000821461315957808061314290614611565b915050600a82613152919061432a565b915061312f565b60008167ffffffffffffffff81111561317557613174614776565b5b6040519080825280601f01601f1916602001820160405280156131a75781602001600182028036833780820191505090505b5090505b60008514613234576001826131c091906143f7565b9150600a856131cf919061465a565b60306131db9190614296565b60f81b8183815181106131f1576131f0614747565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561322d919061432a565b94506131ab565b8093505050505b919050565b60008054905090565b50505050565b6000819050919050565b6000819050919050565b50505050565b828054613275906145ae565b90600052602060002090601f01602090048101928261329757600085556132de565b82601f106132b057805160ff19168380011785556132de565b828001600101855582156132de579182015b828111156132dd5782518255916020019190600101906132c2565b5b5090506132eb91906132ef565b5090565b5b808211156133085760008160009055506001016132f0565b5090565b600061331f61331a846141d1565b6141ac565b90508281526020810184848401111561333b5761333a6147af565b5b61334684828561456c565b509392505050565b600061336161335c84614202565b6141ac565b90508281526020810184848401111561337d5761337c6147af565b5b61338884828561456c565b509392505050565b60008135905061339f81614b74565b92915050565b6000813590506133b481614b8b565b92915050565b6000813590506133c981614ba2565b92915050565b6000813590506133de81614bb9565b92915050565b6000815190506133f381614bb9565b92915050565b600082601f83011261340e5761340d6147a5565b5b813561341e84826020860161330c565b91505092915050565b60008135905061343681614bd0565b92915050565b60008135905061344b81614be0565b92915050565b600082601f830112613466576134656147a5565b5b813561347684826020860161334e565b91505092915050565b600060608284031215613495576134946147aa565b5b61349f60606141ac565b905060006134af848285016133ba565b60008301525060206134c3848285016133ba565b60208301525060406134d78482850161350d565b60408301525092915050565b6000813590506134f281614bf0565b92915050565b60008135905061350781614c07565b92915050565b60008135905061351c81614c1e565b92915050565b600060208284031215613538576135376147b9565b5b600061354684828501613390565b91505092915050565b60008060408385031215613566576135656147b9565b5b600061357485828601613390565b925050602061358585828601613390565b9150509250929050565b6000806000606084860312156135a8576135a76147b9565b5b60006135b686828701613390565b93505060206135c786828701613390565b92505060406135d8868287016134e3565b9150509250925092565b600080600080608085870312156135fc576135fb6147b9565b5b600061360a87828801613390565b945050602061361b87828801613390565b935050604061362c878288016134e3565b925050606085013567ffffffffffffffff81111561364d5761364c6147b4565b5b613659878288016133f9565b91505092959194509250565b6000806040838503121561367c5761367b6147b9565b5b600061368a85828601613390565b925050602061369b858286016133a5565b9150509250929050565b600080604083850312156136bc576136bb6147b9565b5b60006136ca85828601613390565b92505060206136db858286016134e3565b9150509250929050565b6000602082840312156136fb576136fa6147b9565b5b6000613709848285016133cf565b91505092915050565b600060208284031215613728576137276147b9565b5b6000613736848285016133e4565b91505092915050565b600060208284031215613755576137546147b9565b5b60006137638482850161343c565b91505092915050565b600060208284031215613782576137816147b9565b5b600082013567ffffffffffffffff8111156137a05761379f6147b4565b5b6137ac84828501613451565b91505092915050565b6000602082840312156137cb576137ca6147b9565b5b60006137d9848285016134e3565b91505092915050565b6000602082840312156137f8576137f76147b9565b5b6000613806848285016134f8565b91505092915050565b600080600060a08486031215613828576138276147b9565b5b6000613836868287016134f8565b93505060206138478682870161347f565b925050608061385886828701613427565b9150509250925092565b600060208284031215613878576138776147b9565b5b60006138868482850161350d565b91505092915050565b6138988161445f565b82525050565b6138a781614471565b82525050565b6138b68161447d565b82525050565b60006138c782614248565b6138d1818561425e565b93506138e181856020860161457b565b6138ea816147be565b840191505092915050565b6138fe81614524565b82525050565b61390d81614536565b82525050565b600061391e82614253565b613928818561427a565b935061393881856020860161457b565b613941816147be565b840191505092915050565b600061395782614253565b613961818561428b565b935061397181856020860161457b565b80840191505092915050565b6000815461398a816145ae565b613994818661428b565b945060018216600081146139af57600181146139c0576139f3565b60ff198316865281860193506139f3565b6139c985614233565b60005b838110156139eb578154818901526001820191506020810190506139cc565b838801955050505b50505092915050565b6000613a0960188361427a565b9150613a14826147cf565b602082019050919050565b6000613a2c600e8361427a565b9150613a37826147f8565b602082019050919050565b6000613a4f60148361427a565b9150613a5a82614821565b602082019050919050565b6000613a7260258361427a565b9150613a7d8261484a565b604082019050919050565b6000613a9560268361427a565b9150613aa082614899565b604082019050919050565b6000613ab8600e8361427a565b9150613ac3826148e8565b602082019050919050565b6000613adb600e8361427a565b9150613ae682614911565b602082019050919050565b6000613afe600d8361427a565b9150613b098261493a565b602082019050919050565b6000613b2160108361427a565b9150613b2c82614963565b602082019050919050565b6000613b4460128361427a565b9150613b4f8261498c565b602082019050919050565b6000613b6760208361427a565b9150613b72826149b5565b602082019050919050565b6000613b8a60218361427a565b9150613b95826149de565b604082019050919050565b6000613bad60208361427a565b9150613bb882614a2d565b602082019050919050565b6000613bd060008361426f565b9150613bdb82614a56565b600082019050919050565b6000613bf360128361427a565b9150613bfe82614a59565b602082019050919050565b6000613c16600c8361427a565b9150613c2182614a82565b602082019050919050565b6000613c3960378361427a565b9150613c4482614aab565b604082019050919050565b6000613c5c60188361427a565b9150613c6782614afa565b602082019050919050565b6000613c7f601e8361427a565b9150613c8a82614b23565b602082019050919050565b613c9e816144f9565b82525050565b613cad81614548565b82525050565b613cbc81614503565b82525050565b613ccb8161455a565b82525050565b613cda81614517565b82525050565b6000613cec828561397d565b9150613cf8828461394c565b91508190509392505050565b6000613d0f82613bc3565b9150819050919050565b6000602082019050613d2e600083018461388f565b92915050565b6000608082019050613d49600083018761388f565b613d56602083018661388f565b613d636040830185613c95565b8181036060830152613d7581846138bc565b905095945050505050565b6000602082019050613d95600083018461389e565b92915050565b6000608082019050613db060008301876138ad565b613dbd6020830186613cd1565b613dca60408301856138ad565b613dd760608301846138ad565b95945050505050565b6000604082019050613df560008301856138f5565b613e02602083018461388f565b9392505050565b6000602082019050613e1e6000830184613904565b92915050565b6000604082019050613e396000830185613904565b613e46602083018461388f565b9392505050565b60006020820190508181036000830152613e678184613913565b905092915050565b60006040820190508181036000830152613e898185613913565b9050613e98602083018461388f565b9392505050565b60006020820190508181036000830152613eb8816139fc565b9050919050565b60006020820190508181036000830152613ed881613a1f565b9050919050565b60006020820190508181036000830152613ef881613a42565b9050919050565b60006020820190508181036000830152613f1881613a65565b9050919050565b60006020820190508181036000830152613f3881613a88565b9050919050565b60006020820190508181036000830152613f5881613aab565b9050919050565b60006020820190508181036000830152613f7881613ace565b9050919050565b60006020820190508181036000830152613f9881613af1565b9050919050565b60006020820190508181036000830152613fb881613b14565b9050919050565b60006020820190508181036000830152613fd881613b37565b9050919050565b60006020820190508181036000830152613ff881613b5a565b9050919050565b6000602082019050818103600083015261401881613b7d565b9050919050565b6000602082019050818103600083015261403881613ba0565b9050919050565b6000602082019050818103600083015261405881613be6565b9050919050565b6000602082019050818103600083015261407881613c09565b9050919050565b6000602082019050818103600083015261409881613c2c565b9050919050565b600060208201905081810360008301526140b881613c4f565b9050919050565b600060208201905081810360008301526140d881613c72565b9050919050565b60006020820190506140f46000830184613c95565b92915050565b600060808201905061410f6000830187613c95565b61411c602083018661388f565b6141296040830185613c95565b614136606083018461388f565b95945050505050565b60006020820190506141546000830184613cb3565b92915050565b600060408201905061416f6000830185613ca4565b61417c602083018461388f565b9392505050565b60006040820190506141986000830185613cc2565b6141a5602083018461388f565b9392505050565b60006141b66141c7565b90506141c282826145e0565b919050565b6000604051905090565b600067ffffffffffffffff8211156141ec576141eb614776565b5b6141f5826147be565b9050602081019050919050565b600067ffffffffffffffff82111561421d5761421c614776565b5b614226826147be565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006142a1826144f9565b91506142ac836144f9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142e1576142e061468b565b5b828201905092915050565b60006142f782614503565b915061430283614503565b92508267ffffffffffffffff0382111561431f5761431e61468b565b5b828201905092915050565b6000614335826144f9565b9150614340836144f9565b9250826143505761434f6146ba565b5b828204905092915050565b6000614366826144f9565b9150614371836144f9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143aa576143a961468b565b5b828202905092915050565b60006143c082614503565b91506143cb83614503565b92508167ffffffffffffffff04831182151516156143ec576143eb61468b565b5b828202905092915050565b6000614402826144f9565b915061440d836144f9565b9250828210156144205761441f61468b565b5b828203905092915050565b600061443682614503565b915061444183614503565b9250828210156144545761445361468b565b5b828203905092915050565b600061446a826144d9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506144c182614b4c565b919050565b60008190506144d482614b60565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b600061452f826144b3565b9050919050565b6000614541826144c6565b9050919050565b600061455382614503565b9050919050565b600061456582614517565b9050919050565b82818337600083830152505050565b60005b8381101561459957808201518184015260208101905061457e565b838111156145a8576000848401525b50505050565b600060028204905060018216806145c657607f821691505b602082108114156145da576145d9614718565b5b50919050565b6145e9826147be565b810181811067ffffffffffffffff8211171561460857614607614776565b5b80604052505050565b600061461c826144f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561464f5761464e61468b565b5b600182019050919050565b6000614665826144f9565b9150614670836144f9565b9250826146805761467f6146ba565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f416c7265616479206d696e746564000000000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231413a20517565727920666f72206e6f6e2d6578697374656e742060008201527f746f6b656e000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420636f75706f6e000000000000000000000000000000000000600082015250565b7f496e76616c696420616d6f756e74000000000000000000000000000000000000600082015250565b7f496e76616c696420706861736500000000000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f496e76616c6964206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c6564205472616e736665722066756e647320746f207472656173757260008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320696e207468652077616c6c6574600082015250565b50565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b7f496e76616c696420757365720000000000000000000000000000000000000000600082015250565b7f4d6178696d756d20616d6f756e74207065722077616c6c657420616c7265616460008201527f79206d696e74656420666f722074686973207068617365000000000000000000602082015250565b7f4d617820737570706c79206c696d697420726561636865640000000000000000600082015250565b7f4661696c6564205472616e736665722066756e647320746f206f776e65720000600082015250565b60048110614b5d57614b5c6146e9565b5b50565b60038110614b7157614b706146e9565b5b50565b614b7d8161445f565b8114614b8857600080fd5b50565b614b9481614471565b8114614b9f57600080fd5b50565b614bab8161447d565b8114614bb657600080fd5b50565b614bc281614487565b8114614bcd57600080fd5b50565b60048110614bdd57600080fd5b50565b60038110614bed57600080fd5b50565b614bf9816144f9565b8114614c0457600080fd5b50565b614c1081614503565b8114614c1b57600080fd5b50565b614c2781614517565b8114614c3257600080fd5b5056fea2646970667358221220da91db777af0e22088f964ecd1470bbb0d71dfc384b8b6b8295baf13df501d2e64736f6c63430008070033

Deployed Bytecode Sourcemap

49516:10624:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15771:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20784:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22852:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50747:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22312:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52776:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14825:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53931:1967;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23738:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58023:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59477:658;;;;;;;;;;;;;:::i;:::-;;59171:76;;;;;;;;;;;;;:::i;:::-;;23979:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48462:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20573:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16450:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45934:103;;;;;;;;;;;;;:::i;:::-;;58887:75;;;;;;;;;;;;;:::i;:::-;;45283:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51872:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53605:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23128:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57440:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51428:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24235:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53232:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58200:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56566:362;;;;;;;;;;;;;:::i;:::-;;49878:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57630:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23507:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57826:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52346:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46192:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15771:615;15856:4;16171:10;16156:25;;:11;:25;;;;:102;;;;16248:10;16233:25;;:11;:25;;;;16156:102;:179;;;;16325:10;16310:25;;:11;:25;;;;16156:179;16136:199;;15771:615;;;:::o;20784:100::-;20838:13;20871:5;20864:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20784:100;:::o;22852:204::-;22920:7;22945:16;22953:7;22945;:16::i;:::-;22940:64;;22970:34;;;;;;;;;;;;;;22940:64;23024:15;:24;23040:7;23024:24;;;;;;;;;;;;;;;;;;;;;23017:31;;22852:204;;;:::o;50747:45::-;;;;;;;;;;;;;;;;;:::o;22312:474::-;22385:13;22417:27;22436:7;22417:18;:27::i;:::-;22385:61;;22467:5;22461:11;;:2;:11;;;22457:48;;;22481:24;;;;;;;;;;;;;;22457:48;22545:5;22522:28;;:19;:17;:19::i;:::-;:28;;;22518:175;;22570:44;22587:5;22594:19;:17;:19::i;:::-;22570:16;:44::i;:::-;22565:128;;22642:35;;;;;;;;;;;;;;22565:128;22518:175;22732:2;22705:15;:24;22721:7;22705:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22770:7;22766:2;22750:28;;22759:5;22750:28;;;;;;;;;;;;22374:412;22312:474;;:::o;52776:205::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51612:17:::1;51603:26:::0;::::1;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;51595:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52908:3:::2;52880:31;;:25;;:31;;;;;;;;;;;;;;;;;;52927:46;52957:3;52962:10;52927:46;;;;;;;:::i;:::-;;;;;;;;52776:205:::0;:::o;14825:315::-;14878:7;15106:15;:13;:15::i;:::-;15091:12;;15075:13;;:28;:46;15068:53;;14825:315;:::o;53931:1967::-;48067:19;:17;:19::i;:::-;54090:14:::1;54142:10;54154;54131:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54107:69;;;;;;54090:86;;54195:33;54213:6;54221;54195:17;:33::i;:::-;54187:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;54307:17;54298:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;54295:1403;;;54363:14;54349:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;:63;;;;54395:17;54381:31;;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;54349:63;54341:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;54480:14;54466:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;54463:294;;;54515:65;54526:6;50321:1;54515:65;;49960:10;54515;:65::i;:::-;54463:294;;;54632:17;54618:31;;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;54615:142;;;54670:71;54681:6;50384:1;54670:71;;50025:11;54670:10;:71::i;:::-;54615:142;54463:294;54295:1403;;;54786:17;54777:26;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;54774:924;;;54843:14;54829:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;:63;;;;54875:17;54861:31;;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;54829:63;:98;;;;54910:17;54896:31;;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;54829:98;54821:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;54995:14;54981:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;54978:393;;;55030:65;55041:6;50321:1;55030:65;;49960:10;55030;:65::i;:::-;54978:393;;;55134:17;55120:31;;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;55117:254;;;55172:71;55183:6;50384:1;55172:71;;50025:11;55172:10;:71::i;:::-;55117:254;;;55284:71;55295:6;50447:1;55284:71;;50091:10;55284;:71::i;:::-;55117:254;54978:393;54774:924;;;55425:14;55411:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;:63;;;;55457:17;55443:31;;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;55411:63;:123;;;;55517:17;55503:31;;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;55411:123;:158;;;;55552:17;55538:31:::0;::::1;;;;;;;:::i;:::-;;:10;:31;;;;;;;;:::i;:::-;;;55411:158;55403:202;;;;;;;;;;;;:::i;:::-;;;;;;;;;55620:66;55631:6;55639:19;;;;;;;;;;;55660:25;;;;;;;;;;;55620:10;:66::i;:::-;54774:924;54295:1403;55818:6;55793:31;;:10;:22;55804:10;55793:22;;;;;;;;;;;;;;;;:31;55768:10;:22;55779:10;55768:22;;;;;;;;;;;;;;;:56;;;;55865:25;55871:10;55883:6;55865:25;;:5;:25::i;:::-;54051:1847;53931:1967:::0;;;:::o;23738:170::-;23872:28;23882:4;23888:2;23892:7;23872:9;:28::i;:::-;23738:170;;;:::o;58023:90::-;58065:13;58098:7;58091:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58023:90;:::o;59477:658::-;50696:42;59523:29;;:10;:29;;;:54;;;;59570:7;:5;:7::i;:::-;59556:21;;:10;:21;;;59523:54;59515:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;59605:20;59658:5;59652:3;59628:21;:27;;;;:::i;:::-;:35;;;;:::i;:::-;59605:58;;59674:13;59690:7;:5;:7::i;:::-;59674:23;;59709:12;59735:5;59727:19;;59755:12;59727:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59708:65;;;59792:7;59784:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;59845:23;59871:21;59845:47;;50696:42;59917:29;;59955:15;59917:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59903:73;;;;;59995:7;59987:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60056:71;60073:15;50696:42;60107:12;60121:5;60056:71;;;;;;;;;:::i;:::-;;;;;;;;59504:631;;;;59477:658::o;59171:76::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48326:16:::1;:14;:16::i;:::-;59229:10:::2;:8;:10::i;:::-;59171:76::o:0;23979:185::-;24117:39;24134:4;24140:2;24144:7;24117:39;;;;;;;;;;;;:16;:39::i;:::-;23979:185;;;:::o;48462:86::-;48509:4;48533:7;;;;;;;;;;;48526:14;;48462:86;:::o;20573:144::-;20637:7;20680:27;20699:7;20680:18;:27::i;:::-;20657:52;;20573:144;;;:::o;16450:224::-;16514:7;16555:1;16538:19;;:5;:19;;;16534:60;;;16566:28;;;;;;;;;;;;;;16534:60;11789:13;16612:18;:25;16631:5;16612:25;;;;;;;;;;;;;;;;:54;16605:61;;16450:224;;;:::o;45934:103::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45999:30:::1;46026:1;45999:18;:30::i;:::-;45934:103::o:0;58887:75::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48067:19:::1;:17;:19::i;:::-;58946:8:::2;:6;:8::i;:::-;58887:75::o:0;45283:87::-;45329:7;45356:6;;;;;;;;;;;45349:13;;45283:87;:::o;20953:104::-;21009:13;21042:7;21035:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20953:104;:::o;51872:242::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51978:13:::1;:11;:13::i;:::-;51963:12;:28;;;51955:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;52037:12;52025:9;;:24;;;;;;;;;;;;;;;;;;52065:41;52081:12;52095:10;52065:41;;;;;;;:::i;:::-;;;;;;;;51872:242:::0;:::o;53605:139::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53694:3:::1;53684:7;:13;;;;;;;;;;;;:::i;:::-;;53713:23;53720:3;53725:10;53713:23;;;;;;;:::i;:::-;;;;;;;;53605:139:::0;:::o;23128:308::-;23239:19;:17;:19::i;:::-;23227:31;;:8;:31;;;23223:61;;;23267:17;;;;;;;;;;;;;;23223:61;23349:8;23297:18;:39;23316:19;:17;:19::i;:::-;23297:39;;;;;;;;;;;;;;;:49;23337:8;23297:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;23409:8;23373:55;;23388:19;:17;:19::i;:::-;23373:55;;;23419:8;23373:55;;;;;;:::i;:::-;;;;;;;;23128:308;;:::o;57440:93::-;57486:7;50604:42;57506:19;;57440:93;:::o;51428:42::-;;;;;;;;;;;;;:::o;24235:396::-;24402:28;24412:4;24418:2;24422:7;24402:9;:28::i;:::-;24463:1;24445:2;:14;;;:19;24441:183;;24484:56;24515:4;24521:2;24525:7;24534:5;24484:30;:56::i;:::-;24479:145;;24568:40;;;;;;;;;;;;;;24479:145;24441:183;24235:396;;;;:::o;53232:145::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53316:6:::1;53308:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53338:31;53350:6;53358:10;53338:31;;;;;;;:::i;:::-;;;;;;;;53232:145:::0;:::o;58200:328::-;58284:13;58318:16;58326:7;58318;:16::i;:::-;58310:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;58422:1;58404:7;58398:21;;;;;:::i;:::-;;;:25;:120;;;;;;;;;;;;;;;;;58467:7;58476:18;:7;:16;:18::i;:::-;58450:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58398:120;58391:127;;58200:328;;;:::o;56566:362::-;50696:42;56614:29;;:10;:29;;;56606:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56680:10;;;;;;;;;;;56679:11;56671:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;56720:16;56739:14;:12;:14::i;:::-;56720:33;;56815:1;56803:9;;;;;;;;;;;:13;;;;:::i;:::-;56772:44;;50213:3;56772:28;;:8;:28;;;;:::i;:::-;:44;56764:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56856:36;56862:10;50213:3;56856:36;;:5;:36::i;:::-;56916:4;56903:10;;:17;;;;;;;;;;;;;;;;;;56595:333;56566:362::o;49878:30::-;;;;;;;;;;;;;:::o;57630:100::-;57680:7;50696:42;57700:22;;57630:100;:::o;23507:164::-;23604:4;23628:18;:25;23647:5;23628:25;;;;;;;;;;;;;;;:35;23654:8;23628:35;;;;;;;;;;;;;;;;;;;;;;;;;23621:42;;23507:164;;;;:::o;57826:116::-;57887:7;57914:10;:20;57925:8;57914:20;;;;;;;;;;;;;;;;57907:27;;57826:116;;;:::o;52346:189::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51612:17:::1;51603:26:::0;::::1;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:26;;;;;;;;:::i;:::-;;;51595:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52467:3:::2;52445:25;;:19;;:25;;;;;;;;;;;;;;;;;;52486:41;52511:3;52516:10;52486:41;;;;;;;:::i;:::-;;;;;;;;52346:189:::0;:::o;46192:201::-;45514:12;:10;:12::i;:::-;45503:23;;:7;:5;:7::i;:::-;:23;;;45495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46301:1:::1;46281:22;;:8;:22;;;;46273:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46357:28;46376:8;46357:18;:28::i;:::-;46192:201:::0;:::o;24886:273::-;24943:4;24999:7;24980:15;:13;:15::i;:::-;:26;;:66;;;;;25033:13;;25023:7;:23;24980:66;:152;;;;;25131:1;12559:8;25084:17;:26;25102:7;25084:26;;;;;;;;;;;;:43;:48;24980:152;24960:172;;24886:273;;;:::o;18088:1129::-;18155:7;18175:12;18190:7;18175:22;;18258:4;18239:15;:13;:15::i;:::-;:23;18235:915;;18292:13;;18285:4;:20;18281:869;;;18330:14;18347:17;:23;18365:4;18347:23;;;;;;;;;;;;18330:40;;18463:1;12559:8;18436:6;:23;:28;18432:699;;;18955:113;18972:1;18962:6;:11;18955:113;;;19015:17;:25;19033:6;;;;;;;19015:25;;;;;;;;;;;;19006:34;;18955:113;;;19101:6;19094:13;;;;;;18432:699;18307:843;18281:869;18235:915;19178:31;;;;;;;;;;;;;;18088:1129;;;;:::o;38868:105::-;38928:7;38955:10;38948:17;;38868:105;:::o;43954:98::-;44007:7;44034:10;44027:17;;43954:98;:::o;58581:101::-;58646:7;58673:1;58666:8;;58581:101;:::o;48621:108::-;48692:8;:6;:8::i;:::-;48691:9;48683:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48621:108::o;57013:331::-;57115:4;57132:14;57149:47;57159:6;57167;:8;;;57177:6;:8;;;57187:6;:8;;;57149:47;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57132:64;;57233:1;57215:20;;:6;:20;;;;57207:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50604:42;57314:22;;:6;:22;;;57307:29;;;57013:331;;;;:::o;55906:456::-;56018:1;56008:7;:11;;;;:::i;:::-;55999:20;;:6;:20;;;55991:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;56086:1;56078:5;56069:6;:14;;;;:::i;:::-;:18;;;;:::i;:::-;56057:30;;:9;:30;56049:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;56187:1;56177:7;:11;;;;:::i;:::-;56143:45;;56168:6;56143:31;;:10;:22;56154:10;56143:22;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:45;56135:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;56317:1;56305:9;;;;;;;;;;;:13;;;;:::i;:::-;56280:38;;56296:6;56280:22;;:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:38;56272:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;55906:456;;;:::o;28215:1656::-;28280:20;28303:13;;28280:36;;28345:1;28331:16;;:2;:16;;;28327:48;;;28356:19;;;;;;;;;;;;;;28327:48;28402:1;28390:8;:13;28386:44;;;28412:18;;;;;;;;;;;;;;28386:44;28443:61;28473:1;28477:2;28481:12;28495:8;28443:21;:61::i;:::-;29047:1;11926:2;29018:1;:25;;29017:31;29005:8;:44;28979:18;:22;28998:2;28979:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;12706:3;29448:29;29475:1;29463:8;:13;29448:14;:29::i;:::-;:56;;12443:3;29385:15;:41;;29343:21;29361:2;29343:17;:21::i;:::-;:84;:162;29292:17;:31;29310:12;29292:31;;;;;;;;;;;:213;;;;29522:20;29545:12;29522:35;;29572:11;29601:8;29586:12;:23;29572:37;;29626:111;29678:14;;;;;;29674:2;29653:40;;29670:1;29653:40;;;;;;;;;;;;29732:3;29717:12;:18;29626:111;;29769:12;29753:13;:28;;;;28756:1037;;29803:60;29832:1;29836:2;29840:12;29854:8;29803:20;:60::i;:::-;28269:1602;28215:1656;;:::o;30125:2515::-;30240:27;30270;30289:7;30270:18;:27::i;:::-;30240:57;;30355:4;30314:45;;30330:19;30314:45;;;30310:86;;30368:28;;;;;;;;;;;;;;30310:86;30409:22;30458:4;30435:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;30479:43;30496:4;30502:19;:17;:19::i;:::-;30479:16;:43::i;:::-;30435:87;:147;;;;30563:19;:17;:19::i;:::-;30539:43;;:20;30551:7;30539:11;:20::i;:::-;:43;;;30435:147;30409:174;;30601:17;30596:66;;30627:35;;;;;;;;;;;;;;30596:66;30691:1;30677:16;;:2;:16;;;30673:52;;;30702:23;;;;;;;;;;;;;;30673:52;30738:43;30760:4;30766:2;30770:7;30779:1;30738:21;:43::i;:::-;30854:15;:24;30870:7;30854:24;;;;;;;;;;;;30847:31;;;;;;;;;;;31246:18;:24;31265:4;31246:24;;;;;;;;;;;;;;;;31244:26;;;;;;;;;;;;31315:18;:22;31334:2;31315:22;;;;;;;;;;;;;;;;31313:24;;;;;;;;;;;12841:8;12443:3;31696:15;:41;;31654:21;31672:2;31654:17;:21::i;:::-;:84;:128;31608:17;:26;31626:7;31608:26;;;;;;;;;;;:174;;;;31952:1;12841:8;31902:19;:46;:51;31898:626;;;31974:19;32006:1;31996:7;:11;31974:33;;32163:1;32129:17;:30;32147:11;32129:30;;;;;;;;;;;;:35;32125:384;;;32267:13;;32252:11;:28;32248:242;;32447:19;32414:17;:30;32432:11;32414:30;;;;;;;;;;;:52;;;;32248:242;32125:384;31955:569;31898:626;32571:7;32567:2;32552:27;;32561:4;32552:27;;;;;;;;;;;;32590:42;32611:4;32617:2;32621:7;32630:1;32590:20;:42::i;:::-;30229:2411;;30125:2515;;;:::o;48806:108::-;48873:8;:6;:8::i;:::-;48865:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;48806:108::o;49317:120::-;48326:16;:14;:16::i;:::-;49386:5:::1;49376:7;;:15;;;;;;;;;;;;;;;;;;49407:22;49416:12;:10;:12::i;:::-;49407:22;;;;;;:::i;:::-;;;;;;;;49317:120::o:0;46553:191::-;46627:16;46646:6;;;;;;;;;;;46627:25;;46672:8;46663:6;;:17;;;;;;;;;;;;;;;;;;46727:8;46696:40;;46717:8;46696:40;;;;;;;;;;;;46616:128;46553:191;:::o;49058:118::-;48067:19;:17;:19::i;:::-;49128:4:::1;49118:7;;:14;;;;;;;;;;;;;;;;;;49148:20;49155:12;:10;:12::i;:::-;49148:20;;;;;;:::i;:::-;;;;;;;;49058:118::o:0;36337:716::-;36500:4;36546:2;36521:45;;;36567:19;:17;:19::i;:::-;36588:4;36594:7;36603:5;36521:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36517:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36821:1;36804:6;:13;:18;36800:235;;;36850:40;;;;;;;;;;;;;;36800:235;36993:6;36987:13;36978:6;36974:2;36970:15;36963:38;36517:529;36690:54;;;36680:64;;;:6;:64;;;;36673:71;;;36337:716;;;;;;:::o;41463:723::-;41519:13;41749:1;41740:5;:10;41736:53;;;41767:10;;;;;;;;;;;;;;;;;;;;;41736:53;41799:12;41814:5;41799:20;;41830:14;41855:78;41870:1;41862:4;:9;41855:78;;41888:8;;;;;:::i;:::-;;;;41919:2;41911:10;;;;;:::i;:::-;;;41855:78;;;41943:19;41975:6;41965:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41943:39;;41993:154;42009:1;42000:5;:10;41993:154;;42037:1;42027:11;;;;;:::i;:::-;;;42104:2;42096:5;:10;;;;:::i;:::-;42083:2;:24;;;;:::i;:::-;42070:39;;42053:6;42060;42053:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;42133:2;42124:11;;;;;:::i;:::-;;;41993:154;;;42171:6;42157:21;;;;;41463:723;;;;:::o;14519:95::-;14566:7;14593:13;;14586:20;;14519:95;:::o;37701:159::-;;;;;:::o;22108:142::-;22166:14;22227:5;22217:15;;22108:142;;;:::o;21873:148::-;21937:14;21998:5;21988:15;;21873:148;;;:::o;38519:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1917:169::-;1978:5;2016:6;2003:20;1994:29;;2032:48;2074:5;2032:48;:::i;:::-;1917:169;;;;:::o;2092:167::-;2152:5;2190:6;2177:20;2168:29;;2206:47;2247:5;2206:47;:::i;:::-;2092:167;;;;:::o;2279:340::-;2335:5;2384:3;2377:4;2369:6;2365:17;2361:27;2351:122;;2392:79;;:::i;:::-;2351:122;2509:6;2496:20;2534:79;2609:3;2601:6;2594:4;2586:6;2582:17;2534:79;:::i;:::-;2525:88;;2341:278;2279:340;;;;:::o;2660:723::-;2733:5;2777:4;2765:9;2760:3;2756:19;2752:30;2749:117;;;2785:79;;:::i;:::-;2749:117;2884:21;2900:4;2884:21;:::i;:::-;2875:30;;2961:1;3001:49;3046:3;3037:6;3026:9;3022:22;3001:49;:::i;:::-;2994:4;2987:5;2983:16;2976:75;2915:147;3118:2;3159:49;3204:3;3195:6;3184:9;3180:22;3159:49;:::i;:::-;3152:4;3145:5;3141:16;3134:75;3072:148;3276:2;3317:47;3360:3;3351:6;3340:9;3336:22;3317:47;:::i;:::-;3310:4;3303:5;3299:16;3292:73;3230:146;2660:723;;;;:::o;3389:139::-;3435:5;3473:6;3460:20;3451:29;;3489:33;3516:5;3489:33;:::i;:::-;3389:139;;;;:::o;3534:137::-;3579:5;3617:6;3604:20;3595:29;;3633:32;3659:5;3633:32;:::i;:::-;3534:137;;;;:::o;3677:135::-;3721:5;3759:6;3746:20;3737:29;;3775:31;3800:5;3775:31;:::i;:::-;3677:135;;;;:::o;3818:329::-;3877:6;3926:2;3914:9;3905:7;3901:23;3897:32;3894:119;;;3932:79;;:::i;:::-;3894:119;4052:1;4077:53;4122:7;4113:6;4102:9;4098:22;4077:53;:::i;:::-;4067:63;;4023:117;3818:329;;;;:::o;4153:474::-;4221:6;4229;4278:2;4266:9;4257:7;4253:23;4249:32;4246:119;;;4284:79;;:::i;:::-;4246:119;4404:1;4429:53;4474:7;4465:6;4454:9;4450:22;4429:53;:::i;:::-;4419:63;;4375:117;4531:2;4557:53;4602:7;4593:6;4582:9;4578:22;4557:53;:::i;:::-;4547:63;;4502:118;4153:474;;;;;:::o;4633:619::-;4710:6;4718;4726;4775:2;4763:9;4754:7;4750:23;4746:32;4743:119;;;4781:79;;:::i;:::-;4743:119;4901:1;4926:53;4971:7;4962:6;4951:9;4947:22;4926:53;:::i;:::-;4916:63;;4872:117;5028:2;5054:53;5099:7;5090:6;5079:9;5075:22;5054:53;:::i;:::-;5044:63;;4999:118;5156:2;5182:53;5227:7;5218:6;5207:9;5203:22;5182:53;:::i;:::-;5172:63;;5127:118;4633:619;;;;;:::o;5258:943::-;5353:6;5361;5369;5377;5426:3;5414:9;5405:7;5401:23;5397:33;5394:120;;;5433:79;;:::i;:::-;5394:120;5553:1;5578:53;5623:7;5614:6;5603:9;5599:22;5578:53;:::i;:::-;5568:63;;5524:117;5680:2;5706:53;5751:7;5742:6;5731:9;5727:22;5706:53;:::i;:::-;5696:63;;5651:118;5808:2;5834:53;5879:7;5870:6;5859:9;5855:22;5834:53;:::i;:::-;5824:63;;5779:118;5964:2;5953:9;5949:18;5936:32;5995:18;5987:6;5984:30;5981:117;;;6017:79;;:::i;:::-;5981:117;6122:62;6176:7;6167:6;6156:9;6152:22;6122:62;:::i;:::-;6112:72;;5907:287;5258:943;;;;;;;:::o;6207:468::-;6272:6;6280;6329:2;6317:9;6308:7;6304:23;6300:32;6297:119;;;6335:79;;:::i;:::-;6297:119;6455:1;6480:53;6525:7;6516:6;6505:9;6501:22;6480:53;:::i;:::-;6470:63;;6426:117;6582:2;6608:50;6650:7;6641:6;6630:9;6626:22;6608:50;:::i;:::-;6598:60;;6553:115;6207:468;;;;;:::o;6681:474::-;6749:6;6757;6806:2;6794:9;6785:7;6781:23;6777:32;6774:119;;;6812:79;;:::i;:::-;6774:119;6932:1;6957:53;7002:7;6993:6;6982:9;6978:22;6957:53;:::i;:::-;6947:63;;6903:117;7059:2;7085:53;7130:7;7121:6;7110:9;7106:22;7085:53;:::i;:::-;7075:63;;7030:118;6681:474;;;;;:::o;7161:327::-;7219:6;7268:2;7256:9;7247:7;7243:23;7239:32;7236:119;;;7274:79;;:::i;:::-;7236:119;7394:1;7419:52;7463:7;7454:6;7443:9;7439:22;7419:52;:::i;:::-;7409:62;;7365:116;7161:327;;;;:::o;7494:349::-;7563:6;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:63;7818:7;7809:6;7798:9;7794:22;7763:63;:::i;:::-;7753:73;;7709:127;7494:349;;;;:::o;7849:357::-;7922:6;7971:2;7959:9;7950:7;7946:23;7942:32;7939:119;;;7977:79;;:::i;:::-;7939:119;8097:1;8122:67;8181:7;8172:6;8161:9;8157:22;8122:67;:::i;:::-;8112:77;;8068:131;7849:357;;;;:::o;8212:509::-;8281:6;8330:2;8318:9;8309:7;8305:23;8301:32;8298:119;;;8336:79;;:::i;:::-;8298:119;8484:1;8473:9;8469:17;8456:31;8514:18;8506:6;8503:30;8500:117;;;8536:79;;:::i;:::-;8500:117;8641:63;8696:7;8687:6;8676:9;8672:22;8641:63;:::i;:::-;8631:73;;8427:287;8212:509;;;;:::o;8727:329::-;8786:6;8835:2;8823:9;8814:7;8810:23;8806:32;8803:119;;;8841:79;;:::i;:::-;8803:119;8961:1;8986:53;9031:7;9022:6;9011:9;9007:22;8986:53;:::i;:::-;8976:63;;8932:117;8727:329;;;;:::o;9062:327::-;9120:6;9169:2;9157:9;9148:7;9144:23;9140:32;9137:119;;;9175:79;;:::i;:::-;9137:119;9295:1;9320:52;9364:7;9355:6;9344:9;9340:22;9320:52;:::i;:::-;9310:62;;9266:116;9062:327;;;;:::o;9395:697::-;9510:6;9518;9526;9575:3;9563:9;9554:7;9550:23;9546:33;9543:120;;;9582:79;;:::i;:::-;9543:120;9702:1;9727:52;9771:7;9762:6;9751:9;9747:22;9727:52;:::i;:::-;9717:62;;9673:116;9828:2;9854:77;9923:7;9914:6;9903:9;9899:22;9854:77;:::i;:::-;9844:87;;9799:142;9980:3;10007:68;10067:7;10058:6;10047:9;10043:22;10007:68;:::i;:::-;9997:78;;9951:134;9395:697;;;;;:::o;10098:325::-;10155:6;10204:2;10192:9;10183:7;10179:23;10175:32;10172:119;;;10210:79;;:::i;:::-;10172:119;10330:1;10355:51;10398:7;10389:6;10378:9;10374:22;10355:51;:::i;:::-;10345:61;;10301:115;10098:325;;;;:::o;10429:118::-;10516:24;10534:5;10516:24;:::i;:::-;10511:3;10504:37;10429:118;;:::o;10553:109::-;10634:21;10649:5;10634:21;:::i;:::-;10629:3;10622:34;10553:109;;:::o;10668:118::-;10755:24;10773:5;10755:24;:::i;:::-;10750:3;10743:37;10668:118;;:::o;10792:360::-;10878:3;10906:38;10938:5;10906:38;:::i;:::-;10960:70;11023:6;11018:3;10960:70;:::i;:::-;10953:77;;11039:52;11084:6;11079:3;11072:4;11065:5;11061:16;11039:52;:::i;:::-;11116:29;11138:6;11116:29;:::i;:::-;11111:3;11107:39;11100:46;;10882:270;10792:360;;;;:::o;11158:157::-;11258:50;11302:5;11258:50;:::i;:::-;11253:3;11246:63;11158:157;;:::o;11321:155::-;11420:49;11463:5;11420:49;:::i;:::-;11415:3;11408:62;11321:155;;:::o;11482:364::-;11570:3;11598:39;11631:5;11598:39;:::i;:::-;11653:71;11717:6;11712:3;11653:71;:::i;:::-;11646:78;;11733:52;11778:6;11773:3;11766:4;11759:5;11755:16;11733:52;:::i;:::-;11810:29;11832:6;11810:29;:::i;:::-;11805:3;11801:39;11794:46;;11574:272;11482:364;;;;:::o;11852:377::-;11958:3;11986:39;12019:5;11986:39;:::i;:::-;12041:89;12123:6;12118:3;12041:89;:::i;:::-;12034:96;;12139:52;12184:6;12179:3;12172:4;12165:5;12161:16;12139:52;:::i;:::-;12216:6;12211:3;12207:16;12200:23;;11962:267;11852:377;;;;:::o;12259:845::-;12362:3;12399:5;12393:12;12428:36;12454:9;12428:36;:::i;:::-;12480:89;12562:6;12557:3;12480:89;:::i;:::-;12473:96;;12600:1;12589:9;12585:17;12616:1;12611:137;;;;12762:1;12757:341;;;;12578:520;;12611:137;12695:4;12691:9;12680;12676:25;12671:3;12664:38;12731:6;12726:3;12722:16;12715:23;;12611:137;;12757:341;12824:38;12856:5;12824:38;:::i;:::-;12884:1;12898:154;12912:6;12909:1;12906:13;12898:154;;;12986:7;12980:14;12976:1;12971:3;12967:11;12960:35;13036:1;13027:7;13023:15;13012:26;;12934:4;12931:1;12927:12;12922:17;;12898:154;;;13081:6;13076:3;13072:16;13065:23;;12764:334;;12578:520;;12366:738;;12259:845;;;;:::o;13110:366::-;13252:3;13273:67;13337:2;13332:3;13273:67;:::i;:::-;13266:74;;13349:93;13438:3;13349:93;:::i;:::-;13467:2;13462:3;13458:12;13451:19;;13110:366;;;:::o;13482:::-;13624:3;13645:67;13709:2;13704:3;13645:67;:::i;:::-;13638:74;;13721:93;13810:3;13721:93;:::i;:::-;13839:2;13834:3;13830:12;13823:19;;13482:366;;;:::o;13854:::-;13996:3;14017:67;14081:2;14076:3;14017:67;:::i;:::-;14010:74;;14093:93;14182:3;14093:93;:::i;:::-;14211:2;14206:3;14202:12;14195:19;;13854:366;;;:::o;14226:::-;14368:3;14389:67;14453:2;14448:3;14389:67;:::i;:::-;14382:74;;14465:93;14554:3;14465:93;:::i;:::-;14583:2;14578:3;14574:12;14567:19;;14226:366;;;:::o;14598:::-;14740:3;14761:67;14825:2;14820:3;14761:67;:::i;:::-;14754:74;;14837:93;14926:3;14837:93;:::i;:::-;14955:2;14950:3;14946:12;14939:19;;14598:366;;;:::o;14970:::-;15112:3;15133:67;15197:2;15192:3;15133:67;:::i;:::-;15126:74;;15209:93;15298:3;15209:93;:::i;:::-;15327:2;15322:3;15318:12;15311:19;;14970:366;;;:::o;15342:::-;15484:3;15505:67;15569:2;15564:3;15505:67;:::i;:::-;15498:74;;15581:93;15670:3;15581:93;:::i;:::-;15699:2;15694:3;15690:12;15683:19;;15342:366;;;:::o;15714:::-;15856:3;15877:67;15941:2;15936:3;15877:67;:::i;:::-;15870:74;;15953:93;16042:3;15953:93;:::i;:::-;16071:2;16066:3;16062:12;16055:19;;15714:366;;;:::o;16086:::-;16228:3;16249:67;16313:2;16308:3;16249:67;:::i;:::-;16242:74;;16325:93;16414:3;16325:93;:::i;:::-;16443:2;16438:3;16434:12;16427:19;;16086:366;;;:::o;16458:::-;16600:3;16621:67;16685:2;16680:3;16621:67;:::i;:::-;16614:74;;16697:93;16786:3;16697:93;:::i;:::-;16815:2;16810:3;16806:12;16799:19;;16458:366;;;:::o;16830:::-;16972:3;16993:67;17057:2;17052:3;16993:67;:::i;:::-;16986:74;;17069:93;17158:3;17069:93;:::i;:::-;17187:2;17182:3;17178:12;17171:19;;16830:366;;;:::o;17202:::-;17344:3;17365:67;17429:2;17424:3;17365:67;:::i;:::-;17358:74;;17441:93;17530:3;17441:93;:::i;:::-;17559:2;17554:3;17550:12;17543:19;;17202:366;;;:::o;17574:::-;17716:3;17737:67;17801:2;17796:3;17737:67;:::i;:::-;17730:74;;17813:93;17902:3;17813:93;:::i;:::-;17931:2;17926:3;17922:12;17915:19;;17574:366;;;:::o;17946:398::-;18105:3;18126:83;18207:1;18202:3;18126:83;:::i;:::-;18119:90;;18218:93;18307:3;18218:93;:::i;:::-;18336:1;18331:3;18327:11;18320:18;;17946:398;;;:::o;18350:366::-;18492:3;18513:67;18577:2;18572:3;18513:67;:::i;:::-;18506:74;;18589:93;18678:3;18589:93;:::i;:::-;18707:2;18702:3;18698:12;18691:19;;18350:366;;;:::o;18722:::-;18864:3;18885:67;18949:2;18944:3;18885:67;:::i;:::-;18878:74;;18961:93;19050:3;18961:93;:::i;:::-;19079:2;19074:3;19070:12;19063:19;;18722:366;;;:::o;19094:::-;19236:3;19257:67;19321:2;19316:3;19257:67;:::i;:::-;19250:74;;19333:93;19422:3;19333:93;:::i;:::-;19451:2;19446:3;19442:12;19435:19;;19094:366;;;:::o;19466:::-;19608:3;19629:67;19693:2;19688:3;19629:67;:::i;:::-;19622:74;;19705:93;19794:3;19705:93;:::i;:::-;19823:2;19818:3;19814:12;19807:19;;19466:366;;;:::o;19838:::-;19980:3;20001:67;20065:2;20060:3;20001:67;:::i;:::-;19994:74;;20077:93;20166:3;20077:93;:::i;:::-;20195:2;20190:3;20186:12;20179:19;;19838:366;;;:::o;20210:118::-;20297:24;20315:5;20297:24;:::i;:::-;20292:3;20285:37;20210:118;;:::o;20334:129::-;20420:36;20450:5;20420:36;:::i;:::-;20415:3;20408:49;20334:129;;:::o;20469:115::-;20554:23;20571:5;20554:23;:::i;:::-;20549:3;20542:36;20469:115;;:::o;20590:127::-;20675:35;20704:5;20675:35;:::i;:::-;20670:3;20663:48;20590:127;;:::o;20723:112::-;20806:22;20822:5;20806:22;:::i;:::-;20801:3;20794:35;20723:112;;:::o;20841:429::-;21018:3;21040:92;21128:3;21119:6;21040:92;:::i;:::-;21033:99;;21149:95;21240:3;21231:6;21149:95;:::i;:::-;21142:102;;21261:3;21254:10;;20841:429;;;;;:::o;21276:379::-;21460:3;21482:147;21625:3;21482:147;:::i;:::-;21475:154;;21646:3;21639:10;;21276:379;;;:::o;21661:222::-;21754:4;21792:2;21781:9;21777:18;21769:26;;21805:71;21873:1;21862:9;21858:17;21849:6;21805:71;:::i;:::-;21661:222;;;;:::o;21889:640::-;22084:4;22122:3;22111:9;22107:19;22099:27;;22136:71;22204:1;22193:9;22189:17;22180:6;22136:71;:::i;:::-;22217:72;22285:2;22274:9;22270:18;22261:6;22217:72;:::i;:::-;22299;22367:2;22356:9;22352:18;22343:6;22299:72;:::i;:::-;22418:9;22412:4;22408:20;22403:2;22392:9;22388:18;22381:48;22446:76;22517:4;22508:6;22446:76;:::i;:::-;22438:84;;21889:640;;;;;;;:::o;22535:210::-;22622:4;22660:2;22649:9;22645:18;22637:26;;22673:65;22735:1;22724:9;22720:17;22711:6;22673:65;:::i;:::-;22535:210;;;;:::o;22751:545::-;22924:4;22962:3;22951:9;22947:19;22939:27;;22976:71;23044:1;23033:9;23029:17;23020:6;22976:71;:::i;:::-;23057:68;23121:2;23110:9;23106:18;23097:6;23057:68;:::i;:::-;23135:72;23203:2;23192:9;23188:18;23179:6;23135:72;:::i;:::-;23217;23285:2;23274:9;23270:18;23261:6;23217:72;:::i;:::-;22751:545;;;;;;;:::o;23302:358::-;23436:4;23474:2;23463:9;23459:18;23451:26;;23487:84;23568:1;23557:9;23553:17;23544:6;23487:84;:::i;:::-;23581:72;23649:2;23638:9;23634:18;23625:6;23581:72;:::i;:::-;23302:358;;;;;:::o;23666:246::-;23771:4;23809:2;23798:9;23794:18;23786:26;;23822:83;23902:1;23891:9;23887:17;23878:6;23822:83;:::i;:::-;23666:246;;;;:::o;23918:356::-;24051:4;24089:2;24078:9;24074:18;24066:26;;24102:83;24182:1;24171:9;24167:17;24158:6;24102:83;:::i;:::-;24195:72;24263:2;24252:9;24248:18;24239:6;24195:72;:::i;:::-;23918:356;;;;;:::o;24280:313::-;24393:4;24431:2;24420:9;24416:18;24408:26;;24480:9;24474:4;24470:20;24466:1;24455:9;24451:17;24444:47;24508:78;24581:4;24572:6;24508:78;:::i;:::-;24500:86;;24280:313;;;;:::o;24599:423::-;24740:4;24778:2;24767:9;24763:18;24755:26;;24827:9;24821:4;24817:20;24813:1;24802:9;24798:17;24791:47;24855:78;24928:4;24919:6;24855:78;:::i;:::-;24847:86;;24943:72;25011:2;25000:9;24996:18;24987:6;24943:72;:::i;:::-;24599:423;;;;;:::o;25028:419::-;25194:4;25232:2;25221:9;25217:18;25209:26;;25281:9;25275:4;25271:20;25267:1;25256:9;25252:17;25245:47;25309:131;25435:4;25309:131;:::i;:::-;25301:139;;25028:419;;;:::o;25453:::-;25619:4;25657:2;25646:9;25642:18;25634:26;;25706:9;25700:4;25696:20;25692:1;25681:9;25677:17;25670:47;25734:131;25860:4;25734:131;:::i;:::-;25726:139;;25453:419;;;:::o;25878:::-;26044:4;26082:2;26071:9;26067:18;26059:26;;26131:9;26125:4;26121:20;26117:1;26106:9;26102:17;26095:47;26159:131;26285:4;26159:131;:::i;:::-;26151:139;;25878:419;;;:::o;26303:::-;26469:4;26507:2;26496:9;26492:18;26484:26;;26556:9;26550:4;26546:20;26542:1;26531:9;26527:17;26520:47;26584:131;26710:4;26584:131;:::i;:::-;26576:139;;26303:419;;;:::o;26728:::-;26894:4;26932:2;26921:9;26917:18;26909:26;;26981:9;26975:4;26971:20;26967:1;26956:9;26952:17;26945:47;27009:131;27135:4;27009:131;:::i;:::-;27001:139;;26728:419;;;:::o;27153:::-;27319:4;27357:2;27346:9;27342:18;27334:26;;27406:9;27400:4;27396:20;27392:1;27381:9;27377:17;27370:47;27434:131;27560:4;27434:131;:::i;:::-;27426:139;;27153:419;;;:::o;27578:::-;27744:4;27782:2;27771:9;27767:18;27759:26;;27831:9;27825:4;27821:20;27817:1;27806:9;27802:17;27795:47;27859:131;27985:4;27859:131;:::i;:::-;27851:139;;27578:419;;;:::o;28003:::-;28169:4;28207:2;28196:9;28192:18;28184:26;;28256:9;28250:4;28246:20;28242:1;28231:9;28227:17;28220:47;28284:131;28410:4;28284:131;:::i;:::-;28276:139;;28003:419;;;:::o;28428:::-;28594:4;28632:2;28621:9;28617:18;28609:26;;28681:9;28675:4;28671:20;28667:1;28656:9;28652:17;28645:47;28709:131;28835:4;28709:131;:::i;:::-;28701:139;;28428:419;;;:::o;28853:::-;29019:4;29057:2;29046:9;29042:18;29034:26;;29106:9;29100:4;29096:20;29092:1;29081:9;29077:17;29070:47;29134:131;29260:4;29134:131;:::i;:::-;29126:139;;28853:419;;;:::o;29278:::-;29444:4;29482:2;29471:9;29467:18;29459:26;;29531:9;29525:4;29521:20;29517:1;29506:9;29502:17;29495:47;29559:131;29685:4;29559:131;:::i;:::-;29551:139;;29278:419;;;:::o;29703:::-;29869:4;29907:2;29896:9;29892:18;29884:26;;29956:9;29950:4;29946:20;29942:1;29931:9;29927:17;29920:47;29984:131;30110:4;29984:131;:::i;:::-;29976:139;;29703:419;;;:::o;30128:::-;30294:4;30332:2;30321:9;30317:18;30309:26;;30381:9;30375:4;30371:20;30367:1;30356:9;30352:17;30345:47;30409:131;30535:4;30409:131;:::i;:::-;30401:139;;30128:419;;;:::o;30553:::-;30719:4;30757:2;30746:9;30742:18;30734:26;;30806:9;30800:4;30796:20;30792:1;30781:9;30777:17;30770:47;30834:131;30960:4;30834:131;:::i;:::-;30826:139;;30553:419;;;:::o;30978:::-;31144:4;31182:2;31171:9;31167:18;31159:26;;31231:9;31225:4;31221:20;31217:1;31206:9;31202:17;31195:47;31259:131;31385:4;31259:131;:::i;:::-;31251:139;;30978:419;;;:::o;31403:::-;31569:4;31607:2;31596:9;31592:18;31584:26;;31656:9;31650:4;31646:20;31642:1;31631:9;31627:17;31620:47;31684:131;31810:4;31684:131;:::i;:::-;31676:139;;31403:419;;;:::o;31828:::-;31994:4;32032:2;32021:9;32017:18;32009:26;;32081:9;32075:4;32071:20;32067:1;32056:9;32052:17;32045:47;32109:131;32235:4;32109:131;:::i;:::-;32101:139;;31828:419;;;:::o;32253:::-;32419:4;32457:2;32446:9;32442:18;32434:26;;32506:9;32500:4;32496:20;32492:1;32481:9;32477:17;32470:47;32534:131;32660:4;32534:131;:::i;:::-;32526:139;;32253:419;;;:::o;32678:222::-;32771:4;32809:2;32798:9;32794:18;32786:26;;32822:71;32890:1;32879:9;32875:17;32866:6;32822:71;:::i;:::-;32678:222;;;;:::o;32906:553::-;33083:4;33121:3;33110:9;33106:19;33098:27;;33135:71;33203:1;33192:9;33188:17;33179:6;33135:71;:::i;:::-;33216:72;33284:2;33273:9;33269:18;33260:6;33216:72;:::i;:::-;33298;33366:2;33355:9;33351:18;33342:6;33298:72;:::i;:::-;33380;33448:2;33437:9;33433:18;33424:6;33380:72;:::i;:::-;32906:553;;;;;;;:::o;33465:218::-;33556:4;33594:2;33583:9;33579:18;33571:26;;33607:69;33673:1;33662:9;33658:17;33649:6;33607:69;:::i;:::-;33465:218;;;;:::o;33689:330::-;33809:4;33847:2;33836:9;33832:18;33824:26;;33860:70;33927:1;33916:9;33912:17;33903:6;33860:70;:::i;:::-;33940:72;34008:2;33997:9;33993:18;33984:6;33940:72;:::i;:::-;33689:330;;;;;:::o;34025:328::-;34144:4;34182:2;34171:9;34167:18;34159:26;;34195:69;34261:1;34250:9;34246:17;34237:6;34195:69;:::i;:::-;34274:72;34342:2;34331:9;34327:18;34318:6;34274:72;:::i;:::-;34025:328;;;;;:::o;34359:129::-;34393:6;34420:20;;:::i;:::-;34410:30;;34449:33;34477:4;34469:6;34449:33;:::i;:::-;34359:129;;;:::o;34494:75::-;34527:6;34560:2;34554:9;34544:19;;34494:75;:::o;34575:307::-;34636:4;34726:18;34718:6;34715:30;34712:56;;;34748:18;;:::i;:::-;34712:56;34786:29;34808:6;34786:29;:::i;:::-;34778:37;;34870:4;34864;34860:15;34852:23;;34575:307;;;:::o;34888:308::-;34950:4;35040:18;35032:6;35029:30;35026:56;;;35062:18;;:::i;:::-;35026:56;35100:29;35122:6;35100:29;:::i;:::-;35092:37;;35184:4;35178;35174:15;35166:23;;34888:308;;;:::o;35202:141::-;35251:4;35274:3;35266:11;;35297:3;35294:1;35287:14;35331:4;35328:1;35318:18;35310:26;;35202:141;;;:::o;35349:98::-;35400:6;35434:5;35428:12;35418:22;;35349:98;;;:::o;35453:99::-;35505:6;35539:5;35533:12;35523:22;;35453:99;;;:::o;35558:168::-;35641:11;35675:6;35670:3;35663:19;35715:4;35710:3;35706:14;35691:29;;35558:168;;;;:::o;35732:147::-;35833:11;35870:3;35855:18;;35732:147;;;;:::o;35885:169::-;35969:11;36003:6;35998:3;35991:19;36043:4;36038:3;36034:14;36019:29;;35885:169;;;;:::o;36060:148::-;36162:11;36199:3;36184:18;;36060:148;;;;:::o;36214:305::-;36254:3;36273:20;36291:1;36273:20;:::i;:::-;36268:25;;36307:20;36325:1;36307:20;:::i;:::-;36302:25;;36461:1;36393:66;36389:74;36386:1;36383:81;36380:107;;;36467:18;;:::i;:::-;36380:107;36511:1;36508;36504:9;36497:16;;36214:305;;;;:::o;36525:254::-;36564:3;36583:19;36600:1;36583:19;:::i;:::-;36578:24;;36616:19;36633:1;36616:19;:::i;:::-;36611:24;;36721:1;36701:18;36697:26;36694:1;36691:33;36688:59;;;36727:18;;:::i;:::-;36688:59;36771:1;36768;36764:9;36757:16;;36525:254;;;;:::o;36785:185::-;36825:1;36842:20;36860:1;36842:20;:::i;:::-;36837:25;;36876:20;36894:1;36876:20;:::i;:::-;36871:25;;36915:1;36905:35;;36920:18;;:::i;:::-;36905:35;36962:1;36959;36955:9;36950:14;;36785:185;;;;:::o;36976:348::-;37016:7;37039:20;37057:1;37039:20;:::i;:::-;37034:25;;37073:20;37091:1;37073:20;:::i;:::-;37068:25;;37261:1;37193:66;37189:74;37186:1;37183:81;37178:1;37171:9;37164:17;37160:105;37157:131;;;37268:18;;:::i;:::-;37157:131;37316:1;37313;37309:9;37298:20;;36976:348;;;;:::o;37330:297::-;37369:7;37392:19;37409:1;37392:19;:::i;:::-;37387:24;;37425:19;37442:1;37425:19;:::i;:::-;37420:24;;37564:1;37544:18;37540:26;37537:1;37534:33;37529:1;37522:9;37515:17;37511:57;37508:83;;;37571:18;;:::i;:::-;37508:83;37619:1;37616;37612:9;37601:20;;37330:297;;;;:::o;37633:191::-;37673:4;37693:20;37711:1;37693:20;:::i;:::-;37688:25;;37727:20;37745:1;37727:20;:::i;:::-;37722:25;;37766:1;37763;37760:8;37757:34;;;37771:18;;:::i;:::-;37757:34;37816:1;37813;37809:9;37801:17;;37633:191;;;;:::o;37830:188::-;37869:4;37889:19;37906:1;37889:19;:::i;:::-;37884:24;;37922:19;37939:1;37922:19;:::i;:::-;37917:24;;37960:1;37957;37954:8;37951:34;;;37965:18;;:::i;:::-;37951:34;38010:1;38007;38003:9;37995:17;;37830:188;;;;:::o;38024:96::-;38061:7;38090:24;38108:5;38090:24;:::i;:::-;38079:35;;38024:96;;;:::o;38126:90::-;38160:7;38203:5;38196:13;38189:21;38178:32;;38126:90;;;:::o;38222:77::-;38259:7;38288:5;38277:16;;38222:77;;;:::o;38305:149::-;38341:7;38381:66;38374:5;38370:78;38359:89;;38305:149;;;:::o;38460:141::-;38512:7;38541:5;38530:16;;38547:48;38589:5;38547:48;:::i;:::-;38460:141;;;:::o;38607:139::-;38658:7;38687:5;38676:16;;38693:47;38734:5;38693:47;:::i;:::-;38607:139;;;:::o;38752:126::-;38789:7;38829:42;38822:5;38818:54;38807:65;;38752:126;;;:::o;38884:77::-;38921:7;38950:5;38939:16;;38884:77;;;:::o;38967:101::-;39003:7;39043:18;39036:5;39032:30;39021:41;;38967:101;;;:::o;39074:86::-;39109:7;39149:4;39142:5;39138:16;39127:27;;39074:86;;;:::o;39166:141::-;39229:9;39262:39;39295:5;39262:39;:::i;:::-;39249:52;;39166:141;;;:::o;39313:139::-;39375:9;39408:38;39440:5;39408:38;:::i;:::-;39395:51;;39313:139;;;:::o;39458:111::-;39507:9;39540:23;39557:5;39540:23;:::i;:::-;39527:36;;39458:111;;;:::o;39575:109::-;39623:9;39656:22;39672:5;39656:22;:::i;:::-;39643:35;;39575:109;;;:::o;39690:154::-;39774:6;39769:3;39764;39751:30;39836:1;39827:6;39822:3;39818:16;39811:27;39690:154;;;:::o;39850:307::-;39918:1;39928:113;39942:6;39939:1;39936:13;39928:113;;;40027:1;40022:3;40018:11;40012:18;40008:1;40003:3;39999:11;39992:39;39964:2;39961:1;39957:10;39952:15;;39928:113;;;40059:6;40056:1;40053:13;40050:101;;;40139:1;40130:6;40125:3;40121:16;40114:27;40050:101;39899:258;39850:307;;;:::o;40163:320::-;40207:6;40244:1;40238:4;40234:12;40224:22;;40291:1;40285:4;40281:12;40312:18;40302:81;;40368:4;40360:6;40356:17;40346:27;;40302:81;40430:2;40422:6;40419:14;40399:18;40396:38;40393:84;;;40449:18;;:::i;:::-;40393:84;40214:269;40163:320;;;:::o;40489:281::-;40572:27;40594:4;40572:27;:::i;:::-;40564:6;40560:40;40702:6;40690:10;40687:22;40666:18;40654:10;40651:34;40648:62;40645:88;;;40713:18;;:::i;:::-;40645:88;40753:10;40749:2;40742:22;40532:238;40489:281;;:::o;40776:233::-;40815:3;40838:24;40856:5;40838:24;:::i;:::-;40829:33;;40884:66;40877:5;40874:77;40871:103;;;40954:18;;:::i;:::-;40871:103;41001:1;40994:5;40990:13;40983:20;;40776:233;;;:::o;41015:176::-;41047:1;41064:20;41082:1;41064:20;:::i;:::-;41059:25;;41098:20;41116:1;41098:20;:::i;:::-;41093:25;;41137:1;41127:35;;41142:18;;:::i;:::-;41127:35;41183:1;41180;41176:9;41171:14;;41015:176;;;;:::o;41197:180::-;41245:77;41242:1;41235:88;41342:4;41339:1;41332:15;41366:4;41363:1;41356:15;41383:180;41431:77;41428:1;41421:88;41528:4;41525:1;41518:15;41552:4;41549:1;41542:15;41569:180;41617:77;41614:1;41607:88;41714:4;41711:1;41704:15;41738:4;41735:1;41728:15;41755:180;41803:77;41800:1;41793:88;41900:4;41897:1;41890:15;41924:4;41921:1;41914:15;41941:180;41989:77;41986:1;41979:88;42086:4;42083:1;42076:15;42110:4;42107:1;42100:15;42127:180;42175:77;42172:1;42165:88;42272:4;42269:1;42262:15;42296:4;42293:1;42286:15;42313:117;42422:1;42419;42412:12;42436:117;42545:1;42542;42535:12;42682:117;42791:1;42788;42781:12;42805:117;42914:1;42911;42904:12;42928:117;43037:1;43034;43027:12;43051:102;43092:6;43143:2;43139:7;43134:2;43127:5;43123:14;43119:28;43109:38;;43051:102;;;:::o;43159:174::-;43299:26;43295:1;43287:6;43283:14;43276:50;43159:174;:::o;43339:164::-;43479:16;43475:1;43467:6;43463:14;43456:40;43339:164;:::o;43509:170::-;43649:22;43645:1;43637:6;43633:14;43626:46;43509:170;:::o;43685:224::-;43825:34;43821:1;43813:6;43809:14;43802:58;43894:7;43889:2;43881:6;43877:15;43870:32;43685:224;:::o;43915:225::-;44055:34;44051:1;44043:6;44039:14;44032:58;44124:8;44119:2;44111:6;44107:15;44100:33;43915:225;:::o;44146:164::-;44286:16;44282:1;44274:6;44270:14;44263:40;44146:164;:::o;44316:::-;44456:16;44452:1;44444:6;44440:14;44433:40;44316:164;:::o;44486:163::-;44626:15;44622:1;44614:6;44610:14;44603:39;44486:163;:::o;44655:166::-;44795:18;44791:1;44783:6;44779:14;44772:42;44655:166;:::o;44827:168::-;44967:20;44963:1;44955:6;44951:14;44944:44;44827:168;:::o;45001:182::-;45141:34;45137:1;45129:6;45125:14;45118:58;45001:182;:::o;45189:220::-;45329:34;45325:1;45317:6;45313:14;45306:58;45398:3;45393:2;45385:6;45381:15;45374:28;45189:220;:::o;45415:182::-;45555:34;45551:1;45543:6;45539:14;45532:58;45415:182;:::o;45603:114::-;;:::o;45723:168::-;45863:20;45859:1;45851:6;45847:14;45840:44;45723:168;:::o;45897:162::-;46037:14;46033:1;46025:6;46021:14;46014:38;45897:162;:::o;46065:242::-;46205:34;46201:1;46193:6;46189:14;46182:58;46274:25;46269:2;46261:6;46257:15;46250:50;46065:242;:::o;46313:174::-;46453:26;46449:1;46441:6;46437:14;46430:50;46313:174;:::o;46493:180::-;46633:32;46629:1;46621:6;46617:14;46610:56;46493:180;:::o;46679:120::-;46767:1;46760:5;46757:12;46747:46;;46773:18;;:::i;:::-;46747:46;46679:120;:::o;46805:119::-;46892:1;46885:5;46882:12;46872:46;;46898:18;;:::i;:::-;46872:46;46805:119;:::o;46930:122::-;47003:24;47021:5;47003:24;:::i;:::-;46996:5;46993:35;46983:63;;47042:1;47039;47032:12;46983:63;46930:122;:::o;47058:116::-;47128:21;47143:5;47128:21;:::i;:::-;47121:5;47118:32;47108:60;;47164:1;47161;47154:12;47108:60;47058:116;:::o;47180:122::-;47253:24;47271:5;47253:24;:::i;:::-;47246:5;47243:35;47233:63;;47292:1;47289;47282:12;47233:63;47180:122;:::o;47308:120::-;47380:23;47397:5;47380:23;:::i;:::-;47373:5;47370:34;47360:62;;47418:1;47415;47408:12;47360:62;47308:120;:::o;47434:114::-;47522:1;47515:5;47512:12;47502:40;;47538:1;47535;47528:12;47502:40;47434:114;:::o;47554:113::-;47641:1;47634:5;47631:12;47621:40;;47657:1;47654;47647:12;47621:40;47554:113;:::o;47673:122::-;47746:24;47764:5;47746:24;:::i;:::-;47739:5;47736:35;47726:63;;47785:1;47782;47775:12;47726:63;47673:122;:::o;47801:120::-;47873:23;47890:5;47873:23;:::i;:::-;47866:5;47863:34;47853:62;;47911:1;47908;47901:12;47853:62;47801:120;:::o;47927:118::-;47998:22;48014:5;47998:22;:::i;:::-;47991:5;47988:33;47978:61;;48035:1;48032;48025:12;47978:61;47927:118;:::o

Swarm Source

ipfs://da91db777af0e22088f964ecd1470bbb0d71dfc384b8b6b8295baf13df501d2e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

Bored Stackers (B$) is a collection of 2000 NFT providing rewards and benefits to their holders.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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