ETH Price: $3,109.58 (+0.08%)
Gas: 13.3 Gwei

Token

THE DRAGON CLUB NFT (TDCNFT)
 

Overview

Max Total Supply

537 TDCNFT

Holders

229

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 TDCNFT
0x0f0cfc077969016B9fe387BED451Bc0Bbf1A231D
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
TheDragonClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-26
*/

// SPDX-License-Identifier: MIT
// File: contracts/DateTime.sol


pragma solidity ^0.8.0;

// ----------------------------------------------------------------------------
// DateTime Library v2.0
//
// A gas-efficient Solidity date and time library
//
// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary
//
// Tested date range 1970/01/01 to 2345/12/31
//
// Conventions:
// Unit      | Range         | Notes
// :-------- |:-------------:|:-----
// timestamp | >= 0          | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
// year      | 1970 ... 2345 |
// month     | 1 ... 12      |
// day       | 1 ... 31      |
// hour      | 0 ... 23      |
// minute    | 0 ... 59      |
// second    | 0 ... 59      |
// dayOfWeek | 1 ... 7       | 1 = Monday, ..., 7 = Sunday
//
//
// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.
// ----------------------------------------------------------------------------

library DateTime {
    uint256 constant SECONDS_PER_DAY = 24 * 60 * 60;
    uint256 constant SECONDS_PER_HOUR = 60 * 60;
    uint256 constant SECONDS_PER_MINUTE = 60;
    int256 constant OFFSET19700101 = 2440588;

    uint256 constant DOW_MON = 1;
    uint256 constant DOW_TUE = 2;
    uint256 constant DOW_WED = 3;
    uint256 constant DOW_THU = 4;
    uint256 constant DOW_FRI = 5;
    uint256 constant DOW_SAT = 6;
    uint256 constant DOW_SUN = 7;

    // ------------------------------------------------------------------------
    // Calculate the number of days from 1970/01/01 to year/month/day using
    // the date conversion algorithm from
    //   http://aa.usno.navy.mil/faq/docs/JD_Formula.php
    // and subtracting the offset 2440588 so that 1970/01/01 is day 0
    //
    // days = day
    //      - 32075
    //      + 1461 * (year + 4800 + (month - 14) / 12) / 4
    //      + 367 * (month - 2 - (month - 14) / 12 * 12) / 12
    //      - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4
    //      - offset
    // ------------------------------------------------------------------------
    function _daysFromDate(
        uint256 year,
        uint256 month,
        uint256 day
    ) internal pure returns (uint256 _days) {
        require(year >= 1970);
        int256 _year = int256(year);
        int256 _month = int256(month);
        int256 _day = int256(day);

        int256 __days =
        _day -
        32075 +
        (1461 * (_year + 4800 + (_month - 14) / 12)) /
        4 +
        (367 * (_month - 2 - ((_month - 14) / 12) * 12)) /
        12 -
        (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) /
        4 -
        OFFSET19700101;

        _days = uint256(__days);
    }

    // ------------------------------------------------------------------------
    // Calculate year/month/day from the number of days since 1970/01/01 using
    // the date conversion algorithm from
    //   http://aa.usno.navy.mil/faq/docs/JD_Formula.php
    // and adding the offset 2440588 so that 1970/01/01 is day 0
    //
    // int L = days + 68569 + offset
    // int N = 4 * L / 146097
    // L = L - (146097 * N + 3) / 4
    // year = 4000 * (L + 1) / 1461001
    // L = L - 1461 * year / 4 + 31
    // month = 80 * L / 2447
    // dd = L - 2447 * month / 80
    // L = month / 11
    // month = month + 2 - 12 * L
    // year = 100 * (N - 49) + year + L
    // ------------------------------------------------------------------------
    function _daysToDate(uint256 _days)
    internal
    pure
    returns (
        uint256 year,
        uint256 month,
        uint256 day
    )
    {
        int256 __days = int256(_days);

        int256 L = __days + 68569 + OFFSET19700101;
        int256 N = (4 * L) / 146097;
        L = L - (146097 * N + 3) / 4;
        int256 _year = (4000 * (L + 1)) / 1461001;
        L = L - (1461 * _year) / 4 + 31;
        int256 _month = (80 * L) / 2447;
        int256 _day = L - (2447 * _month) / 80;
        L = _month / 11;
        _month = _month + 2 - 12 * L;
        _year = 100 * (N - 49) + _year + L;

        year = uint256(_year);
        month = uint256(_month);
        day = uint256(_day);
    }

    function timestampFromDate(
        uint256 year,
        uint256 month,
        uint256 day
    ) internal pure returns (uint256 timestamp) {
        timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY;
    }

    function timestampFromDateTime(
        uint256 year,
        uint256 month,
        uint256 day,
        uint256 hour,
        uint256 minute,
        uint256 second
    ) internal pure returns (uint256 timestamp) {
        timestamp =
        _daysFromDate(year, month, day) *
        SECONDS_PER_DAY +
        hour *
        SECONDS_PER_HOUR +
        minute *
        SECONDS_PER_MINUTE +
        second;
    }

    function timestampToDate(uint256 timestamp)
    internal
    pure
    returns (
        uint256 year,
        uint256 month,
        uint256 day
    )
    {
        (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    function timestampToDateTime(uint256 timestamp)
    internal
    pure
    returns (
        uint256 year,
        uint256 month,
        uint256 day,
        uint256 hour,
        uint256 minute,
        uint256 second
    )
    {
        (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        uint256 secs = timestamp % SECONDS_PER_DAY;
        hour = secs / SECONDS_PER_HOUR;
        secs = secs % SECONDS_PER_HOUR;
        minute = secs / SECONDS_PER_MINUTE;
        second = secs % SECONDS_PER_MINUTE;
    }

    function isValidDate(
        uint256 year,
        uint256 month,
        uint256 day
    ) internal pure returns (bool valid) {
        if (year >= 1970 && month > 0 && month <= 12) {
            uint256 daysInMonth = _getDaysInMonth(year, month);
            if (day > 0 && day <= daysInMonth) {
                valid = true;
            }
        }
    }

    function isValidDateTime(
        uint256 year,
        uint256 month,
        uint256 day,
        uint256 hour,
        uint256 minute,
        uint256 second
    ) internal pure returns (bool valid) {
        if (isValidDate(year, month, day)) {
            if (hour < 24 && minute < 60 && second < 60) {
                valid = true;
            }
        }
    }

    function isLeapYear(uint256 timestamp)
    internal
    pure
    returns (bool leapYear)
    {
        (uint256 year, , ) = _daysToDate(timestamp / SECONDS_PER_DAY);
        leapYear = _isLeapYear(year);
    }

    function _isLeapYear(uint256 year) internal pure returns (bool leapYear) {
        leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }

    function isWeekDay(uint256 timestamp) internal pure returns (bool weekDay) {
        weekDay = getDayOfWeek(timestamp) <= DOW_FRI;
    }

    function isWeekEnd(uint256 timestamp) internal pure returns (bool weekEnd) {
        weekEnd = getDayOfWeek(timestamp) >= DOW_SAT;
    }

    function getDaysInMonth(uint256 timestamp)
    internal
    pure
    returns (uint256 daysInMonth)
    {
        (uint256 year, uint256 month, ) =
        _daysToDate(timestamp / SECONDS_PER_DAY);
        daysInMonth = _getDaysInMonth(year, month);
    }

    function _getDaysInMonth(uint256 year, uint256 month)
    internal
    pure
    returns (uint256 daysInMonth)
    {
        if (
            month == 1 ||
            month == 3 ||
            month == 5 ||
            month == 7 ||
            month == 8 ||
            month == 10 ||
            month == 12
        ) {
            daysInMonth = 31;
        } else if (month != 2) {
            daysInMonth = 30;
        } else {
            daysInMonth = _isLeapYear(year) ? 29 : 28;
        }
    }

    // 1 = Monday, 7 = Sunday
    function getDayOfWeek(uint256 timestamp)
    internal
    pure
    returns (uint256 dayOfWeek)
    {
        uint256 _days = timestamp / SECONDS_PER_DAY;
        dayOfWeek = ((_days + 3) % 7) + 1;
    }

    function getYear(uint256 timestamp) internal pure returns (uint256 year) {
        (year, , ) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    function getMonth(uint256 timestamp) internal pure returns (uint256 month) {
        (, month, ) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    function getDay(uint256 timestamp) internal pure returns (uint256 day) {
        (, , day) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    function getHour(uint256 timestamp) internal pure returns (uint256 hour) {
        uint256 secs = timestamp % SECONDS_PER_DAY;
        hour = secs / SECONDS_PER_HOUR;
    }

    function getMinute(uint256 timestamp)
    internal
    pure
    returns (uint256 minute)
    {
        uint256 secs = timestamp % SECONDS_PER_HOUR;
        minute = secs / SECONDS_PER_MINUTE;
    }

    function getSecond(uint256 timestamp)
    internal
    pure
    returns (uint256 second)
    {
        second = timestamp % SECONDS_PER_MINUTE;
    }

    function addYears(uint256 timestamp, uint256 _years)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        (uint256 year, uint256 month, uint256 day) =
        _daysToDate(timestamp / SECONDS_PER_DAY);
        year += _years;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp =
        _daysFromDate(year, month, day) *
        SECONDS_PER_DAY +
        (timestamp % SECONDS_PER_DAY);
        require(newTimestamp >= timestamp);
    }

    function addMonths(uint256 timestamp, uint256 _months)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        (uint256 year, uint256 month, uint256 day) =
        _daysToDate(timestamp / SECONDS_PER_DAY);
        month += _months;
        year += (month - 1) / 12;
        month = ((month - 1) % 12) + 1;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp =
        _daysFromDate(year, month, day) *
        SECONDS_PER_DAY +
        (timestamp % SECONDS_PER_DAY);
        require(newTimestamp >= timestamp);
    }

    function addDays(uint256 timestamp, uint256 _days)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp + _days * SECONDS_PER_DAY;
        require(newTimestamp >= timestamp);
    }

    function addHours(uint256 timestamp, uint256 _hours)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp + _hours * SECONDS_PER_HOUR;
        require(newTimestamp >= timestamp);
    }

    function addMinutes(uint256 timestamp, uint256 _minutes)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE;
        require(newTimestamp >= timestamp);
    }

    function addSeconds(uint256 timestamp, uint256 _seconds)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp + _seconds;
        require(newTimestamp >= timestamp);
    }

    function subYears(uint256 timestamp, uint256 _years)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        (uint256 year, uint256 month, uint256 day) =
        _daysToDate(timestamp / SECONDS_PER_DAY);
        year -= _years;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp =
        _daysFromDate(year, month, day) *
        SECONDS_PER_DAY +
        (timestamp % SECONDS_PER_DAY);
        require(newTimestamp <= timestamp);
    }

    function subMonths(uint256 timestamp, uint256 _months)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        (uint256 year, uint256 month, uint256 day) =
        _daysToDate(timestamp / SECONDS_PER_DAY);
        uint256 yearMonth = year * 12 + (month - 1) - _months;
        year = yearMonth / 12;
        month = (yearMonth % 12) + 1;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp =
        _daysFromDate(year, month, day) *
        SECONDS_PER_DAY +
        (timestamp % SECONDS_PER_DAY);
        require(newTimestamp <= timestamp);
    }

    function subDays(uint256 timestamp, uint256 _days)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp - _days * SECONDS_PER_DAY;
        require(newTimestamp <= timestamp);
    }

    function subHours(uint256 timestamp, uint256 _hours)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp - _hours * SECONDS_PER_HOUR;
        require(newTimestamp <= timestamp);
    }

    function subMinutes(uint256 timestamp, uint256 _minutes)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE;
        require(newTimestamp <= timestamp);
    }

    function subSeconds(uint256 timestamp, uint256 _seconds)
    internal
    pure
    returns (uint256 newTimestamp)
    {
        newTimestamp = timestamp - _seconds;
        require(newTimestamp <= timestamp);
    }

    function diffYears(uint256 fromTimestamp, uint256 toTimestamp)
    internal
    pure
    returns (uint256 _years)
    {
        require(fromTimestamp <= toTimestamp);
        (uint256 fromYear, , ) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
        (uint256 toYear, , ) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
        _years = toYear - fromYear;
    }

    function diffMonths(uint256 fromTimestamp, uint256 toTimestamp)
    internal
    pure
    returns (uint256 _months)
    {
        require(fromTimestamp <= toTimestamp);
        (uint256 fromYear, uint256 fromMonth, ) =
        _daysToDate(fromTimestamp / SECONDS_PER_DAY);
        (uint256 toYear, uint256 toMonth, ) =
        _daysToDate(toTimestamp / SECONDS_PER_DAY);
        _months = toYear * 12 + toMonth - fromYear * 12 - fromMonth;
    }

    function diffDays(uint256 fromTimestamp, uint256 toTimestamp)
    internal
    pure
    returns (uint256 _days)
    {
        require(fromTimestamp <= toTimestamp);
        _days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY;
    }

    function diffHours(uint256 fromTimestamp, uint256 toTimestamp)
    internal
    pure
    returns (uint256 _hours)
    {
        require(fromTimestamp <= toTimestamp);
        _hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR;
    }

    function diffMinutes(uint256 fromTimestamp, uint256 toTimestamp)
    internal
    pure
    returns (uint256 _minutes)
    {
        require(fromTimestamp <= toTimestamp);
        _minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE;
    }

    function diffSeconds(uint256 fromTimestamp, uint256 toTimestamp)
    internal
    pure
    returns (uint256 _seconds)
    {
        require(fromTimestamp <= toTimestamp);
        _seconds = toTimestamp - fromTimestamp;
    }
}
// File: @openzeppelin/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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/interfaces/IERC165.sol


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

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC2981.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/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: contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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 Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;

// Compiler will pack this into a single 256bit word.
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;
}

// Compiler will pack this into a single 256bit word.
struct AddressData {
// Realistically, 2**64-1 is more than enough.
uint64 balance;
// Keeps track of mint count with minimal overhead for tokenomics.
uint64 numberMinted;
// Keeps track of burn count with minimal overhead for tokenomics.
uint64 numberBurned;
// For miscellaneous variable(s) pertaining to the address
// (e.g. number of whitelist mint slots used).
// If there are multiple variables, please pack them into a uint64.
uint64 aux;
}

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

// The number of tokens burned.
uint256 internal _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 ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) internal _ownerships;

// Mapping owner address to address data
mapping(address => AddressData) private _addressData;

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

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

/**
 * @dev See {IERC721Enumerable-totalSupply}.
 * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
 */
function totalSupply() public view returns (uint256) {
// Counter underflow is impossible as _burnCounter cannot be incremented
// more than _currentIndex - _startTokenId() times
unchecked {
return _currentIndex - _burnCounter - _startTokenId();
}
}

/**
 * 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 See {IERC165-supportsInterface}.
 */
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}

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

/**
 * Returns the number of tokens minted by `owner`.
 */
function _numberMinted(address owner) internal view returns (uint256) {
if (owner == address(0)) revert MintedQueryForZeroAddress();
return uint256(_addressData[owner].numberMinted);
}

/**
 * Returns the number of tokens burned by or on behalf of `owner`.
 */
function _numberBurned(address owner) internal view returns (uint256) {
if (owner == address(0)) revert BurnedQueryForZeroAddress();
return uint256(_addressData[owner].numberBurned);
}

/**
 * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
 */
function _getAux(address owner) internal view returns (uint64) {
if (owner == address(0)) revert AuxQueryForZeroAddress();
return _addressData[owner].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 {
if (owner == address(0)) revert AuxQueryForZeroAddress();
_addressData[owner].aux = aux;
}

/**
 * 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) {
uint256 curr = tokenId;

unchecked {
if (_startTokenId() <= curr && curr < _currentIndex) {
TokenOwnership memory ownership = _ownerships[curr];
if (!ownership.burned) {
if (ownership.addr != address(0)) {
return ownership;
}
// 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.
while (true) {
curr--;
ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
}
}
}
revert OwnerQueryForNonexistentToken();
}

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

/**
 * @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, tokenId.toString())) : '';
}

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

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

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

_approve(to, tokenId, owner);
}

/**
 * @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 == _msgSender()) revert ApproveToCaller();

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

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

/**
 * @dev See {IERC721-transferFrom}.
 */
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
_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.isContract() && !_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 &&
!_ownerships[tokenId].burned;
}

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 {
_mint(to, quantity, _data, true);
}

/**
 * @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,
bytes memory _data,
bool safe
) 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 {
_addressData[to].balance += uint64(quantity);
_addressData[to].numberMinted += uint64(quantity);

_ownerships[startTokenId].addr = to;
_ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

if (safe && to.isContract()) {
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 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 {
TokenOwnership memory prevOwnership = ownershipOf(tokenId);

bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
isApprovedForAll(prevOwnership.addr, _msgSender()) ||
getApproved(tokenId) == _msgSender());

if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
if (to == address(0)) revert TransferToZeroAddress();

_beforeTokenTransfers(from, to, tokenId, 1);

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

// 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 {
_addressData[from].balance -= 1;
_addressData[to].balance += 1;

_ownerships[tokenId].addr = to;
_ownerships[tokenId].startTimestamp = uint64(block.timestamp);

// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
if (_ownerships[nextTokenId].addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId < _currentIndex) {
_ownerships[nextTokenId].addr = prevOwnership.addr;
_ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
}
}
}

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

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

_beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

// 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 {
_addressData[prevOwnership.addr].balance -= 1;
_addressData[prevOwnership.addr].numberBurned += 1;

// Keep track of who burned the token, and the timestamp of burning.
_ownerships[tokenId].addr = prevOwnership.addr;
_ownerships[tokenId].startTimestamp = uint64(block.timestamp);
_ownerships[tokenId].burned = true;

// If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
if (_ownerships[nextTokenId].addr == address(0)) {
// This will suffice for checking _exists(nextTokenId),
// as a burned slot cannot contain the zero address.
if (nextTokenId < _currentIndex) {
_ownerships[nextTokenId].addr = prevOwnership.addr;
_ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
}
}
}

emit Transfer(prevOwnership.addr, address(0), tokenId);
_afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

/**
 * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == 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 {}
}
// File: @openzeppelin/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: contracts/TheDragonClub.sol



pragma solidity ^0.8.4;





contract TheDragonClub is ERC721A,Ownable,IERC2981
{
    using Address for address;
    using Strings for uint256;

    string public collectionName = "THE DRAGON CLUB NFT";
    string public collectionSymbol = "TDCNFT";
    string public baseExtension = ".json";
    string private _baseUrl;
    string private _notRevealedUrl;

    uint256 public cost = 0.13 ether;
    uint256 public maxSupply = 8888;
    uint256 royaltyFee=500;
    uint256 private mintDate = DateTime.timestampFromDateTime(2022, 3, 27, 14, 0, 0);
    uint256 private revealDate = DateTime.timestampFromDateTime(2022, 4,6, 14, 0, 0);

    address royaltyAddress;
    bool public paused = true;

    address[] private _airdrops;
    address[] private _whitelist;

    constructor(string memory _base, string memory _notRevealed) ERC721A(collectionName, collectionSymbol)
    {
        setBaseUrl(_base);
        setNotRevealedUrl(_notRevealed);
        royaltyAddress=owner();
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256)
    {
        return (royaltyAddress, calculateRoyalty(_salePrice));
    }

    function calculateRoyalty(uint256 _salePrice) public view returns (uint256) {
        return (_salePrice / 10000) * royaltyFee;
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721A,IERC165) returns (bool)
    {
        return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
    }

    function setMintDate(uint256 _year,uint256 _month,uint256 _day,uint256 _hour,uint256 _minute,uint256 _second) public onlyOwner
    {
        mintDate = DateTime.timestampFromDateTime(_year,_month,_day,_hour,_minute,_second);
    }

    function setRevealDate(uint256 _year,uint256 _month,uint256 _day,uint256 _hour,uint256 _minute,uint256 _second) public onlyOwner
    {
        revealDate = DateTime.timestampFromDateTime(_year,_month,_day,_hour,_minute,_second);
    }

    function setCost(uint256 _newCost) public onlyOwner
    {
        cost = _newCost;
    }

    function pause(bool _state) public onlyOwner
    {
        paused = _state;
    }

    function withdraw() public payable onlyOwner
    {
        (bool os,) = payable(owner()).call{value : address(this).balance}("");
        require(os);
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        if(block.timestamp < revealDate)
            return _notRevealedUrl;

        return bytes(_baseUrl).length != 0 ? string(abi.encodePacked(_baseUrl, tokenId.toString(), baseExtension)) : '';
    }

    function setBaseUrl(string memory _url) public onlyOwner
    {
        _baseUrl = _url;
    }

    function setNotRevealedUrl(string memory _url) public onlyOwner
    {
        _notRevealedUrl = _url;
    }

    function setAirDropAddresses(address[] memory addresses) public onlyOwner
    {
        _airdrops = addresses;
    }

    function listAirDropAddresses() public view onlyOwner returns (address[] memory)
    {
        return _airdrops;
    }

    function setWhitelist(address[] memory addresses) public onlyOwner
    {
        _whitelist = addresses;
    }

    function listWhitelist() public view onlyOwner returns (address[] memory)
    {
        return _whitelist;
    }

    function supply() public view returns (uint256)
    {
        return maxSupply - _totalMinted();
    }

    function airdrop(uint256 quantity) external payable onlyOwner
    {
        require(_airdrops.length > 0,"Empty Airdrop List.");

        for (uint i = 0; i < _airdrops.length; i++)
            _safeMint(address(_airdrops[i]), quantity);
    }

    function mint(uint256 quantity) public payable
    {
        require(block.timestamp >= mintDate,"Not Yet The Public Sales Date.Stay Tuned.");
        require(paused == false,"Minting is Halted For a Moment, Please Try Again Later.");
        require(_totalMinted() + quantity <= maxSupply,"The Collection is Sold Out, Thank You For All Your Support.");
        require(quantity <= 10,"You Can Only Mint 10 Items A Time");

        if (msg.sender != owner())
            require(msg.value >= cost * quantity,"Insufficient Fund.");

        _safeMint(msg.sender, quantity);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_base","type":"string"},{"internalType":"string","name":"_notRevealed","type":"string"}],"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"payable","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"calculateRoyalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listAirDropAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listWhitelist","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"addresses","type":"address[]"}],"name":"setAirDropAddresses","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":"_url","type":"string"}],"name":"setBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_year","type":"uint256"},{"internalType":"uint256","name":"_month","type":"uint256"},{"internalType":"uint256","name":"_day","type":"uint256"},{"internalType":"uint256","name":"_hour","type":"uint256"},{"internalType":"uint256","name":"_minute","type":"uint256"},{"internalType":"uint256","name":"_second","type":"uint256"}],"name":"setMintDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setNotRevealedUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_year","type":"uint256"},{"internalType":"uint256","name":"_month","type":"uint256"},{"internalType":"uint256","name":"_day","type":"uint256"},{"internalType":"uint256","name":"_hour","type":"uint256"},{"internalType":"uint256","name":"_minute","type":"uint256"},{"internalType":"uint256","name":"_second","type":"uint256"}],"name":"setRevealDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280601381526020017f54484520445241474f4e20434c5542204e465400000000000000000000000000815250600990805190602001906200005192919062000800565b506040518060400160405280600681526020017f5444434e46540000000000000000000000000000000000000000000000000000815250600a90805190602001906200009f92919062000800565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000ed92919062000800565b506701cdda4faccd0000600e556122b8600f556101f4601055620001276107e66003601b600e600080620003a660201b62001f6b1760201c565b6011556200014b6107e660046006600e600080620003a660201b62001f6b1760201c565b6012556001601360146101000a81548160ff0219169083151502179055503480156200017657600080fd5b50604051620059823803806200598283398181016040528101906200019c91906200092e565b60098054620001ab9062000e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054620001d99062000e4b565b80156200022a5780601f10620001fe576101008083540402835291602001916200022a565b820191906000526020600020905b8154815290600101906020018083116200020c57829003601f168201915b5050505050600a80546200023e9062000e4b565b80601f01602080910402602001604051908101604052809291908181526020018280546200026c9062000e4b565b8015620002bd5780601f106200029157610100808354040283529160200191620002bd565b820191906000526020600020905b8154815290600101906020018083116200029f57829003601f168201915b50505050508160029080519060200190620002da92919062000800565b508060039080519060200190620002f392919062000800565b50620003046200041b60201b60201c565b60008190555050506200032c620003206200042060201b60201c565b6200042860201b60201c565b6200033d82620004ee60201b60201c565b6200034e816200059960201b60201c565b6200035e6200064460201b60201c565b601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000fc1565b600081603c84620003b8919062000d02565b610e1086620003c8919062000d02565b62015180620003df8b8b8b6200066e60201b60201c565b620003eb919062000d02565b620003f7919062000b0a565b62000403919062000b0a565b6200040f919062000b0a565b90509695505050505050565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004fe6200042060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005246200064460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200057d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200057490620009da565b60405180910390fd5b80600c90805190602001906200059592919062000800565b5050565b620005a96200042060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005cf6200064460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000628576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200061f90620009da565b60405180910390fd5b80600d90805190602001906200064092919062000800565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006107b28410156200068057600080fd5b600084905060008490506000849050600062253d8c60046064600c600e87620006aa919062000d63565b620006b6919062000b67565b61132488620006c6919062000a6c565b620006d2919062000a6c565b620006de919062000b67565b6003620006ec919062000bdb565b620006f8919062000b67565b600c80600c600e886200070c919062000d63565b62000718919062000b67565b62000724919062000bdb565b60028762000733919062000d63565b6200073f919062000d63565b61016f6200074e919062000bdb565b6200075a919062000b67565b6004600c600e886200076d919062000d63565b62000779919062000b67565b6112c08962000789919062000a6c565b62000795919062000a6c565b6105b5620007a4919062000bdb565b620007b0919062000b67565b617d4b86620007c0919062000d63565b620007cc919062000a6c565b620007d8919062000a6c565b620007e4919062000d63565b620007f0919062000d63565b9050809450505050509392505050565b8280546200080e9062000e4b565b90600052602060002090601f0160209004810192826200083257600085556200087e565b82601f106200084d57805160ff19168380011785556200087e565b828001600101855582156200087e579182015b828111156200087d57825182559160200191906001019062000860565b5b5090506200088d919062000891565b5090565b5b80821115620008ac57600081600090555060010162000892565b5090565b6000620008c7620008c18462000a25565b620009fc565b905082815260208101848484011115620008e657620008e562000f78565b5b620008f384828562000e15565b509392505050565b600082601f83011262000913576200091262000f73565b5b815162000925848260208601620008b0565b91505092915050565b6000806040838503121562000948576200094762000f82565b5b600083015167ffffffffffffffff81111562000969576200096862000f7d565b5b6200097785828601620008fb565b925050602083015167ffffffffffffffff8111156200099b576200099a62000f7d565b5b620009a985828601620008fb565b9150509250929050565b6000620009c260208362000a5b565b9150620009cf8262000f98565b602082019050919050565b60006020820190508181036000830152620009f581620009b3565b9050919050565b600062000a0862000a1b565b905062000a16828262000e81565b919050565b6000604051905090565b600067ffffffffffffffff82111562000a435762000a4262000f44565b5b62000a4e8262000f87565b9050602081019050919050565b600082825260208201905092915050565b600062000a798262000e01565b915062000a868362000e01565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161562000ac45762000ac362000eb7565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161562000aff5762000afe62000eb7565b5b828201905092915050565b600062000b178262000e0b565b915062000b248362000e0b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b5c5762000b5b62000eb7565b5b828201905092915050565b600062000b748262000e01565b915062000b818362000e01565b92508262000b945762000b9362000ee6565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161562000bd05762000bcf62000eb7565b5b828205905092915050565b600062000be88262000e01565b915062000bf58362000e01565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161562000c375762000c3662000eb7565b5b817f8000000000000000000000000000000000000000000000000000000000000000058312600084126000841316161562000c775762000c7662000eb7565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161562000cb75762000cb662000eb7565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff058212600084126000841216161562000cf75762000cf662000eb7565b5b828202905092915050565b600062000d0f8262000e0b565b915062000d1c8362000e0b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000d585762000d5762000eb7565b5b828202905092915050565b600062000d708262000e01565b915062000d7d8362000e01565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161562000dbb5762000dba62000eb7565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161562000df65762000df562000eb7565b5b828203905092915050565b6000819050919050565b6000819050919050565b60005b8381101562000e3557808201518184015260208101905062000e18565b8381111562000e45576000848401525b50505050565b6000600282049050600182168062000e6457607f821691505b6020821081141562000e7b5762000e7a62000f15565b5b50919050565b62000e8c8262000f87565b810181811067ffffffffffffffff8211171562000eae5762000ead62000f44565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6149b18062000fd16000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063d656b04d1161006f578063d656b04d146107ff578063e5326ab11461082a578063e985e9c514610855578063f2fde38b14610892578063f4217648146108bb57610230565b8063b88d4fde1461071a578063c668286214610743578063c7c3268b1461076e578063c87b56dd14610797578063d5abeb01146107d457610230565b806397dc4a13116100f257806397dc4a13146106535780639c12e1bc1461066f578063a0712d6814610698578063a22cb465146106b4578063a2e69613146106dd57610230565b806370a0823114610580578063715018a6146105bd578063857a492f146105d45780638da5cb5b146105fd57806395d89b411461062857610230565b806323b872dd116101bc57806342842e0e1161018057806342842e0e1461049d57806344a0d68a146104c65780635c975abb146104ef5780635cb6cbb51461051a5780636352211e1461054357610230565b806323b872dd146103d857806327cedbe6146104015780632a55205a1461042a5780632f39352a146104685780633ccfd60b1461049357610230565b8063081812fc11610203578063081812fc146102f1578063095ea7b31461032e5780630b1e838d1461035757806313faede61461038257806318160ddd146103ad57610230565b806301ffc9a71461023557806302329a2914610272578063047fc9aa1461029b57806306fdde03146102c6575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061385b565b6108e4565b6040516102699190613dff565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061382e565b610926565b005b3480156102a757600080fd5b506102b06109bf565b6040516102bd9190613f3c565b60405180910390f35b3480156102d257600080fd5b506102db6109db565b6040516102e89190613e1a565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906138fe565b610a6d565b6040516103259190613d4d565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906137a5565b610ae9565b005b34801561036357600080fd5b5061036c610bf4565b6040516103799190613ddd565b60405180910390f35b34801561038e57600080fd5b50610397610cfe565b6040516103a49190613f3c565b60405180910390f35b3480156103b957600080fd5b506103c2610d04565b6040516103cf9190613f3c565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061368f565b610d1b565b005b34801561040d57600080fd5b50610428600480360381019061042391906137e5565b610d2b565b005b34801561043657600080fd5b50610451600480360381019061044c919061392b565b610dc1565b60405161045f929190613db4565b60405180910390f35b34801561047457600080fd5b5061047d610dfb565b60405161048a9190613e1a565b60405180910390f35b61049b610e89565b005b3480156104a957600080fd5b506104c460048036038101906104bf919061368f565b610f85565b005b3480156104d257600080fd5b506104ed60048036038101906104e891906138fe565b610fa5565b005b3480156104fb57600080fd5b5061050461102b565b6040516105119190613dff565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c919061396b565b61103e565b005b34801561054f57600080fd5b5061056a600480360381019061056591906138fe565b6110d6565b6040516105779190613d4d565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613622565b6110ec565b6040516105b49190613f3c565b60405180910390f35b3480156105c957600080fd5b506105d26111bc565b005b3480156105e057600080fd5b506105fb60048036038101906105f6919061396b565b611244565b005b34801561060957600080fd5b506106126112dc565b60405161061f9190613d4d565b60405180910390f35b34801561063457600080fd5b5061063d611306565b60405161064a9190613e1a565b60405180910390f35b61066d600480360381019061066891906138fe565b611398565b005b34801561067b57600080fd5b50610696600480360381019061069191906138b5565b6114cb565b005b6106b260048036038101906106ad91906138fe565b611561565b005b3480156106c057600080fd5b506106db60048036038101906106d69190613765565b61172f565b005b3480156106e957600080fd5b5061070460048036038101906106ff91906138fe565b6118a7565b6040516107119190613f3c565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906136e2565b6118cb565b005b34801561074f57600080fd5b50610758611947565b6040516107659190613e1a565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906138b5565b6119d5565b005b3480156107a357600080fd5b506107be60048036038101906107b991906138fe565b611a6b565b6040516107cb9190613e1a565b60405180910390f35b3480156107e057600080fd5b506107e9611bab565b6040516107f69190613f3c565b60405180910390f35b34801561080b57600080fd5b50610814611bb1565b6040516108219190613ddd565b60405180910390f35b34801561083657600080fd5b5061083f611cbb565b60405161084c9190613e1a565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061364f565b611d49565b6040516108899190613dff565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613622565b611ddd565b005b3480156108c757600080fd5b506108e260048036038101906108dd91906137e5565b611ed5565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091f575061091e82611fcc565b5b9050919050565b61092e6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661094c6112dc565b73ffffffffffffffffffffffffffffffffffffffff16146109a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099990613e9c565b60405180910390fd5b80601360146101000a81548160ff02191690831515021790555050565b60006109c96120b6565b600f546109d69190614430565b905090565b6060600280546109ea90614524565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1690614524565b8015610a635780601f10610a3857610100808354040283529160200191610a63565b820191906000526020600020905b815481529060010190602001808311610a4657829003601f168201915b5050505050905090565b6000610a78826120c9565b610aae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af4826110d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7b6120ae565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bad5750610bab81610ba66120ae565b611d49565b155b15610be4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bef838383612117565b505050565b6060610bfe6120ae565b73ffffffffffffffffffffffffffffffffffffffff16610c1c6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990613e9c565b60405180910390fd5b6015805480602002602001604051908101604052809291908181526020018280548015610cf457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610caa575b5050505050905090565b600e5481565b6000610d0e6121c9565b6001546000540303905090565b610d268383836121ce565b505050565b610d336120ae565b73ffffffffffffffffffffffffffffffffffffffff16610d516112dc565b73ffffffffffffffffffffffffffffffffffffffff1614610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613e9c565b60405180910390fd5b8060149080519060200190610dbd9291906132cb565b5050565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610df0846118a7565b915091509250929050565b600a8054610e0890614524565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3490614524565b8015610e815780601f10610e5657610100808354040283529160200191610e81565b820191906000526020600020905b815481529060010190602001808311610e6457829003601f168201915b505050505081565b610e916120ae565b73ffffffffffffffffffffffffffffffffffffffff16610eaf6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90613e9c565b60405180910390fd5b6000610f0f6112dc565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f3290613d38565b60006040518083038185875af1925050503d8060008114610f6f576040519150601f19603f3d011682016040523d82523d6000602084013e610f74565b606091505b5050905080610f8257600080fd5b50565b610fa0838383604051806020016040528060008152506118cb565b505050565b610fad6120ae565b73ffffffffffffffffffffffffffffffffffffffff16610fcb6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613e9c565b60405180910390fd5b80600e8190555050565b601360149054906101000a900460ff1681565b6110466120ae565b73ffffffffffffffffffffffffffffffffffffffff166110646112dc565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190613e9c565b60405180910390fd5b6110c8868686868686611f6b565b601281905550505050505050565b60006110e1826126bf565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611154576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6111c46120ae565b73ffffffffffffffffffffffffffffffffffffffff166111e26112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90613e9c565b60405180910390fd5b611242600061294e565b565b61124c6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661126a6112dc565b73ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613e9c565b60405180910390fd5b6112ce868686868686611f6b565b601181905550505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461131590614524565b80601f016020809104026020016040519081016040528092919081815260200182805461134190614524565b801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b5050505050905090565b6113a06120ae565b73ffffffffffffffffffffffffffffffffffffffff166113be6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90613e9c565b60405180910390fd5b60006014805490501161145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613f1c565b60405180910390fd5b60005b6014805490508110156114c7576114b4601482815481106114835761148261468e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612a14565b80806114bf90614587565b91505061145f565b5050565b6114d36120ae565b73ffffffffffffffffffffffffffffffffffffffff166114f16112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613e9c565b60405180910390fd5b80600d908051906020019061155d929190613355565b5050565b6011544210156115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d90613e5c565b60405180910390fd5b60001515601360149054906101000a900460ff161515146115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390613e3c565b60405180910390fd5b600f54816116086120b6565b611612919061413a565b1115611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613ebc565b60405180910390fd5b600a811115611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90613efc565b60405180910390fd5b61169f6112dc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117225780600e546116df9190614342565b341015611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890613edc565b60405180910390fd5b5b61172c3382612a14565b50565b6117376120ae565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561179c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117a96120ae565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118566120ae565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189b9190613dff565b60405180910390a35050565b6000601054612710836118ba91906141fa565b6118c49190614342565b9050919050565b6118d68484846121ce565b6118f58373ffffffffffffffffffffffffffffffffffffffff16612a32565b801561190a575061190884848484612a55565b155b15611941576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600b805461195490614524565b80601f016020809104026020016040519081016040528092919081815260200182805461198090614524565b80156119cd5780601f106119a2576101008083540402835291602001916119cd565b820191906000526020600020905b8154815290600101906020018083116119b057829003601f168201915b505050505081565b6119dd6120ae565b73ffffffffffffffffffffffffffffffffffffffff166119fb6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890613e9c565b60405180910390fd5b80600c9080519060200190611a67929190613355565b5050565b6060611a76826120c9565b611aac576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254421015611b4857600d8054611ac390614524565b80601f0160208091040260200160405190810160405280929190818152602001828054611aef90614524565b8015611b3c5780601f10611b1157610100808354040283529160200191611b3c565b820191906000526020600020905b815481529060010190602001808311611b1f57829003601f168201915b50505050509050611ba6565b6000600c8054611b5790614524565b90501415611b745760405180602001604052806000815250611ba3565b600c611b7f83612bb5565b600b604051602001611b9393929190613d07565b6040516020818303038152906040525b90505b919050565b600f5481565b6060611bbb6120ae565b73ffffffffffffffffffffffffffffffffffffffff16611bd96112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690613e9c565b60405180910390fd5b6014805480602002602001604051908101604052809291908181526020018280548015611cb157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c67575b5050505050905090565b60098054611cc890614524565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf490614524565b8015611d415780601f10611d1657610100808354040283529160200191611d41565b820191906000526020600020905b815481529060010190602001808311611d2457829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611de56120ae565b73ffffffffffffffffffffffffffffffffffffffff16611e036112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090613e9c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec090613e7c565b60405180910390fd5b611ed28161294e565b50565b611edd6120ae565b73ffffffffffffffffffffffffffffffffffffffff16611efb6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4890613e9c565b60405180910390fd5b8060159080519060200190611f679291906132cb565b5050565b600081603c84611f7b9190614342565b610e1086611f899190614342565b62015180611f988b8b8b612d16565b611fa29190614342565b611fac919061413a565b611fb6919061413a565b611fc0919061413a565b90509695505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a757506120a682612e75565b5b9050919050565b600033905090565b60006120c06121c9565b60005403905090565b6000816120d46121c9565b111580156120e3575060005482105b8015612110575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006121d9826126bf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166122006120ae565b73ffffffffffffffffffffffffffffffffffffffff1614806122335750612232826000015161222d6120ae565b611d49565b5b8061227857506122416120ae565b73ffffffffffffffffffffffffffffffffffffffff1661226084610a6d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122b1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461231a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612381576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61238e8585856001612edf565b61239e6000848460000151612117565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561264f5760005481101561264e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126b88585856001612ee5565b5050505050565b6126c76133db565b6000829050806126d56121c9565b111580156126e4575060005481105b15612917576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161291557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127f9578092505050612949565b5b60011561291457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461290f578092505050612949565b6127fa565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a2e828260405180602001604052806000815250612eeb565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7b6120ae565b8786866040518563ffffffff1660e01b8152600401612a9d9493929190613d68565b602060405180830381600087803b158015612ab757600080fd5b505af1925050508015612ae857506040513d601f19601f82011682018060405250810190612ae59190613888565b60015b612b62573d8060008114612b18576040519150601f19603f3d011682016040523d82523d6000602084013e612b1d565b606091505b50600081511415612b5a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612bfd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d11565b600082905060005b60008214612c2f578080612c1890614587565b915050600a82612c2891906141fa565b9150612c05565b60008167ffffffffffffffff811115612c4b57612c4a6146bd565b5b6040519080825280601f01601f191660200182016040528015612c7d5781602001600182028036833780820191505090505b5090505b60008514612d0a57600182612c969190614430565b9150600a85612ca591906145d0565b6030612cb1919061413a565b60f81b818381518110612cc757612cc661468e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d0391906141fa565b9450612c81565b8093505050505b919050565b60006107b2841015612d2757600080fd5b600084905060008490506000849050600062253d8c60046064600c600e87612d4f919061439c565b612d599190614190565b61132488612d6791906140a6565b612d7191906140a6565b612d7b9190614190565b6003612d87919061422b565b612d919190614190565b600c80600c600e88612da3919061439c565b612dad9190614190565b612db7919061422b565b600287612dc4919061439c565b612dce919061439c565b61016f612ddb919061422b565b612de59190614190565b6004600c600e88612df6919061439c565b612e009190614190565b6112c089612e0e91906140a6565b612e1891906140a6565b6105b5612e25919061422b565b612e2f9190614190565b617d4b86612e3d919061439c565b612e4791906140a6565b612e5191906140a6565b612e5b919061439c565b612e65919061439c565b9050809450505050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b612ef88383836001612efd565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f6a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612fa5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fb26000868387612edf565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561317c575061317b8773ffffffffffffffffffffffffffffffffffffffff16612a32565b5b15613242575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131f16000888480600101955088612a55565b613227576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561318257826000541461323d57600080fd5b6132ae565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613243575b8160008190555050506132c46000868387612ee5565b5050505050565b828054828255906000526020600020908101928215613344579160200282015b828111156133435782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906132eb565b5b509050613351919061341e565b5090565b82805461336190614524565b90600052602060002090601f01602090048101928261338357600085556133ca565b82601f1061339c57805160ff19168380011785556133ca565b828001600101855582156133ca579182015b828111156133c95782518255916020019190600101906133ae565b5b5090506133d7919061341e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561343757600081600090555060010161341f565b5090565b600061344e61344984613f7c565b613f57565b90508083825260208201905082856020860282011115613471576134706146f1565b5b60005b858110156134a15781613487888261352f565b845260208401935060208301925050600181019050613474565b5050509392505050565b60006134be6134b984613fa8565b613f57565b9050828152602081018484840111156134da576134d96146f6565b5b6134e58482856144e2565b509392505050565b60006135006134fb84613fd9565b613f57565b90508281526020810184848401111561351c5761351b6146f6565b5b6135278482856144e2565b509392505050565b60008135905061353e8161491f565b92915050565b600082601f830112613559576135586146ec565b5b813561356984826020860161343b565b91505092915050565b60008135905061358181614936565b92915050565b6000813590506135968161494d565b92915050565b6000815190506135ab8161494d565b92915050565b600082601f8301126135c6576135c56146ec565b5b81356135d68482602086016134ab565b91505092915050565b600082601f8301126135f4576135f36146ec565b5b81356136048482602086016134ed565b91505092915050565b60008135905061361c81614964565b92915050565b60006020828403121561363857613637614700565b5b60006136468482850161352f565b91505092915050565b6000806040838503121561366657613665614700565b5b60006136748582860161352f565b92505060206136858582860161352f565b9150509250929050565b6000806000606084860312156136a8576136a7614700565b5b60006136b68682870161352f565b93505060206136c78682870161352f565b92505060406136d88682870161360d565b9150509250925092565b600080600080608085870312156136fc576136fb614700565b5b600061370a8782880161352f565b945050602061371b8782880161352f565b935050604061372c8782880161360d565b925050606085013567ffffffffffffffff81111561374d5761374c6146fb565b5b613759878288016135b1565b91505092959194509250565b6000806040838503121561377c5761377b614700565b5b600061378a8582860161352f565b925050602061379b85828601613572565b9150509250929050565b600080604083850312156137bc576137bb614700565b5b60006137ca8582860161352f565b92505060206137db8582860161360d565b9150509250929050565b6000602082840312156137fb576137fa614700565b5b600082013567ffffffffffffffff811115613819576138186146fb565b5b61382584828501613544565b91505092915050565b60006020828403121561384457613843614700565b5b600061385284828501613572565b91505092915050565b60006020828403121561387157613870614700565b5b600061387f84828501613587565b91505092915050565b60006020828403121561389e5761389d614700565b5b60006138ac8482850161359c565b91505092915050565b6000602082840312156138cb576138ca614700565b5b600082013567ffffffffffffffff8111156138e9576138e86146fb565b5b6138f5848285016135df565b91505092915050565b60006020828403121561391457613913614700565b5b60006139228482850161360d565b91505092915050565b6000806040838503121561394257613941614700565b5b60006139508582860161360d565b92505060206139618582860161360d565b9150509250929050565b60008060008060008060c0878903121561398857613987614700565b5b600061399689828a0161360d565b96505060206139a789828a0161360d565b95505060406139b889828a0161360d565b94505060606139c989828a0161360d565b93505060806139da89828a0161360d565b92505060a06139eb89828a0161360d565b9150509295509295509295565b6000613a048383613a10565b60208301905092915050565b613a1981614464565b82525050565b613a2881614464565b82525050565b6000613a398261402f565b613a43818561405d565b9350613a4e8361400a565b8060005b83811015613a7f578151613a6688826139f8565b9750613a7183614050565b925050600181019050613a52565b5085935050505092915050565b613a9581614476565b82525050565b6000613aa68261403a565b613ab0818561406e565b9350613ac08185602086016144f1565b613ac981614705565b840191505092915050565b6000613adf82614045565b613ae9818561408a565b9350613af98185602086016144f1565b613b0281614705565b840191505092915050565b6000613b1882614045565b613b22818561409b565b9350613b328185602086016144f1565b80840191505092915050565b60008154613b4b81614524565b613b55818661409b565b94506001821660008114613b705760018114613b8157613bb4565b60ff19831686528186019350613bb4565b613b8a8561401a565b60005b83811015613bac57815481890152600182019150602081019050613b8d565b838801955050505b50505092915050565b6000613bca60378361408a565b9150613bd582614716565b604082019050919050565b6000613bed60298361408a565b9150613bf882614765565b604082019050919050565b6000613c1060268361408a565b9150613c1b826147b4565b604082019050919050565b6000613c3360208361408a565b9150613c3e82614803565b602082019050919050565b6000613c56603b8361408a565b9150613c618261482c565b604082019050919050565b6000613c7960128361408a565b9150613c848261487b565b602082019050919050565b6000613c9c60008361407f565b9150613ca7826148a4565b600082019050919050565b6000613cbf60218361408a565b9150613cca826148a7565b604082019050919050565b6000613ce260138361408a565b9150613ced826148f6565b602082019050919050565b613d01816144d8565b82525050565b6000613d138286613b3e565b9150613d1f8285613b0d565b9150613d2b8284613b3e565b9150819050949350505050565b6000613d4382613c8f565b9150819050919050565b6000602082019050613d626000830184613a1f565b92915050565b6000608082019050613d7d6000830187613a1f565b613d8a6020830186613a1f565b613d976040830185613cf8565b8181036060830152613da98184613a9b565b905095945050505050565b6000604082019050613dc96000830185613a1f565b613dd66020830184613cf8565b9392505050565b60006020820190508181036000830152613df78184613a2e565b905092915050565b6000602082019050613e146000830184613a8c565b92915050565b60006020820190508181036000830152613e348184613ad4565b905092915050565b60006020820190508181036000830152613e5581613bbd565b9050919050565b60006020820190508181036000830152613e7581613be0565b9050919050565b60006020820190508181036000830152613e9581613c03565b9050919050565b60006020820190508181036000830152613eb581613c26565b9050919050565b60006020820190508181036000830152613ed581613c49565b9050919050565b60006020820190508181036000830152613ef581613c6c565b9050919050565b60006020820190508181036000830152613f1581613cb2565b9050919050565b60006020820190508181036000830152613f3581613cd5565b9050919050565b6000602082019050613f516000830184613cf8565b92915050565b6000613f61613f72565b9050613f6d8282614556565b919050565b6000604051905090565b600067ffffffffffffffff821115613f9757613f966146bd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fc357613fc26146bd565b5b613fcc82614705565b9050602081019050919050565b600067ffffffffffffffff821115613ff457613ff36146bd565b5b613ffd82614705565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140b1826144ae565b91506140bc836144ae565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156140f7576140f6614601565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561412f5761412e614601565b5b828201905092915050565b6000614145826144d8565b9150614150836144d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418557614184614601565b5b828201905092915050565b600061419b826144ae565b91506141a6836144ae565b9250826141b6576141b5614630565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156141ef576141ee614601565b5b828205905092915050565b6000614205826144d8565b9150614210836144d8565b9250826142205761421f614630565b5b828204905092915050565b6000614236826144ae565b9150614241836144ae565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821160008413600084131616156142805761427f614601565b5b817f800000000000000000000000000000000000000000000000000000000000000005831260008412600084131616156142bd576142bc614601565b5b827f800000000000000000000000000000000000000000000000000000000000000005821260008413600084121616156142fa576142f9614601565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff058212600084126000841216161561433757614336614601565b5b828202905092915050565b600061434d826144d8565b9150614358836144d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561439157614390614601565b5b828202905092915050565b60006143a7826144ae565b91506143b2836144ae565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156143ed576143ec614601565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561442557614424614601565b5b828203905092915050565b600061443b826144d8565b9150614446836144d8565b92508282101561445957614458614601565b5b828203905092915050565b600061446f826144b8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561450f5780820151818401526020810190506144f4565b8381111561451e576000848401525b50505050565b6000600282049050600182168061453c57607f821691505b602082108114156145505761454f61465f565b5b50919050565b61455f82614705565b810181811067ffffffffffffffff8211171561457e5761457d6146bd565b5b80604052505050565b6000614592826144d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145c5576145c4614601565b5b600182019050919050565b60006145db826144d8565b91506145e6836144d8565b9250826145f6576145f5614630565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74696e672069732048616c74656420466f722061204d6f6d656e742c2060008201527f506c656173652054727920416761696e204c617465722e000000000000000000602082015250565b7f4e6f742059657420546865205075626c69632053616c657320446174652e537460008201527f61792054756e65642e0000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520436f6c6c656374696f6e20697320536f6c64204f75742c205468616e60008201527f6b20596f7520466f7220416c6c20596f757220537570706f72742e0000000000602082015250565b7f496e73756666696369656e742046756e642e0000000000000000000000000000600082015250565b50565b7f596f752043616e204f6e6c79204d696e74203130204974656d7320412054696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f456d7074792041697264726f70204c6973742e00000000000000000000000000600082015250565b61492881614464565b811461493357600080fd5b50565b61493f81614476565b811461494a57600080fd5b50565b61495681614482565b811461496157600080fd5b50565b61496d816144d8565b811461497857600080fd5b5056fea26469706673582212208c1470f1f5b71d9a2a6eefb9e76e7355be49ffd10573caba5afaa350a384348564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d61623978613442465651394d62687645695a4b4277367779353942316e61683731616d5771674150784c346f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d6437614741674a6361444257536865375155454632344448714a77706766356b56356b70324466695a4638392f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e578063b88d4fde116100ab578063d656b04d1161006f578063d656b04d146107ff578063e5326ab11461082a578063e985e9c514610855578063f2fde38b14610892578063f4217648146108bb57610230565b8063b88d4fde1461071a578063c668286214610743578063c7c3268b1461076e578063c87b56dd14610797578063d5abeb01146107d457610230565b806397dc4a13116100f257806397dc4a13146106535780639c12e1bc1461066f578063a0712d6814610698578063a22cb465146106b4578063a2e69613146106dd57610230565b806370a0823114610580578063715018a6146105bd578063857a492f146105d45780638da5cb5b146105fd57806395d89b411461062857610230565b806323b872dd116101bc57806342842e0e1161018057806342842e0e1461049d57806344a0d68a146104c65780635c975abb146104ef5780635cb6cbb51461051a5780636352211e1461054357610230565b806323b872dd146103d857806327cedbe6146104015780632a55205a1461042a5780632f39352a146104685780633ccfd60b1461049357610230565b8063081812fc11610203578063081812fc146102f1578063095ea7b31461032e5780630b1e838d1461035757806313faede61461038257806318160ddd146103ad57610230565b806301ffc9a71461023557806302329a2914610272578063047fc9aa1461029b57806306fdde03146102c6575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061385b565b6108e4565b6040516102699190613dff565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061382e565b610926565b005b3480156102a757600080fd5b506102b06109bf565b6040516102bd9190613f3c565b60405180910390f35b3480156102d257600080fd5b506102db6109db565b6040516102e89190613e1a565b60405180910390f35b3480156102fd57600080fd5b50610318600480360381019061031391906138fe565b610a6d565b6040516103259190613d4d565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906137a5565b610ae9565b005b34801561036357600080fd5b5061036c610bf4565b6040516103799190613ddd565b60405180910390f35b34801561038e57600080fd5b50610397610cfe565b6040516103a49190613f3c565b60405180910390f35b3480156103b957600080fd5b506103c2610d04565b6040516103cf9190613f3c565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061368f565b610d1b565b005b34801561040d57600080fd5b50610428600480360381019061042391906137e5565b610d2b565b005b34801561043657600080fd5b50610451600480360381019061044c919061392b565b610dc1565b60405161045f929190613db4565b60405180910390f35b34801561047457600080fd5b5061047d610dfb565b60405161048a9190613e1a565b60405180910390f35b61049b610e89565b005b3480156104a957600080fd5b506104c460048036038101906104bf919061368f565b610f85565b005b3480156104d257600080fd5b506104ed60048036038101906104e891906138fe565b610fa5565b005b3480156104fb57600080fd5b5061050461102b565b6040516105119190613dff565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c919061396b565b61103e565b005b34801561054f57600080fd5b5061056a600480360381019061056591906138fe565b6110d6565b6040516105779190613d4d565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a29190613622565b6110ec565b6040516105b49190613f3c565b60405180910390f35b3480156105c957600080fd5b506105d26111bc565b005b3480156105e057600080fd5b506105fb60048036038101906105f6919061396b565b611244565b005b34801561060957600080fd5b506106126112dc565b60405161061f9190613d4d565b60405180910390f35b34801561063457600080fd5b5061063d611306565b60405161064a9190613e1a565b60405180910390f35b61066d600480360381019061066891906138fe565b611398565b005b34801561067b57600080fd5b50610696600480360381019061069191906138b5565b6114cb565b005b6106b260048036038101906106ad91906138fe565b611561565b005b3480156106c057600080fd5b506106db60048036038101906106d69190613765565b61172f565b005b3480156106e957600080fd5b5061070460048036038101906106ff91906138fe565b6118a7565b6040516107119190613f3c565b60405180910390f35b34801561072657600080fd5b50610741600480360381019061073c91906136e2565b6118cb565b005b34801561074f57600080fd5b50610758611947565b6040516107659190613e1a565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906138b5565b6119d5565b005b3480156107a357600080fd5b506107be60048036038101906107b991906138fe565b611a6b565b6040516107cb9190613e1a565b60405180910390f35b3480156107e057600080fd5b506107e9611bab565b6040516107f69190613f3c565b60405180910390f35b34801561080b57600080fd5b50610814611bb1565b6040516108219190613ddd565b60405180910390f35b34801561083657600080fd5b5061083f611cbb565b60405161084c9190613e1a565b60405180910390f35b34801561086157600080fd5b5061087c6004803603810190610877919061364f565b611d49565b6040516108899190613dff565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613622565b611ddd565b005b3480156108c757600080fd5b506108e260048036038101906108dd91906137e5565b611ed5565b005b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091f575061091e82611fcc565b5b9050919050565b61092e6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661094c6112dc565b73ffffffffffffffffffffffffffffffffffffffff16146109a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099990613e9c565b60405180910390fd5b80601360146101000a81548160ff02191690831515021790555050565b60006109c96120b6565b600f546109d69190614430565b905090565b6060600280546109ea90614524565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1690614524565b8015610a635780601f10610a3857610100808354040283529160200191610a63565b820191906000526020600020905b815481529060010190602001808311610a4657829003601f168201915b5050505050905090565b6000610a78826120c9565b610aae576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af4826110d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7b6120ae565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bad5750610bab81610ba66120ae565b611d49565b155b15610be4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bef838383612117565b505050565b6060610bfe6120ae565b73ffffffffffffffffffffffffffffffffffffffff16610c1c6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990613e9c565b60405180910390fd5b6015805480602002602001604051908101604052809291908181526020018280548015610cf457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610caa575b5050505050905090565b600e5481565b6000610d0e6121c9565b6001546000540303905090565b610d268383836121ce565b505050565b610d336120ae565b73ffffffffffffffffffffffffffffffffffffffff16610d516112dc565b73ffffffffffffffffffffffffffffffffffffffff1614610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613e9c565b60405180910390fd5b8060149080519060200190610dbd9291906132cb565b5050565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610df0846118a7565b915091509250929050565b600a8054610e0890614524565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3490614524565b8015610e815780601f10610e5657610100808354040283529160200191610e81565b820191906000526020600020905b815481529060010190602001808311610e6457829003601f168201915b505050505081565b610e916120ae565b73ffffffffffffffffffffffffffffffffffffffff16610eaf6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc90613e9c565b60405180910390fd5b6000610f0f6112dc565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f3290613d38565b60006040518083038185875af1925050503d8060008114610f6f576040519150601f19603f3d011682016040523d82523d6000602084013e610f74565b606091505b5050905080610f8257600080fd5b50565b610fa0838383604051806020016040528060008152506118cb565b505050565b610fad6120ae565b73ffffffffffffffffffffffffffffffffffffffff16610fcb6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611021576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101890613e9c565b60405180910390fd5b80600e8190555050565b601360149054906101000a900460ff1681565b6110466120ae565b73ffffffffffffffffffffffffffffffffffffffff166110646112dc565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b190613e9c565b60405180910390fd5b6110c8868686868686611f6b565b601281905550505050505050565b60006110e1826126bf565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611154576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6111c46120ae565b73ffffffffffffffffffffffffffffffffffffffff166111e26112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122f90613e9c565b60405180910390fd5b611242600061294e565b565b61124c6120ae565b73ffffffffffffffffffffffffffffffffffffffff1661126a6112dc565b73ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613e9c565b60405180910390fd5b6112ce868686868686611f6b565b601181905550505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461131590614524565b80601f016020809104026020016040519081016040528092919081815260200182805461134190614524565b801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b5050505050905090565b6113a06120ae565b73ffffffffffffffffffffffffffffffffffffffff166113be6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90613e9c565b60405180910390fd5b60006014805490501161145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613f1c565b60405180910390fd5b60005b6014805490508110156114c7576114b4601482815481106114835761148261468e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612a14565b80806114bf90614587565b91505061145f565b5050565b6114d36120ae565b73ffffffffffffffffffffffffffffffffffffffff166114f16112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613e9c565b60405180910390fd5b80600d908051906020019061155d929190613355565b5050565b6011544210156115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d90613e5c565b60405180910390fd5b60001515601360149054906101000a900460ff161515146115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f390613e3c565b60405180910390fd5b600f54816116086120b6565b611612919061413a565b1115611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613ebc565b60405180910390fd5b600a811115611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90613efc565b60405180910390fd5b61169f6112dc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117225780600e546116df9190614342565b341015611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890613edc565b60405180910390fd5b5b61172c3382612a14565b50565b6117376120ae565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561179c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117a96120ae565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118566120ae565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161189b9190613dff565b60405180910390a35050565b6000601054612710836118ba91906141fa565b6118c49190614342565b9050919050565b6118d68484846121ce565b6118f58373ffffffffffffffffffffffffffffffffffffffff16612a32565b801561190a575061190884848484612a55565b155b15611941576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600b805461195490614524565b80601f016020809104026020016040519081016040528092919081815260200182805461198090614524565b80156119cd5780601f106119a2576101008083540402835291602001916119cd565b820191906000526020600020905b8154815290600101906020018083116119b057829003601f168201915b505050505081565b6119dd6120ae565b73ffffffffffffffffffffffffffffffffffffffff166119fb6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4890613e9c565b60405180910390fd5b80600c9080519060200190611a67929190613355565b5050565b6060611a76826120c9565b611aac576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254421015611b4857600d8054611ac390614524565b80601f0160208091040260200160405190810160405280929190818152602001828054611aef90614524565b8015611b3c5780601f10611b1157610100808354040283529160200191611b3c565b820191906000526020600020905b815481529060010190602001808311611b1f57829003601f168201915b50505050509050611ba6565b6000600c8054611b5790614524565b90501415611b745760405180602001604052806000815250611ba3565b600c611b7f83612bb5565b600b604051602001611b9393929190613d07565b6040516020818303038152906040525b90505b919050565b600f5481565b6060611bbb6120ae565b73ffffffffffffffffffffffffffffffffffffffff16611bd96112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690613e9c565b60405180910390fd5b6014805480602002602001604051908101604052809291908181526020018280548015611cb157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c67575b5050505050905090565b60098054611cc890614524565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf490614524565b8015611d415780601f10611d1657610100808354040283529160200191611d41565b820191906000526020600020905b815481529060010190602001808311611d2457829003601f168201915b505050505081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611de56120ae565b73ffffffffffffffffffffffffffffffffffffffff16611e036112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090613e9c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec090613e7c565b60405180910390fd5b611ed28161294e565b50565b611edd6120ae565b73ffffffffffffffffffffffffffffffffffffffff16611efb6112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4890613e9c565b60405180910390fd5b8060159080519060200190611f679291906132cb565b5050565b600081603c84611f7b9190614342565b610e1086611f899190614342565b62015180611f988b8b8b612d16565b611fa29190614342565b611fac919061413a565b611fb6919061413a565b611fc0919061413a565b90509695505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061209757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806120a757506120a682612e75565b5b9050919050565b600033905090565b60006120c06121c9565b60005403905090565b6000816120d46121c9565b111580156120e3575060005482105b8015612110575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b60006121d9826126bf565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166122006120ae565b73ffffffffffffffffffffffffffffffffffffffff1614806122335750612232826000015161222d6120ae565b611d49565b5b8061227857506122416120ae565b73ffffffffffffffffffffffffffffffffffffffff1661226084610a6d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122b1576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461231a576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612381576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61238e8585856001612edf565b61239e6000848460000151612117565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561264f5760005481101561264e5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126b88585856001612ee5565b5050505050565b6126c76133db565b6000829050806126d56121c9565b111580156126e4575060005481105b15612917576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161291557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127f9578092505050612949565b5b60011561291457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461290f578092505050612949565b6127fa565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a2e828260405180602001604052806000815250612eeb565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a7b6120ae565b8786866040518563ffffffff1660e01b8152600401612a9d9493929190613d68565b602060405180830381600087803b158015612ab757600080fd5b505af1925050508015612ae857506040513d601f19601f82011682018060405250810190612ae59190613888565b60015b612b62573d8060008114612b18576040519150601f19603f3d011682016040523d82523d6000602084013e612b1d565b606091505b50600081511415612b5a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612bfd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d11565b600082905060005b60008214612c2f578080612c1890614587565b915050600a82612c2891906141fa565b9150612c05565b60008167ffffffffffffffff811115612c4b57612c4a6146bd565b5b6040519080825280601f01601f191660200182016040528015612c7d5781602001600182028036833780820191505090505b5090505b60008514612d0a57600182612c969190614430565b9150600a85612ca591906145d0565b6030612cb1919061413a565b60f81b818381518110612cc757612cc661468e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d0391906141fa565b9450612c81565b8093505050505b919050565b60006107b2841015612d2757600080fd5b600084905060008490506000849050600062253d8c60046064600c600e87612d4f919061439c565b612d599190614190565b61132488612d6791906140a6565b612d7191906140a6565b612d7b9190614190565b6003612d87919061422b565b612d919190614190565b600c80600c600e88612da3919061439c565b612dad9190614190565b612db7919061422b565b600287612dc4919061439c565b612dce919061439c565b61016f612ddb919061422b565b612de59190614190565b6004600c600e88612df6919061439c565b612e009190614190565b6112c089612e0e91906140a6565b612e1891906140a6565b6105b5612e25919061422b565b612e2f9190614190565b617d4b86612e3d919061439c565b612e4791906140a6565b612e5191906140a6565b612e5b919061439c565b612e65919061439c565b9050809450505050509392505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b612ef88383836001612efd565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f6a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612fa5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fb26000868387612edf565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561317c575061317b8773ffffffffffffffffffffffffffffffffffffffff16612a32565b5b15613242575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131f16000888480600101955088612a55565b613227576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561318257826000541461323d57600080fd5b6132ae565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613243575b8160008190555050506132c46000868387612ee5565b5050505050565b828054828255906000526020600020908101928215613344579160200282015b828111156133435782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906132eb565b5b509050613351919061341e565b5090565b82805461336190614524565b90600052602060002090601f01602090048101928261338357600085556133ca565b82601f1061339c57805160ff19168380011785556133ca565b828001600101855582156133ca579182015b828111156133c95782518255916020019190600101906133ae565b5b5090506133d7919061341e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561343757600081600090555060010161341f565b5090565b600061344e61344984613f7c565b613f57565b90508083825260208201905082856020860282011115613471576134706146f1565b5b60005b858110156134a15781613487888261352f565b845260208401935060208301925050600181019050613474565b5050509392505050565b60006134be6134b984613fa8565b613f57565b9050828152602081018484840111156134da576134d96146f6565b5b6134e58482856144e2565b509392505050565b60006135006134fb84613fd9565b613f57565b90508281526020810184848401111561351c5761351b6146f6565b5b6135278482856144e2565b509392505050565b60008135905061353e8161491f565b92915050565b600082601f830112613559576135586146ec565b5b813561356984826020860161343b565b91505092915050565b60008135905061358181614936565b92915050565b6000813590506135968161494d565b92915050565b6000815190506135ab8161494d565b92915050565b600082601f8301126135c6576135c56146ec565b5b81356135d68482602086016134ab565b91505092915050565b600082601f8301126135f4576135f36146ec565b5b81356136048482602086016134ed565b91505092915050565b60008135905061361c81614964565b92915050565b60006020828403121561363857613637614700565b5b60006136468482850161352f565b91505092915050565b6000806040838503121561366657613665614700565b5b60006136748582860161352f565b92505060206136858582860161352f565b9150509250929050565b6000806000606084860312156136a8576136a7614700565b5b60006136b68682870161352f565b93505060206136c78682870161352f565b92505060406136d88682870161360d565b9150509250925092565b600080600080608085870312156136fc576136fb614700565b5b600061370a8782880161352f565b945050602061371b8782880161352f565b935050604061372c8782880161360d565b925050606085013567ffffffffffffffff81111561374d5761374c6146fb565b5b613759878288016135b1565b91505092959194509250565b6000806040838503121561377c5761377b614700565b5b600061378a8582860161352f565b925050602061379b85828601613572565b9150509250929050565b600080604083850312156137bc576137bb614700565b5b60006137ca8582860161352f565b92505060206137db8582860161360d565b9150509250929050565b6000602082840312156137fb576137fa614700565b5b600082013567ffffffffffffffff811115613819576138186146fb565b5b61382584828501613544565b91505092915050565b60006020828403121561384457613843614700565b5b600061385284828501613572565b91505092915050565b60006020828403121561387157613870614700565b5b600061387f84828501613587565b91505092915050565b60006020828403121561389e5761389d614700565b5b60006138ac8482850161359c565b91505092915050565b6000602082840312156138cb576138ca614700565b5b600082013567ffffffffffffffff8111156138e9576138e86146fb565b5b6138f5848285016135df565b91505092915050565b60006020828403121561391457613913614700565b5b60006139228482850161360d565b91505092915050565b6000806040838503121561394257613941614700565b5b60006139508582860161360d565b92505060206139618582860161360d565b9150509250929050565b60008060008060008060c0878903121561398857613987614700565b5b600061399689828a0161360d565b96505060206139a789828a0161360d565b95505060406139b889828a0161360d565b94505060606139c989828a0161360d565b93505060806139da89828a0161360d565b92505060a06139eb89828a0161360d565b9150509295509295509295565b6000613a048383613a10565b60208301905092915050565b613a1981614464565b82525050565b613a2881614464565b82525050565b6000613a398261402f565b613a43818561405d565b9350613a4e8361400a565b8060005b83811015613a7f578151613a6688826139f8565b9750613a7183614050565b925050600181019050613a52565b5085935050505092915050565b613a9581614476565b82525050565b6000613aa68261403a565b613ab0818561406e565b9350613ac08185602086016144f1565b613ac981614705565b840191505092915050565b6000613adf82614045565b613ae9818561408a565b9350613af98185602086016144f1565b613b0281614705565b840191505092915050565b6000613b1882614045565b613b22818561409b565b9350613b328185602086016144f1565b80840191505092915050565b60008154613b4b81614524565b613b55818661409b565b94506001821660008114613b705760018114613b8157613bb4565b60ff19831686528186019350613bb4565b613b8a8561401a565b60005b83811015613bac57815481890152600182019150602081019050613b8d565b838801955050505b50505092915050565b6000613bca60378361408a565b9150613bd582614716565b604082019050919050565b6000613bed60298361408a565b9150613bf882614765565b604082019050919050565b6000613c1060268361408a565b9150613c1b826147b4565b604082019050919050565b6000613c3360208361408a565b9150613c3e82614803565b602082019050919050565b6000613c56603b8361408a565b9150613c618261482c565b604082019050919050565b6000613c7960128361408a565b9150613c848261487b565b602082019050919050565b6000613c9c60008361407f565b9150613ca7826148a4565b600082019050919050565b6000613cbf60218361408a565b9150613cca826148a7565b604082019050919050565b6000613ce260138361408a565b9150613ced826148f6565b602082019050919050565b613d01816144d8565b82525050565b6000613d138286613b3e565b9150613d1f8285613b0d565b9150613d2b8284613b3e565b9150819050949350505050565b6000613d4382613c8f565b9150819050919050565b6000602082019050613d626000830184613a1f565b92915050565b6000608082019050613d7d6000830187613a1f565b613d8a6020830186613a1f565b613d976040830185613cf8565b8181036060830152613da98184613a9b565b905095945050505050565b6000604082019050613dc96000830185613a1f565b613dd66020830184613cf8565b9392505050565b60006020820190508181036000830152613df78184613a2e565b905092915050565b6000602082019050613e146000830184613a8c565b92915050565b60006020820190508181036000830152613e348184613ad4565b905092915050565b60006020820190508181036000830152613e5581613bbd565b9050919050565b60006020820190508181036000830152613e7581613be0565b9050919050565b60006020820190508181036000830152613e9581613c03565b9050919050565b60006020820190508181036000830152613eb581613c26565b9050919050565b60006020820190508181036000830152613ed581613c49565b9050919050565b60006020820190508181036000830152613ef581613c6c565b9050919050565b60006020820190508181036000830152613f1581613cb2565b9050919050565b60006020820190508181036000830152613f3581613cd5565b9050919050565b6000602082019050613f516000830184613cf8565b92915050565b6000613f61613f72565b9050613f6d8282614556565b919050565b6000604051905090565b600067ffffffffffffffff821115613f9757613f966146bd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fc357613fc26146bd565b5b613fcc82614705565b9050602081019050919050565b600067ffffffffffffffff821115613ff457613ff36146bd565b5b613ffd82614705565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140b1826144ae565b91506140bc836144ae565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038313600083121516156140f7576140f6614601565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561412f5761412e614601565b5b828201905092915050565b6000614145826144d8565b9150614150836144d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561418557614184614601565b5b828201905092915050565b600061419b826144ae565b91506141a6836144ae565b9250826141b6576141b5614630565b5b600160000383147f8000000000000000000000000000000000000000000000000000000000000000831416156141ef576141ee614601565b5b828205905092915050565b6000614205826144d8565b9150614210836144d8565b9250826142205761421f614630565b5b828204905092915050565b6000614236826144ae565b9150614241836144ae565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821160008413600084131616156142805761427f614601565b5b817f800000000000000000000000000000000000000000000000000000000000000005831260008412600084131616156142bd576142bc614601565b5b827f800000000000000000000000000000000000000000000000000000000000000005821260008413600084121616156142fa576142f9614601565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff058212600084126000841216161561433757614336614601565b5b828202905092915050565b600061434d826144d8565b9150614358836144d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561439157614390614601565b5b828202905092915050565b60006143a7826144ae565b91506143b2836144ae565b9250827f8000000000000000000000000000000000000000000000000000000000000000018212600084121516156143ed576143ec614601565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561442557614424614601565b5b828203905092915050565b600061443b826144d8565b9150614446836144d8565b92508282101561445957614458614601565b5b828203905092915050565b600061446f826144b8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561450f5780820151818401526020810190506144f4565b8381111561451e576000848401525b50505050565b6000600282049050600182168061453c57607f821691505b602082108114156145505761454f61465f565b5b50919050565b61455f82614705565b810181811067ffffffffffffffff8211171561457e5761457d6146bd565b5b80604052505050565b6000614592826144d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145c5576145c4614601565b5b600182019050919050565b60006145db826144d8565b91506145e6836144d8565b9250826145f6576145f5614630565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74696e672069732048616c74656420466f722061204d6f6d656e742c2060008201527f506c656173652054727920416761696e204c617465722e000000000000000000602082015250565b7f4e6f742059657420546865205075626c69632053616c657320446174652e537460008201527f61792054756e65642e0000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520436f6c6c656374696f6e20697320536f6c64204f75742c205468616e60008201527f6b20596f7520466f7220416c6c20596f757220537570706f72742e0000000000602082015250565b7f496e73756666696369656e742046756e642e0000000000000000000000000000600082015250565b50565b7f596f752043616e204f6e6c79204d696e74203130204974656d7320412054696d60008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b7f456d7074792041697264726f70204c6973742e00000000000000000000000000600082015250565b61492881614464565b811461493357600080fd5b50565b61493f81614476565b811461494a57600080fd5b50565b61495681614482565b811461496157600080fd5b50565b61496d816144d8565b811461497857600080fd5b5056fea26469706673582212208c1470f1f5b71d9a2a6eefb9e76e7355be49ffd10573caba5afaa350a384348564736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d61623978613442465651394d62687645695a4b4277367779353942316e61683731616d5771674150784c346f2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d6437614741674a6361444257536865375155454632344448714a77706766356b56356b70324466695a4638392f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _base (string): ipfs://Qmab9xa4BFVQ9MbhvEiZKBw6wy59B1nah71amWqgAPxL4o/
Arg [1] : _notRevealed (string): ipfs://Qmd7aGAgJcaDBWShe7QUEF24DHqJwpgf5kV5kp2DfiZF89/hidden.json

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d61623978613442465651394d62687645695a4b42773677
Arg [4] : 79353942316e61683731616d5771674150784c346f2f00000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [6] : 697066733a2f2f516d6437614741674a63614442575368653751554546323444
Arg [7] : 48714a77706766356b56356b70324466695a4638392f68696464656e2e6a736f
Arg [8] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

58796:4450:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60129:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60918:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62284:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44583:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45878:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45513:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62161:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59141:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41265:255;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46635:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61784:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59784:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;58980:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61010:160;;;:::i;:::-;;46820:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60819:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59452:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60574:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44420:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42215:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57900:103;;;;;;;;;;;;;:::i;:::-;;60333:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57249:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44724:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62397:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61666:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62654:589;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46118:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59986:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47020:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59028:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61562:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61178:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59180:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61911:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58921:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46432:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58158:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62040:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60129:196;60223:4;60267:10;60252:25;;:11;:25;;;;:65;;;;60281:36;60305:11;60281:23;:36::i;:::-;60252:65;60245:72;;60129:196;;;:::o;60918:84::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60988:6:::1;60979;;:15;;;;;;;;;;;;;;;;;;60918:84:::0;:::o;62284:105::-;62323:7;62367:14;:12;:14::i;:::-;62355:9;;:26;;;;:::i;:::-;62348:33;;62284:105;:::o;44583:88::-;44637:13;44662:5;44655:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44583:88;:::o;45878:184::-;45946:7;45963:16;45971:7;45963;:16::i;:::-;45958:64;;45988:34;;;;;;;;;;;;;;45958:64;46034:15;:24;46050:7;46034:24;;;;;;;;;;;;;;;;;;;;;46027:31;;45878:184;;;:::o;45513:315::-;45578:13;45594:24;45610:7;45594:15;:24::i;:::-;45578:40;;45631:5;45625:11;;:2;:11;;;45621:48;;;45645:24;;;;;;;;;;;;;;45621:48;45694:5;45678:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;45704:37;45721:5;45728:12;:10;:12::i;:::-;45704:16;:37::i;:::-;45703:38;45678:63;45674:118;;;45753:35;;;;;;;;;;;;;;45674:118;45796:28;45805:2;45809:7;45818:5;45796:8;:28::i;:::-;45575:253;45513:315;;:::o;62161:115::-;62217:16;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62258:10:::1;62251:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62161:115:::0;:::o;59141:32::-;;;;:::o;41265:255::-;41309:7;41498:15;:13;:15::i;:::-;41483:12;;41467:13;;:28;:46;41460:53;;41265:255;:::o;46635:130::-;46733:28;46743:4;46749:2;46753:7;46733:9;:28::i;:::-;46635:130;;;:::o;61784:119::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61886:9:::1;61874;:21;;;;;;;;;;;;:::i;:::-;;61784:119:::0;:::o;59784:194::-;59883:7;59892;59925:14;;;;;;;;;;;59941:28;59958:10;59941:16;:28::i;:::-;59917:53;;;;59784:194;;;;;:::o;58980:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61010:160::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61072:7:::1;61092;:5;:7::i;:::-;61084:21;;61114;61084:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61071:69;;;61159:2;61151:11;;;::::0;::::1;;61060:110;61010:160::o:0;46820:145::-;46922:39;46939:4;46945:2;46949:7;46922:39;;;;;;;;;;;;:16;:39::i;:::-;46820:145;;;:::o;60819:91::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60894:8:::1;60887:4;:15;;;;60819:91:::0;:::o;59452:25::-;;;;;;;;;;;;;:::o;60574:237::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60732:71:::1;60763:5;60769:6;60776:4;60781:5;60787:7;60795;60732:30;:71::i;:::-;60719:10;:84;;;;60574:237:::0;;;;;;:::o;44420:112::-;44484:7;44503:20;44515:7;44503:11;:20::i;:::-;:25;;;44496:32;;44420:112;;;:::o;42215:186::-;42279:7;42312:1;42295:19;;:5;:19;;;42291:60;;;42323:28;;;;;;;;;;;;;;42291:60;42369:12;:19;42382:5;42369:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42361:36;;42354:43;;42215:186;;;:::o;57900:103::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57965:30:::1;57992:1;57965:18;:30::i;:::-;57900:103::o:0;60333:233::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60487:71:::1;60518:5;60524:6;60531:4;60536:5;60542:7;60550;60487:30;:71::i;:::-;60476:8;:82;;;;60333:233:::0;;;;;;:::o;57249:87::-;57295:7;57322:6;;;;;;;;;;;57315:13;;57249:87;:::o;44724:92::-;44780:13;44805:7;44798:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44724:92;:::o;62397:249::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62502:1:::1;62483:9;:16;;;;:20;62475:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;62544:6;62539:99;62560:9;:16;;;;62556:1;:20;62539:99;;;62596:42;62614:9;62624:1;62614:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;62629:8;62596:9;:42::i;:::-;62578:3;;;;;:::i;:::-;;;;62539:99;;;;62397:249:::0;:::o;61666:110::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61764:4:::1;61746:15;:22;;;;;;;;;;;;:::i;:::-;;61666:110:::0;:::o;62654:589::-;62744:8;;62725:15;:27;;62717:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;62826:5;62816:15;;:6;;;;;;;;;;;:15;;;62808:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;62938:9;;62926:8;62909:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;62901:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;63041:2;63029:8;:14;;63021:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;63111:7;:5;:7::i;:::-;63097:21;;:10;:21;;;63093:98;;63161:8;63154:4;;:15;;;;:::i;:::-;63141:9;:28;;63133:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63093:98;63204:31;63214:10;63226:8;63204:9;:31::i;:::-;62654:589;:::o;46118:259::-;46221:12;:10;:12::i;:::-;46209:24;;:8;:24;;;46205:54;;;46242:17;;;;;;;;;;;;;;46205:54;46309:8;46264:18;:32;46283:12;:10;:12::i;:::-;46264:32;;;;;;;;;;;;;;;:42;46297:8;46264:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46354:8;46325:48;;46340:12;:10;:12::i;:::-;46325:48;;;46364:8;46325:48;;;;;;:::i;:::-;;;;;;;;46118:259;;:::o;59986:135::-;60053:7;60103:10;;60094:5;60081:10;:18;;;;:::i;:::-;60080:33;;;;:::i;:::-;60073:40;;59986:135;;;:::o;47020:293::-;47143:28;47153:4;47159:2;47163:7;47143:9;:28::i;:::-;47178:15;:2;:13;;;:15::i;:::-;:76;;;;;47198:56;47229:4;47235:2;47239:7;47248:5;47198:30;:56::i;:::-;47197:57;47178:76;47174:136;;;47266:40;;;;;;;;;;;;;;47174:136;47020:293;;;;:::o;59028:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61562:96::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61646:4:::1;61635:8;:15;;;;;;;;;;;;:::i;:::-;;61562:96:::0;:::o;61178:376::-;61251:13;61287:16;61295:7;61287;:16::i;:::-;61282:59;;61312:29;;;;;;;;;;;;;;61282:59;61375:10;;61357:15;:28;61354:68;;;61407:15;61400:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61354:68;61468:1;61448:8;61442:22;;;;;:::i;:::-;;;:27;;:104;;;;;;;;;;;;;;;;;61496:8;61506:18;:7;:16;:18::i;:::-;61526:13;61479:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61442:104;61435:111;;61178:376;;;;:::o;59180:31::-;;;;:::o;61911:121::-;61974:16;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62015:9:::1;62008:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61911:121:::0;:::o;58921:52::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46432:152::-;46529:4;46545:18;:25;46564:5;46545:25;;;;;;;;;;;;;;;:35;46571:8;46545:35;;;;;;;;;;;;;;;;;;;;;;;;;46538:42;;46432:152;;;;:::o;58158:201::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58267:1:::1;58247:22;;:8;:22;;;;58239:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58323:28;58342:8;58323:18;:28::i;:::-;58158:201:::0;:::o;62040:113::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:5;:7::i;:::-;:23;;;57461:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62136:9:::1;62123:10;:22;;;;;;;;;;;;:::i;:::-;;62040:113:::0;:::o;4503:430::-;4706:17;4919:6;1159:2;4871:6;:36;;;;:::i;:::-;1107:7;4827:4;:32;;;;:::i;:::-;1052:12;4757:31;4771:4;4777:5;4784:3;4757:13;:31::i;:::-;:58;;;;:::i;:::-;:102;;;;:::i;:::-;:150;;;;:::i;:::-;:168;;;;:::i;:::-;4736:189;;4503:430;;;;;;;;:::o;41910:257::-;42012:4;42044:25;42029:40;;;:11;:40;;;;:93;;;;42089:33;42074:48;;;:11;:48;;;;42029:93;:134;;;;42127:36;42151:11;42127:23;:36::i;:::-;42029:134;42021:142;;41910:257;;;:::o;37628:98::-;37681:7;37708:10;37701:17;;37628:98;:::o;41597:257::-;41644:7;41828:15;:13;:15::i;:::-;41812:13;;:31;41805:38;;41597:257;:::o;47536:163::-;47593:4;47628:7;47609:15;:13;:15::i;:::-;:26;;:53;;;;;47649:13;;47639:7;:23;47609:53;:86;;;;;47668:11;:20;47680:7;47668:20;;;;;;;;;;;:27;;;;;;;;;;;;47667:28;47609:86;47602:93;;47536:163;;;:::o;53675:148::-;53781:2;53754:15;:24;53770:7;53754:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;53811:7;53807:2;53791:28;;53800:5;53791:28;;;;;;;;;;;;53675:148;;;:::o;41021:80::-;41077:7;41021:80;:::o;49997:1724::-;50076:35;50114:20;50126:7;50114:11;:20::i;:::-;50076:58;;50139:22;50181:13;:18;;;50165:34;;:12;:10;:12::i;:::-;:34;;;:89;;;;50204:50;50221:13;:18;;;50241:12;:10;:12::i;:::-;50204:16;:50::i;:::-;50165:89;:130;;;;50283:12;:10;:12::i;:::-;50259:36;;:20;50271:7;50259:11;:20::i;:::-;:36;;;50165:130;50139:157;;50306:17;50301:66;;50332:35;;;;;;;;;;;;;;50301:66;50396:4;50374:26;;:13;:18;;;:26;;;50370:67;;50409:28;;;;;;;;;;;;;;50370:67;50458:1;50444:16;;:2;:16;;;50440:52;;;50469:23;;;;;;;;;;;;;;50440:52;50497:43;50519:4;50525:2;50529:7;50538:1;50497:21;:43::i;:::-;50589:49;50606:1;50610:7;50619:13;:18;;;50589:8;:49::i;:::-;50920:1;50890:12;:18;50903:4;50890:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50952:1;50924:12;:16;50937:2;50924:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50986:2;50958:11;:20;50970:7;50958:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;51036:15;50991:11;:20;51003:7;50991:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;51268:19;51300:1;51290:7;:11;51268:33;;51349:1;51308:43;;:11;:24;51320:11;51308:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;51304:329;;;51485:13;;51471:11;:27;51467:163;;;51535:13;:18;;;51503:11;:24;51515:11;51503:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;51598:13;:28;;;51556:11;:24;51568:11;51556:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;51467:163;51304:329;50877:759;51664:7;51660:2;51645:27;;51654:4;51645:27;;;;;;;;;;;;51675:42;51696:4;51702:2;51706:7;51715:1;51675:20;:42::i;:::-;50073:1648;;49997:1724;;;:::o;43682:692::-;43743:21;;:::i;:::-;43769:12;43784:7;43769:22;;43832:4;43813:15;:13;:15::i;:::-;:23;;:47;;;;;43847:13;;43840:4;:20;43813:47;43809:518;;;43865:31;43899:11;:17;43911:4;43899:17;;;;;;;;;;;43865:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43924:9;:16;;;43919:405;;43975:1;43949:28;;:9;:14;;;:28;;;43945:57;;43989:9;43982:16;;;;;;43945:57;44204:117;44211:4;44204:117;;;44220:6;;;;;;;;44241:11;:17;44253:4;44241:17;;;;;;;;;;;44229:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44291:1;44265:28;;:9;:14;;;:28;;;44261:57;;44305:9;44298:16;;;;;;44261:57;44204:117;;;43919:405;43862:465;43809:518;44339:31;;;;;;;;;;;;;;43682:692;;;;:::o;58519:191::-;58593:16;58612:6;;;;;;;;;;;58593:25;;58638:8;58629:6;;:17;;;;;;;;;;;;;;;;;;58693:8;58662:40;;58683:8;58662:40;;;;;;;;;;;;58582:128;58519:191;:::o;47703:92::-;47764:27;47774:2;47778:8;47764:27;;;;;;;;;;;;:9;:27::i;:::-;47703:92;;:::o;18897:326::-;18957:4;19214:1;19192:7;:19;;;:23;19185:30;;18897:326;;;:::o;54275:487::-;54402:4;54431:2;54415:36;;;54452:12;:10;:12::i;:::-;54466:4;54472:7;54481:5;54415:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54411:348;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54634:1;54617:6;:13;:18;54613:143;;;54647:40;;;;;;;;;;;;;;54613:143;54742:6;54736:13;54727:6;54723:2;54719:15;54712:38;54411:348;54532:45;;;54522:55;;;:6;:55;;;;54515:62;;;54275:487;;;;;;:::o;15905:723::-;15961:13;16191:1;16182:5;:10;16178:53;;;16209:10;;;;;;;;;;;;;;;;;;;;;16178:53;16241:12;16256:5;16241:20;;16272:14;16297:78;16312:1;16304:4;:9;16297:78;;16330:8;;;;;:::i;:::-;;;;16361:2;16353:10;;;;;:::i;:::-;;;16297:78;;;16385:19;16417:6;16407:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16385:39;;16435:154;16451:1;16442:5;:10;16435:154;;16479:1;16469:11;;;;;:::i;:::-;;;16546:2;16538:5;:10;;;;:::i;:::-;16525:2;:24;;;;:::i;:::-;16512:39;;16495:6;16502;16495:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16575:2;16566:11;;;;;:::i;:::-;;;16435:154;;;16613:6;16599:21;;;;;15905:723;;;;:::o;2133:629::-;2255:13;2297:4;2289;:12;;2281:21;;;;;;2313:12;2335:4;2313:27;;2351:13;2374:5;2351:29;;2391:11;2412:3;2391:25;;2429:13;1201:7;2691:1;2674:3;2668:2;2662;2653:6;:11;;;;:::i;:::-;2652:18;;;;:::i;:::-;2645:4;2637:5;:12;;;;:::i;:::-;:33;;;;:::i;:::-;2636:41;;;;:::i;:::-;2631:1;:47;;;;:::i;:::-;2630:62;;;;:::i;:::-;2616:2;2600;2594;2588;2579:6;:11;;;;:::i;:::-;2578:18;;;;:::i;:::-;2577:25;;;;:::i;:::-;2573:1;2564:6;:10;;;;:::i;:::-;:38;;;;:::i;:::-;2557:3;:46;;;;:::i;:::-;2556:62;;;;:::i;:::-;2543:1;2527:2;2521;2512:6;:11;;;;:::i;:::-;2511:18;;;;:::i;:::-;2504:4;2496:5;:12;;;;:::i;:::-;:33;;;;:::i;:::-;2488:4;:42;;;;:::i;:::-;2487:57;;;;:::i;:::-;2470:5;2454:4;:21;;;;:::i;:::-;:90;;;;:::i;:::-;:164;;;;:::i;:::-;:238;;;;:::i;:::-;:264;;;;:::i;:::-;2429:289;;2747:6;2731:23;;2270:492;;;;2133:629;;;;;:::o;28980:157::-;29065:4;29104:25;29089:40;;;:11;:40;;;;29082:47;;28980:157;;;:::o;55346:123::-;;;;;:::o;56060:122::-;;;;;:::o;48114:123::-;48201:32;48207:2;48211:8;48221:5;48228:4;48201:5;:32::i;:::-;48114:123;;;:::o;48452:1335::-;48547:20;48570:13;;48547:36;;48604:1;48590:16;;:2;:16;;;48586:48;;;48615:19;;;;;;;;;;;;;;48586:48;48653:1;48641:8;:13;48637:44;;;48663:18;;;;;;;;;;;;;;48637:44;48686:61;48716:1;48720:2;48724:12;48738:8;48686:21;:61::i;:::-;49015:8;48980:12;:16;48993:2;48980:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49067:8;49027:12;:16;49040:2;49027:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49114:2;49081:11;:25;49093:12;49081:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;49169:15;49119:11;:25;49131:12;49119:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;49190:20;49213:12;49190:35;;49228:11;49257:8;49242:12;:23;49228:37;;49274:4;:23;;;;;49282:15;:2;:13;;;:15::i;:::-;49274:23;49270:417;;;49302:214;49338:12;49334:2;49313:38;;49330:1;49313:38;;;;;;;;;;;;49359:69;49398:1;49402:2;49406:14;;;;;;49422:5;49359:30;:69::i;:::-;49354:130;;49440:40;;;;;;;;;;;;;;49354:130;49511:3;49495:12;:19;;49302:214;;49565:12;49548:13;;:29;49544:43;;49579:8;;;49544:43;49270:417;;;49600:84;49636:14;;;;;;49632:2;49611:40;;49628:1;49611:40;;;;;;;;;;;;49679:3;49663:12;:19;;49600:84;;49270:417;49705:12;49689:13;:28;;;;48967:754;;49723:60;49752:1;49756:2;49760:12;49774:8;49723:20;:60::i;:::-;48544:1243;48452:1335;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:323::-;7359:6;7408:2;7396:9;7387:7;7383:23;7379:32;7376:119;;;7414:79;;:::i;:::-;7376:119;7534:1;7559:50;7601:7;7592:6;7581:9;7577:22;7559:50;:::i;:::-;7549:60;;7505:114;7303:323;;;;:::o;7632:327::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:52;7934:7;7925:6;7914:9;7910:22;7890:52;:::i;:::-;7880:62;;7836:116;7632:327;;;;:::o;7965:349::-;8034:6;8083:2;8071:9;8062:7;8058:23;8054:32;8051:119;;;8089:79;;:::i;:::-;8051:119;8209:1;8234:63;8289:7;8280:6;8269:9;8265:22;8234:63;:::i;:::-;8224:73;;8180:127;7965:349;;;;:::o;8320:509::-;8389:6;8438:2;8426:9;8417:7;8413:23;8409:32;8406:119;;;8444:79;;:::i;:::-;8406:119;8592:1;8581:9;8577:17;8564:31;8622:18;8614:6;8611:30;8608:117;;;8644:79;;:::i;:::-;8608:117;8749:63;8804:7;8795:6;8784:9;8780:22;8749:63;:::i;:::-;8739:73;;8535:287;8320:509;;;;:::o;8835:329::-;8894:6;8943:2;8931:9;8922:7;8918:23;8914:32;8911:119;;;8949:79;;:::i;:::-;8911:119;9069:1;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9040:117;8835:329;;;;:::o;9170:474::-;9238:6;9246;9295:2;9283:9;9274:7;9270:23;9266:32;9263:119;;;9301:79;;:::i;:::-;9263:119;9421:1;9446:53;9491:7;9482:6;9471:9;9467:22;9446:53;:::i;:::-;9436:63;;9392:117;9548:2;9574:53;9619:7;9610:6;9599:9;9595:22;9574:53;:::i;:::-;9564:63;;9519:118;9170:474;;;;;:::o;9650:1057::-;9754:6;9762;9770;9778;9786;9794;9843:3;9831:9;9822:7;9818:23;9814:33;9811:120;;;9850:79;;:::i;:::-;9811:120;9970:1;9995:53;10040:7;10031:6;10020:9;10016:22;9995:53;:::i;:::-;9985:63;;9941:117;10097:2;10123:53;10168:7;10159:6;10148:9;10144:22;10123:53;:::i;:::-;10113:63;;10068:118;10225:2;10251:53;10296:7;10287:6;10276:9;10272:22;10251:53;:::i;:::-;10241:63;;10196:118;10353:2;10379:53;10424:7;10415:6;10404:9;10400:22;10379:53;:::i;:::-;10369:63;;10324:118;10481:3;10508:53;10553:7;10544:6;10533:9;10529:22;10508:53;:::i;:::-;10498:63;;10452:119;10610:3;10637:53;10682:7;10673:6;10662:9;10658:22;10637:53;:::i;:::-;10627:63;;10581:119;9650:1057;;;;;;;;:::o;10713:179::-;10782:10;10803:46;10845:3;10837:6;10803:46;:::i;:::-;10881:4;10876:3;10872:14;10858:28;;10713:179;;;;:::o;10898:108::-;10975:24;10993:5;10975:24;:::i;:::-;10970:3;10963:37;10898:108;;:::o;11012:118::-;11099:24;11117:5;11099:24;:::i;:::-;11094:3;11087:37;11012:118;;:::o;11166:732::-;11285:3;11314:54;11362:5;11314:54;:::i;:::-;11384:86;11463:6;11458:3;11384:86;:::i;:::-;11377:93;;11494:56;11544:5;11494:56;:::i;:::-;11573:7;11604:1;11589:284;11614:6;11611:1;11608:13;11589:284;;;11690:6;11684:13;11717:63;11776:3;11761:13;11717:63;:::i;:::-;11710:70;;11803:60;11856:6;11803:60;:::i;:::-;11793:70;;11649:224;11636:1;11633;11629:9;11624:14;;11589:284;;;11593:14;11889:3;11882:10;;11290:608;;;11166:732;;;;:::o;11904:109::-;11985:21;12000:5;11985:21;:::i;:::-;11980:3;11973:34;11904:109;;:::o;12019:360::-;12105:3;12133:38;12165:5;12133:38;:::i;:::-;12187:70;12250:6;12245:3;12187:70;:::i;:::-;12180:77;;12266:52;12311:6;12306:3;12299:4;12292:5;12288:16;12266:52;:::i;:::-;12343:29;12365:6;12343:29;:::i;:::-;12338:3;12334:39;12327:46;;12109:270;12019:360;;;;:::o;12385:364::-;12473:3;12501:39;12534:5;12501:39;:::i;:::-;12556:71;12620:6;12615:3;12556:71;:::i;:::-;12549:78;;12636:52;12681:6;12676:3;12669:4;12662:5;12658:16;12636:52;:::i;:::-;12713:29;12735:6;12713:29;:::i;:::-;12708:3;12704:39;12697:46;;12477:272;12385:364;;;;:::o;12755:377::-;12861:3;12889:39;12922:5;12889:39;:::i;:::-;12944:89;13026:6;13021:3;12944:89;:::i;:::-;12937:96;;13042:52;13087:6;13082:3;13075:4;13068:5;13064:16;13042:52;:::i;:::-;13119:6;13114:3;13110:16;13103:23;;12865:267;12755:377;;;;:::o;13162:845::-;13265:3;13302:5;13296:12;13331:36;13357:9;13331:36;:::i;:::-;13383:89;13465:6;13460:3;13383:89;:::i;:::-;13376:96;;13503:1;13492:9;13488:17;13519:1;13514:137;;;;13665:1;13660:341;;;;13481:520;;13514:137;13598:4;13594:9;13583;13579:25;13574:3;13567:38;13634:6;13629:3;13625:16;13618:23;;13514:137;;13660:341;13727:38;13759:5;13727:38;:::i;:::-;13787:1;13801:154;13815:6;13812:1;13809:13;13801:154;;;13889:7;13883:14;13879:1;13874:3;13870:11;13863:35;13939:1;13930:7;13926:15;13915:26;;13837:4;13834:1;13830:12;13825:17;;13801:154;;;13984:6;13979:3;13975:16;13968:23;;13667:334;;13481:520;;13269:738;;13162:845;;;;:::o;14013:366::-;14155:3;14176:67;14240:2;14235:3;14176:67;:::i;:::-;14169:74;;14252:93;14341:3;14252:93;:::i;:::-;14370:2;14365:3;14361:12;14354:19;;14013:366;;;:::o;14385:::-;14527:3;14548:67;14612:2;14607:3;14548:67;:::i;:::-;14541:74;;14624:93;14713:3;14624:93;:::i;:::-;14742:2;14737:3;14733:12;14726:19;;14385:366;;;:::o;14757:::-;14899:3;14920:67;14984:2;14979:3;14920:67;:::i;:::-;14913:74;;14996:93;15085:3;14996:93;:::i;:::-;15114:2;15109:3;15105:12;15098:19;;14757:366;;;:::o;15129:::-;15271:3;15292:67;15356:2;15351:3;15292:67;:::i;:::-;15285:74;;15368:93;15457:3;15368:93;:::i;:::-;15486:2;15481:3;15477:12;15470:19;;15129:366;;;:::o;15501:::-;15643:3;15664:67;15728:2;15723:3;15664:67;:::i;:::-;15657:74;;15740:93;15829:3;15740:93;:::i;:::-;15858:2;15853:3;15849:12;15842:19;;15501:366;;;:::o;15873:::-;16015:3;16036:67;16100:2;16095:3;16036:67;:::i;:::-;16029:74;;16112:93;16201:3;16112:93;:::i;:::-;16230:2;16225:3;16221:12;16214:19;;15873:366;;;:::o;16245:398::-;16404:3;16425:83;16506:1;16501:3;16425:83;:::i;:::-;16418:90;;16517:93;16606:3;16517:93;:::i;:::-;16635:1;16630:3;16626:11;16619:18;;16245:398;;;:::o;16649:366::-;16791:3;16812:67;16876:2;16871:3;16812:67;:::i;:::-;16805:74;;16888:93;16977:3;16888:93;:::i;:::-;17006:2;17001:3;16997:12;16990:19;;16649:366;;;:::o;17021:::-;17163:3;17184:67;17248:2;17243:3;17184:67;:::i;:::-;17177:74;;17260:93;17349:3;17260:93;:::i;:::-;17378:2;17373:3;17369:12;17362:19;;17021:366;;;:::o;17393:118::-;17480:24;17498:5;17480:24;:::i;:::-;17475:3;17468:37;17393:118;;:::o;17517:583::-;17739:3;17761:92;17849:3;17840:6;17761:92;:::i;:::-;17754:99;;17870:95;17961:3;17952:6;17870:95;:::i;:::-;17863:102;;17982:92;18070:3;18061:6;17982:92;:::i;:::-;17975:99;;18091:3;18084:10;;17517:583;;;;;;:::o;18106:379::-;18290:3;18312:147;18455:3;18312:147;:::i;:::-;18305:154;;18476:3;18469:10;;18106:379;;;:::o;18491:222::-;18584:4;18622:2;18611:9;18607:18;18599:26;;18635:71;18703:1;18692:9;18688:17;18679:6;18635:71;:::i;:::-;18491:222;;;;:::o;18719:640::-;18914:4;18952:3;18941:9;18937:19;18929:27;;18966:71;19034:1;19023:9;19019:17;19010:6;18966:71;:::i;:::-;19047:72;19115:2;19104:9;19100:18;19091:6;19047:72;:::i;:::-;19129;19197:2;19186:9;19182:18;19173:6;19129:72;:::i;:::-;19248:9;19242:4;19238:20;19233:2;19222:9;19218:18;19211:48;19276:76;19347:4;19338:6;19276:76;:::i;:::-;19268:84;;18719:640;;;;;;;:::o;19365:332::-;19486:4;19524:2;19513:9;19509:18;19501:26;;19537:71;19605:1;19594:9;19590:17;19581:6;19537:71;:::i;:::-;19618:72;19686:2;19675:9;19671:18;19662:6;19618:72;:::i;:::-;19365:332;;;;;:::o;19703:373::-;19846:4;19884:2;19873:9;19869:18;19861:26;;19933:9;19927:4;19923:20;19919:1;19908:9;19904:17;19897:47;19961:108;20064:4;20055:6;19961:108;:::i;:::-;19953:116;;19703:373;;;;:::o;20082:210::-;20169:4;20207:2;20196:9;20192:18;20184:26;;20220:65;20282:1;20271:9;20267:17;20258:6;20220:65;:::i;:::-;20082:210;;;;:::o;20298:313::-;20411:4;20449:2;20438:9;20434:18;20426:26;;20498:9;20492:4;20488:20;20484:1;20473:9;20469:17;20462:47;20526:78;20599:4;20590:6;20526:78;:::i;:::-;20518:86;;20298:313;;;;:::o;20617:419::-;20783:4;20821:2;20810:9;20806:18;20798:26;;20870:9;20864:4;20860:20;20856:1;20845:9;20841:17;20834:47;20898:131;21024:4;20898:131;:::i;:::-;20890:139;;20617:419;;;:::o;21042:::-;21208:4;21246:2;21235:9;21231:18;21223:26;;21295:9;21289:4;21285:20;21281:1;21270:9;21266:17;21259:47;21323:131;21449:4;21323:131;:::i;:::-;21315:139;;21042:419;;;:::o;21467:::-;21633:4;21671:2;21660:9;21656:18;21648:26;;21720:9;21714:4;21710:20;21706:1;21695:9;21691:17;21684:47;21748:131;21874:4;21748:131;:::i;:::-;21740:139;;21467:419;;;:::o;21892:::-;22058:4;22096:2;22085:9;22081:18;22073:26;;22145:9;22139:4;22135:20;22131:1;22120:9;22116:17;22109:47;22173:131;22299:4;22173:131;:::i;:::-;22165:139;;21892:419;;;:::o;22317:::-;22483:4;22521:2;22510:9;22506:18;22498:26;;22570:9;22564:4;22560:20;22556:1;22545:9;22541:17;22534:47;22598:131;22724:4;22598:131;:::i;:::-;22590:139;;22317:419;;;:::o;22742:::-;22908:4;22946:2;22935:9;22931:18;22923:26;;22995:9;22989:4;22985:20;22981:1;22970:9;22966:17;22959:47;23023:131;23149:4;23023:131;:::i;:::-;23015:139;;22742:419;;;:::o;23167:::-;23333:4;23371:2;23360:9;23356:18;23348:26;;23420:9;23414:4;23410:20;23406:1;23395:9;23391:17;23384:47;23448:131;23574:4;23448:131;:::i;:::-;23440:139;;23167:419;;;:::o;23592:::-;23758:4;23796:2;23785:9;23781:18;23773:26;;23845:9;23839:4;23835:20;23831:1;23820:9;23816:17;23809:47;23873:131;23999:4;23873:131;:::i;:::-;23865:139;;23592:419;;;:::o;24017:222::-;24110:4;24148:2;24137:9;24133:18;24125:26;;24161:71;24229:1;24218:9;24214:17;24205:6;24161:71;:::i;:::-;24017:222;;;;:::o;24245:129::-;24279:6;24306:20;;:::i;:::-;24296:30;;24335:33;24363:4;24355:6;24335:33;:::i;:::-;24245:129;;;:::o;24380:75::-;24413:6;24446:2;24440:9;24430:19;;24380:75;:::o;24461:311::-;24538:4;24628:18;24620:6;24617:30;24614:56;;;24650:18;;:::i;:::-;24614:56;24700:4;24692:6;24688:17;24680:25;;24760:4;24754;24750:15;24742:23;;24461:311;;;:::o;24778:307::-;24839:4;24929:18;24921:6;24918:30;24915:56;;;24951:18;;:::i;:::-;24915:56;24989:29;25011:6;24989:29;:::i;:::-;24981:37;;25073:4;25067;25063:15;25055:23;;24778:307;;;:::o;25091:308::-;25153:4;25243:18;25235:6;25232:30;25229:56;;;25265:18;;:::i;:::-;25229:56;25303:29;25325:6;25303:29;:::i;:::-;25295:37;;25387:4;25381;25377:15;25369:23;;25091:308;;;:::o;25405:132::-;25472:4;25495:3;25487:11;;25525:4;25520:3;25516:14;25508:22;;25405:132;;;:::o;25543:141::-;25592:4;25615:3;25607:11;;25638:3;25635:1;25628:14;25672:4;25669:1;25659:18;25651:26;;25543:141;;;:::o;25690:114::-;25757:6;25791:5;25785:12;25775:22;;25690:114;;;:::o;25810:98::-;25861:6;25895:5;25889:12;25879:22;;25810:98;;;:::o;25914:99::-;25966:6;26000:5;25994:12;25984:22;;25914:99;;;:::o;26019:113::-;26089:4;26121;26116:3;26112:14;26104:22;;26019:113;;;:::o;26138:184::-;26237:11;26271:6;26266:3;26259:19;26311:4;26306:3;26302:14;26287:29;;26138:184;;;;:::o;26328:168::-;26411:11;26445:6;26440:3;26433:19;26485:4;26480:3;26476:14;26461:29;;26328:168;;;;:::o;26502:147::-;26603:11;26640:3;26625:18;;26502:147;;;;:::o;26655:169::-;26739:11;26773:6;26768:3;26761:19;26813:4;26808:3;26804:14;26789:29;;26655:169;;;;:::o;26830:148::-;26932:11;26969:3;26954:18;;26830:148;;;;:::o;26984:525::-;27023:3;27042:19;27059:1;27042:19;:::i;:::-;27037:24;;27075:19;27092:1;27075:19;:::i;:::-;27070:24;;27263:1;27195:66;27191:74;27188:1;27184:82;27179:1;27176;27172:9;27165:17;27161:106;27158:132;;;27270:18;;:::i;:::-;27158:132;27450:1;27382:66;27378:74;27375:1;27371:82;27367:1;27364;27360:9;27356:98;27353:124;;;27457:18;;:::i;:::-;27353:124;27501:1;27498;27494:9;27487:16;;26984:525;;;;:::o;27515:305::-;27555:3;27574:20;27592:1;27574:20;:::i;:::-;27569:25;;27608:20;27626:1;27608:20;:::i;:::-;27603:25;;27762:1;27694:66;27690:74;27687:1;27684:81;27681:107;;;27768:18;;:::i;:::-;27681:107;27812:1;27809;27805:9;27798:16;;27515:305;;;;:::o;27826:385::-;27865:1;27882:19;27899:1;27882:19;:::i;:::-;27877:24;;27915:19;27932:1;27915:19;:::i;:::-;27910:24;;27953:1;27943:35;;27958:18;;:::i;:::-;27943:35;28144:1;28141;28137:9;28134:1;28131:16;28050:66;28047:1;28044:73;28027:130;28024:156;;;28160:18;;:::i;:::-;28024:156;28203:1;28200;28195:10;28190:15;;27826:385;;;;:::o;28217:185::-;28257:1;28274:20;28292:1;28274:20;:::i;:::-;28269:25;;28308:20;28326:1;28308:20;:::i;:::-;28303:25;;28347:1;28337:35;;28352:18;;:::i;:::-;28337:35;28394:1;28391;28387:9;28382:14;;28217:185;;;;:::o;28408:991::-;28447:7;28470:19;28487:1;28470:19;:::i;:::-;28465:24;;28503:19;28520:1;28503:19;:::i;:::-;28498:24;;28704:1;28636:66;28632:74;28629:1;28626:81;28621:1;28618;28614:9;28610:1;28607;28603:9;28599:25;28595:113;28592:139;;;28711:18;;:::i;:::-;28592:139;28915:1;28847:66;28842:75;28839:1;28835:83;28830:1;28827;28823:9;28819:1;28816;28812:9;28808:25;28804:115;28801:141;;;28922:18;;:::i;:::-;28801:141;29126:1;29058:66;29053:75;29050:1;29046:83;29041:1;29038;29034:9;29030:1;29027;29023:9;29019:25;29015:115;29012:141;;;29133:18;;:::i;:::-;29012:141;29336:1;29268:66;29263:75;29260:1;29256:83;29251:1;29248;29244:9;29240:1;29237;29233:9;29229:25;29225:115;29222:141;;;29343:18;;:::i;:::-;29222:141;29391:1;29388;29384:9;29373:20;;28408:991;;;;:::o;29405:348::-;29445:7;29468:20;29486:1;29468:20;:::i;:::-;29463:25;;29502:20;29520:1;29502:20;:::i;:::-;29497:25;;29690:1;29622:66;29618:74;29615:1;29612:81;29607:1;29600:9;29593:17;29589:105;29586:131;;;29697:18;;:::i;:::-;29586:131;29745:1;29742;29738:9;29727:20;;29405:348;;;;:::o;29759:527::-;29798:4;29818:19;29835:1;29818:19;:::i;:::-;29813:24;;29851:19;29868:1;29851:19;:::i;:::-;29846:24;;30040:1;29972:66;29968:74;29965:1;29961:82;29956:1;29953;29949:9;29942:17;29938:106;29935:132;;;30047:18;;:::i;:::-;29935:132;30226:1;30158:66;30154:74;30151:1;30147:82;30143:1;30140;30136:9;30132:98;30129:124;;;30233:18;;:::i;:::-;30129:124;30278:1;30275;30271:9;30263:17;;29759:527;;;;:::o;30292:191::-;30332:4;30352:20;30370:1;30352:20;:::i;:::-;30347:25;;30386:20;30404:1;30386:20;:::i;:::-;30381:25;;30425:1;30422;30419:8;30416:34;;;30430:18;;:::i;:::-;30416:34;30475:1;30472;30468:9;30460:17;;30292:191;;;;:::o;30489:96::-;30526:7;30555:24;30573:5;30555:24;:::i;:::-;30544:35;;30489:96;;;:::o;30591:90::-;30625:7;30668:5;30661:13;30654:21;30643:32;;30591:90;;;:::o;30687:149::-;30723:7;30763:66;30756:5;30752:78;30741:89;;30687:149;;;:::o;30842:76::-;30878:7;30907:5;30896:16;;30842:76;;;:::o;30924:126::-;30961:7;31001:42;30994:5;30990:54;30979:65;;30924:126;;;:::o;31056:77::-;31093:7;31122:5;31111:16;;31056:77;;;:::o;31139:154::-;31223:6;31218:3;31213;31200:30;31285:1;31276:6;31271:3;31267:16;31260:27;31139:154;;;:::o;31299:307::-;31367:1;31377:113;31391:6;31388:1;31385:13;31377:113;;;31476:1;31471:3;31467:11;31461:18;31457:1;31452:3;31448:11;31441:39;31413:2;31410:1;31406:10;31401:15;;31377:113;;;31508:6;31505:1;31502:13;31499:101;;;31588:1;31579:6;31574:3;31570:16;31563:27;31499:101;31348:258;31299:307;;;:::o;31612:320::-;31656:6;31693:1;31687:4;31683:12;31673:22;;31740:1;31734:4;31730:12;31761:18;31751:81;;31817:4;31809:6;31805:17;31795:27;;31751:81;31879:2;31871:6;31868:14;31848:18;31845:38;31842:84;;;31898:18;;:::i;:::-;31842:84;31663:269;31612:320;;;:::o;31938:281::-;32021:27;32043:4;32021:27;:::i;:::-;32013:6;32009:40;32151:6;32139:10;32136:22;32115:18;32103:10;32100:34;32097:62;32094:88;;;32162:18;;:::i;:::-;32094:88;32202:10;32198:2;32191:22;31981:238;31938:281;;:::o;32225:233::-;32264:3;32287:24;32305:5;32287:24;:::i;:::-;32278:33;;32333:66;32326:5;32323:77;32320:103;;;32403:18;;:::i;:::-;32320:103;32450:1;32443:5;32439:13;32432:20;;32225:233;;;:::o;32464:176::-;32496:1;32513:20;32531:1;32513:20;:::i;:::-;32508:25;;32547:20;32565:1;32547:20;:::i;:::-;32542:25;;32586:1;32576:35;;32591:18;;:::i;:::-;32576:35;32632:1;32629;32625:9;32620:14;;32464:176;;;;:::o;32646:180::-;32694:77;32691:1;32684:88;32791:4;32788:1;32781:15;32815:4;32812:1;32805:15;32832:180;32880:77;32877:1;32870:88;32977:4;32974:1;32967:15;33001:4;32998:1;32991:15;33018:180;33066:77;33063:1;33056:88;33163:4;33160:1;33153:15;33187:4;33184:1;33177:15;33204:180;33252:77;33249:1;33242:88;33349:4;33346:1;33339:15;33373:4;33370:1;33363:15;33390:180;33438:77;33435:1;33428:88;33535:4;33532:1;33525:15;33559:4;33556:1;33549:15;33576:117;33685:1;33682;33675:12;33699:117;33808:1;33805;33798:12;33822:117;33931:1;33928;33921:12;33945:117;34054:1;34051;34044:12;34068:117;34177:1;34174;34167:12;34191:102;34232:6;34283:2;34279:7;34274:2;34267:5;34263:14;34259:28;34249:38;;34191:102;;;:::o;34299:242::-;34439:34;34435:1;34427:6;34423:14;34416:58;34508:25;34503:2;34495:6;34491:15;34484:50;34299:242;:::o;34547:228::-;34687:34;34683:1;34675:6;34671:14;34664:58;34756:11;34751:2;34743:6;34739:15;34732:36;34547:228;:::o;34781:225::-;34921:34;34917:1;34909:6;34905:14;34898:58;34990:8;34985:2;34977:6;34973:15;34966:33;34781:225;:::o;35012:182::-;35152:34;35148:1;35140:6;35136:14;35129:58;35012:182;:::o;35200:246::-;35340:34;35336:1;35328:6;35324:14;35317:58;35409:29;35404:2;35396:6;35392:15;35385:54;35200:246;:::o;35452:168::-;35592:20;35588:1;35580:6;35576:14;35569:44;35452:168;:::o;35626:114::-;;:::o;35746:220::-;35886:34;35882:1;35874:6;35870:14;35863:58;35955:3;35950:2;35942:6;35938:15;35931:28;35746:220;:::o;35972:169::-;36112:21;36108:1;36100:6;36096:14;36089:45;35972:169;:::o;36147:122::-;36220:24;36238:5;36220:24;:::i;:::-;36213:5;36210:35;36200:63;;36259:1;36256;36249:12;36200:63;36147:122;:::o;36275:116::-;36345:21;36360:5;36345:21;:::i;:::-;36338:5;36335:32;36325:60;;36381:1;36378;36371:12;36325:60;36275:116;:::o;36397:120::-;36469:23;36486:5;36469:23;:::i;:::-;36462:5;36459:34;36449:62;;36507:1;36504;36497:12;36449:62;36397:120;:::o;36523:122::-;36596:24;36614:5;36596:24;:::i;:::-;36589:5;36586:35;36576:63;;36635:1;36632;36625:12;36576:63;36523:122;:::o

Swarm Source

ipfs://8c1470f1f5b71d9a2a6eefb9e76e7355be49ffd10573caba5afaa350a3843485
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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