Token DUKET

 

Overview ERC-20

Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
1,000,000,000 DUK

Holders:
34 addresses

Transfers:
-

Contract:
0x3e350216ec86553CcCc5C241f8ff64cf87669Dfc0x3e350216ec86553CcCc5C241f8ff64cf87669Dfc

Decimals:
18

Social Profiles:
Not Available, Update ?

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DUKET

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at PolygonScan.com on 2022-11-24
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/[email protected]/interfaces/IERC3156FlashBorrower.sol


// OpenZeppelin Contracts (last updated v4.7.0) (interfaces/IERC3156FlashBorrower.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC3156 FlashBorrower, as defined in
 * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].
 *
 * _Available since v4.1._
 */
interface IERC3156FlashBorrower {
    /**
     * @dev Receive a flash loan.
     * @param initiator The initiator of the loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param fee The additional amount of tokens to repay.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     * @return The keccak256 hash of "IERC3156FlashBorrower.onFlashLoan"
     */
    function onFlashLoan(
        address initiator,
        address token,
        uint256 amount,
        uint256 fee,
        bytes calldata data
    ) external returns (bytes32);
}

// File: @openzeppelin/[email protected]/interfaces/IERC3156FlashLender.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Interface of the ERC3156 FlashLender, as defined in
 * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].
 *
 * _Available since v4.1._
 */
interface IERC3156FlashLender {
    /**
     * @dev The amount of currency available to be lended.
     * @param token The loan currency.
     * @return The amount of `token` that can be borrowed.
     */
    function maxFlashLoan(address token) external view returns (uint256);

    /**
     * @dev The fee to be charged for a given loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @return The amount of `token` to be charged for the loan, on top of the returned principal.
     */
    function flashFee(address token, uint256 amount) external view returns (uint256);

    /**
     * @dev Initiate a flash loan.
     * @param receiver The receiver of the tokens in the loan, and the receiver of the callback.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     */
    function flashLoan(
        IERC3156FlashBorrower receiver,
        address token,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}

// File: @openzeppelin/[email protected]/utils/math/SafeCast.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.

pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint248 from uint256, reverting on
     * overflow (when the input is greater than largest uint248).
     *
     * Counterpart to Solidity's `uint248` operator.
     *
     * Requirements:
     *
     * - input must fit into 248 bits
     *
     * _Available since v4.7._
     */
    function toUint248(uint256 value) internal pure returns (uint248) {
        require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits");
        return uint248(value);
    }

    /**
     * @dev Returns the downcasted uint240 from uint256, reverting on
     * overflow (when the input is greater than largest uint240).
     *
     * Counterpart to Solidity's `uint240` operator.
     *
     * Requirements:
     *
     * - input must fit into 240 bits
     *
     * _Available since v4.7._
     */
    function toUint240(uint256 value) internal pure returns (uint240) {
        require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits");
        return uint240(value);
    }

    /**
     * @dev Returns the downcasted uint232 from uint256, reverting on
     * overflow (when the input is greater than largest uint232).
     *
     * Counterpart to Solidity's `uint232` operator.
     *
     * Requirements:
     *
     * - input must fit into 232 bits
     *
     * _Available since v4.7._
     */
    function toUint232(uint256 value) internal pure returns (uint232) {
        require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits");
        return uint232(value);
    }

    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     *
     * _Available since v4.2._
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint216 from uint256, reverting on
     * overflow (when the input is greater than largest uint216).
     *
     * Counterpart to Solidity's `uint216` operator.
     *
     * Requirements:
     *
     * - input must fit into 216 bits
     *
     * _Available since v4.7._
     */
    function toUint216(uint256 value) internal pure returns (uint216) {
        require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits");
        return uint216(value);
    }

    /**
     * @dev Returns the downcasted uint208 from uint256, reverting on
     * overflow (when the input is greater than largest uint208).
     *
     * Counterpart to Solidity's `uint208` operator.
     *
     * Requirements:
     *
     * - input must fit into 208 bits
     *
     * _Available since v4.7._
     */
    function toUint208(uint256 value) internal pure returns (uint208) {
        require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits");
        return uint208(value);
    }

    /**
     * @dev Returns the downcasted uint200 from uint256, reverting on
     * overflow (when the input is greater than largest uint200).
     *
     * Counterpart to Solidity's `uint200` operator.
     *
     * Requirements:
     *
     * - input must fit into 200 bits
     *
     * _Available since v4.7._
     */
    function toUint200(uint256 value) internal pure returns (uint200) {
        require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits");
        return uint200(value);
    }

    /**
     * @dev Returns the downcasted uint192 from uint256, reverting on
     * overflow (when the input is greater than largest uint192).
     *
     * Counterpart to Solidity's `uint192` operator.
     *
     * Requirements:
     *
     * - input must fit into 192 bits
     *
     * _Available since v4.7._
     */
    function toUint192(uint256 value) internal pure returns (uint192) {
        require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits");
        return uint192(value);
    }

    /**
     * @dev Returns the downcasted uint184 from uint256, reverting on
     * overflow (when the input is greater than largest uint184).
     *
     * Counterpart to Solidity's `uint184` operator.
     *
     * Requirements:
     *
     * - input must fit into 184 bits
     *
     * _Available since v4.7._
     */
    function toUint184(uint256 value) internal pure returns (uint184) {
        require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits");
        return uint184(value);
    }

    /**
     * @dev Returns the downcasted uint176 from uint256, reverting on
     * overflow (when the input is greater than largest uint176).
     *
     * Counterpart to Solidity's `uint176` operator.
     *
     * Requirements:
     *
     * - input must fit into 176 bits
     *
     * _Available since v4.7._
     */
    function toUint176(uint256 value) internal pure returns (uint176) {
        require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits");
        return uint176(value);
    }

    /**
     * @dev Returns the downcasted uint168 from uint256, reverting on
     * overflow (when the input is greater than largest uint168).
     *
     * Counterpart to Solidity's `uint168` operator.
     *
     * Requirements:
     *
     * - input must fit into 168 bits
     *
     * _Available since v4.7._
     */
    function toUint168(uint256 value) internal pure returns (uint168) {
        require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits");
        return uint168(value);
    }

    /**
     * @dev Returns the downcasted uint160 from uint256, reverting on
     * overflow (when the input is greater than largest uint160).
     *
     * Counterpart to Solidity's `uint160` operator.
     *
     * Requirements:
     *
     * - input must fit into 160 bits
     *
     * _Available since v4.7._
     */
    function toUint160(uint256 value) internal pure returns (uint160) {
        require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits");
        return uint160(value);
    }

    /**
     * @dev Returns the downcasted uint152 from uint256, reverting on
     * overflow (when the input is greater than largest uint152).
     *
     * Counterpart to Solidity's `uint152` operator.
     *
     * Requirements:
     *
     * - input must fit into 152 bits
     *
     * _Available since v4.7._
     */
    function toUint152(uint256 value) internal pure returns (uint152) {
        require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits");
        return uint152(value);
    }

    /**
     * @dev Returns the downcasted uint144 from uint256, reverting on
     * overflow (when the input is greater than largest uint144).
     *
     * Counterpart to Solidity's `uint144` operator.
     *
     * Requirements:
     *
     * - input must fit into 144 bits
     *
     * _Available since v4.7._
     */
    function toUint144(uint256 value) internal pure returns (uint144) {
        require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits");
        return uint144(value);
    }

    /**
     * @dev Returns the downcasted uint136 from uint256, reverting on
     * overflow (when the input is greater than largest uint136).
     *
     * Counterpart to Solidity's `uint136` operator.
     *
     * Requirements:
     *
     * - input must fit into 136 bits
     *
     * _Available since v4.7._
     */
    function toUint136(uint256 value) internal pure returns (uint136) {
        require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits");
        return uint136(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v2.5._
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint120 from uint256, reverting on
     * overflow (when the input is greater than largest uint120).
     *
     * Counterpart to Solidity's `uint120` operator.
     *
     * Requirements:
     *
     * - input must fit into 120 bits
     *
     * _Available since v4.7._
     */
    function toUint120(uint256 value) internal pure returns (uint120) {
        require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits");
        return uint120(value);
    }

    /**
     * @dev Returns the downcasted uint112 from uint256, reverting on
     * overflow (when the input is greater than largest uint112).
     *
     * Counterpart to Solidity's `uint112` operator.
     *
     * Requirements:
     *
     * - input must fit into 112 bits
     *
     * _Available since v4.7._
     */
    function toUint112(uint256 value) internal pure returns (uint112) {
        require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits");
        return uint112(value);
    }

    /**
     * @dev Returns the downcasted uint104 from uint256, reverting on
     * overflow (when the input is greater than largest uint104).
     *
     * Counterpart to Solidity's `uint104` operator.
     *
     * Requirements:
     *
     * - input must fit into 104 bits
     *
     * _Available since v4.7._
     */
    function toUint104(uint256 value) internal pure returns (uint104) {
        require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits");
        return uint104(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     *
     * _Available since v4.2._
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint88 from uint256, reverting on
     * overflow (when the input is greater than largest uint88).
     *
     * Counterpart to Solidity's `uint88` operator.
     *
     * Requirements:
     *
     * - input must fit into 88 bits
     *
     * _Available since v4.7._
     */
    function toUint88(uint256 value) internal pure returns (uint88) {
        require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits");
        return uint88(value);
    }

    /**
     * @dev Returns the downcasted uint80 from uint256, reverting on
     * overflow (when the input is greater than largest uint80).
     *
     * Counterpart to Solidity's `uint80` operator.
     *
     * Requirements:
     *
     * - input must fit into 80 bits
     *
     * _Available since v4.7._
     */
    function toUint80(uint256 value) internal pure returns (uint80) {
        require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits");
        return uint80(value);
    }

    /**
     * @dev Returns the downcasted uint72 from uint256, reverting on
     * overflow (when the input is greater than largest uint72).
     *
     * Counterpart to Solidity's `uint72` operator.
     *
     * Requirements:
     *
     * - input must fit into 72 bits
     *
     * _Available since v4.7._
     */
    function toUint72(uint256 value) internal pure returns (uint72) {
        require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits");
        return uint72(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v2.5._
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint56 from uint256, reverting on
     * overflow (when the input is greater than largest uint56).
     *
     * Counterpart to Solidity's `uint56` operator.
     *
     * Requirements:
     *
     * - input must fit into 56 bits
     *
     * _Available since v4.7._
     */
    function toUint56(uint256 value) internal pure returns (uint56) {
        require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits");
        return uint56(value);
    }

    /**
     * @dev Returns the downcasted uint48 from uint256, reverting on
     * overflow (when the input is greater than largest uint48).
     *
     * Counterpart to Solidity's `uint48` operator.
     *
     * Requirements:
     *
     * - input must fit into 48 bits
     *
     * _Available since v4.7._
     */
    function toUint48(uint256 value) internal pure returns (uint48) {
        require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits");
        return uint48(value);
    }

    /**
     * @dev Returns the downcasted uint40 from uint256, reverting on
     * overflow (when the input is greater than largest uint40).
     *
     * Counterpart to Solidity's `uint40` operator.
     *
     * Requirements:
     *
     * - input must fit into 40 bits
     *
     * _Available since v4.7._
     */
    function toUint40(uint256 value) internal pure returns (uint40) {
        require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits");
        return uint40(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v2.5._
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint24 from uint256, reverting on
     * overflow (when the input is greater than largest uint24).
     *
     * Counterpart to Solidity's `uint24` operator.
     *
     * Requirements:
     *
     * - input must fit into 24 bits
     *
     * _Available since v4.7._
     */
    function toUint24(uint256 value) internal pure returns (uint24) {
        require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits");
        return uint24(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v2.5._
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits
     *
     * _Available since v2.5._
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     *
     * _Available since v3.0._
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int248 from int256, reverting on
     * overflow (when the input is less than smallest int248 or
     * greater than largest int248).
     *
     * Counterpart to Solidity's `int248` operator.
     *
     * Requirements:
     *
     * - input must fit into 248 bits
     *
     * _Available since v4.7._
     */
    function toInt248(int256 value) internal pure returns (int248 downcasted) {
        downcasted = int248(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 248 bits");
    }

    /**
     * @dev Returns the downcasted int240 from int256, reverting on
     * overflow (when the input is less than smallest int240 or
     * greater than largest int240).
     *
     * Counterpart to Solidity's `int240` operator.
     *
     * Requirements:
     *
     * - input must fit into 240 bits
     *
     * _Available since v4.7._
     */
    function toInt240(int256 value) internal pure returns (int240 downcasted) {
        downcasted = int240(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 240 bits");
    }

    /**
     * @dev Returns the downcasted int232 from int256, reverting on
     * overflow (when the input is less than smallest int232 or
     * greater than largest int232).
     *
     * Counterpart to Solidity's `int232` operator.
     *
     * Requirements:
     *
     * - input must fit into 232 bits
     *
     * _Available since v4.7._
     */
    function toInt232(int256 value) internal pure returns (int232 downcasted) {
        downcasted = int232(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 232 bits");
    }

    /**
     * @dev Returns the downcasted int224 from int256, reverting on
     * overflow (when the input is less than smallest int224 or
     * greater than largest int224).
     *
     * Counterpart to Solidity's `int224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     *
     * _Available since v4.7._
     */
    function toInt224(int256 value) internal pure returns (int224 downcasted) {
        downcasted = int224(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 224 bits");
    }

    /**
     * @dev Returns the downcasted int216 from int256, reverting on
     * overflow (when the input is less than smallest int216 or
     * greater than largest int216).
     *
     * Counterpart to Solidity's `int216` operator.
     *
     * Requirements:
     *
     * - input must fit into 216 bits
     *
     * _Available since v4.7._
     */
    function toInt216(int256 value) internal pure returns (int216 downcasted) {
        downcasted = int216(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 216 bits");
    }

    /**
     * @dev Returns the downcasted int208 from int256, reverting on
     * overflow (when the input is less than smallest int208 or
     * greater than largest int208).
     *
     * Counterpart to Solidity's `int208` operator.
     *
     * Requirements:
     *
     * - input must fit into 208 bits
     *
     * _Available since v4.7._
     */
    function toInt208(int256 value) internal pure returns (int208 downcasted) {
        downcasted = int208(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 208 bits");
    }

    /**
     * @dev Returns the downcasted int200 from int256, reverting on
     * overflow (when the input is less than smallest int200 or
     * greater than largest int200).
     *
     * Counterpart to Solidity's `int200` operator.
     *
     * Requirements:
     *
     * - input must fit into 200 bits
     *
     * _Available since v4.7._
     */
    function toInt200(int256 value) internal pure returns (int200 downcasted) {
        downcasted = int200(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 200 bits");
    }

    /**
     * @dev Returns the downcasted int192 from int256, reverting on
     * overflow (when the input is less than smallest int192 or
     * greater than largest int192).
     *
     * Counterpart to Solidity's `int192` operator.
     *
     * Requirements:
     *
     * - input must fit into 192 bits
     *
     * _Available since v4.7._
     */
    function toInt192(int256 value) internal pure returns (int192 downcasted) {
        downcasted = int192(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 192 bits");
    }

    /**
     * @dev Returns the downcasted int184 from int256, reverting on
     * overflow (when the input is less than smallest int184 or
     * greater than largest int184).
     *
     * Counterpart to Solidity's `int184` operator.
     *
     * Requirements:
     *
     * - input must fit into 184 bits
     *
     * _Available since v4.7._
     */
    function toInt184(int256 value) internal pure returns (int184 downcasted) {
        downcasted = int184(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 184 bits");
    }

    /**
     * @dev Returns the downcasted int176 from int256, reverting on
     * overflow (when the input is less than smallest int176 or
     * greater than largest int176).
     *
     * Counterpart to Solidity's `int176` operator.
     *
     * Requirements:
     *
     * - input must fit into 176 bits
     *
     * _Available since v4.7._
     */
    function toInt176(int256 value) internal pure returns (int176 downcasted) {
        downcasted = int176(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 176 bits");
    }

    /**
     * @dev Returns the downcasted int168 from int256, reverting on
     * overflow (when the input is less than smallest int168 or
     * greater than largest int168).
     *
     * Counterpart to Solidity's `int168` operator.
     *
     * Requirements:
     *
     * - input must fit into 168 bits
     *
     * _Available since v4.7._
     */
    function toInt168(int256 value) internal pure returns (int168 downcasted) {
        downcasted = int168(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 168 bits");
    }

    /**
     * @dev Returns the downcasted int160 from int256, reverting on
     * overflow (when the input is less than smallest int160 or
     * greater than largest int160).
     *
     * Counterpart to Solidity's `int160` operator.
     *
     * Requirements:
     *
     * - input must fit into 160 bits
     *
     * _Available since v4.7._
     */
    function toInt160(int256 value) internal pure returns (int160 downcasted) {
        downcasted = int160(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 160 bits");
    }

    /**
     * @dev Returns the downcasted int152 from int256, reverting on
     * overflow (when the input is less than smallest int152 or
     * greater than largest int152).
     *
     * Counterpart to Solidity's `int152` operator.
     *
     * Requirements:
     *
     * - input must fit into 152 bits
     *
     * _Available since v4.7._
     */
    function toInt152(int256 value) internal pure returns (int152 downcasted) {
        downcasted = int152(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 152 bits");
    }

    /**
     * @dev Returns the downcasted int144 from int256, reverting on
     * overflow (when the input is less than smallest int144 or
     * greater than largest int144).
     *
     * Counterpart to Solidity's `int144` operator.
     *
     * Requirements:
     *
     * - input must fit into 144 bits
     *
     * _Available since v4.7._
     */
    function toInt144(int256 value) internal pure returns (int144 downcasted) {
        downcasted = int144(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 144 bits");
    }

    /**
     * @dev Returns the downcasted int136 from int256, reverting on
     * overflow (when the input is less than smallest int136 or
     * greater than largest int136).
     *
     * Counterpart to Solidity's `int136` operator.
     *
     * Requirements:
     *
     * - input must fit into 136 bits
     *
     * _Available since v4.7._
     */
    function toInt136(int256 value) internal pure returns (int136 downcasted) {
        downcasted = int136(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 136 bits");
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128 downcasted) {
        downcasted = int128(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 128 bits");
    }

    /**
     * @dev Returns the downcasted int120 from int256, reverting on
     * overflow (when the input is less than smallest int120 or
     * greater than largest int120).
     *
     * Counterpart to Solidity's `int120` operator.
     *
     * Requirements:
     *
     * - input must fit into 120 bits
     *
     * _Available since v4.7._
     */
    function toInt120(int256 value) internal pure returns (int120 downcasted) {
        downcasted = int120(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 120 bits");
    }

    /**
     * @dev Returns the downcasted int112 from int256, reverting on
     * overflow (when the input is less than smallest int112 or
     * greater than largest int112).
     *
     * Counterpart to Solidity's `int112` operator.
     *
     * Requirements:
     *
     * - input must fit into 112 bits
     *
     * _Available since v4.7._
     */
    function toInt112(int256 value) internal pure returns (int112 downcasted) {
        downcasted = int112(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 112 bits");
    }

    /**
     * @dev Returns the downcasted int104 from int256, reverting on
     * overflow (when the input is less than smallest int104 or
     * greater than largest int104).
     *
     * Counterpart to Solidity's `int104` operator.
     *
     * Requirements:
     *
     * - input must fit into 104 bits
     *
     * _Available since v4.7._
     */
    function toInt104(int256 value) internal pure returns (int104 downcasted) {
        downcasted = int104(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 104 bits");
    }

    /**
     * @dev Returns the downcasted int96 from int256, reverting on
     * overflow (when the input is less than smallest int96 or
     * greater than largest int96).
     *
     * Counterpart to Solidity's `int96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     *
     * _Available since v4.7._
     */
    function toInt96(int256 value) internal pure returns (int96 downcasted) {
        downcasted = int96(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 96 bits");
    }

    /**
     * @dev Returns the downcasted int88 from int256, reverting on
     * overflow (when the input is less than smallest int88 or
     * greater than largest int88).
     *
     * Counterpart to Solidity's `int88` operator.
     *
     * Requirements:
     *
     * - input must fit into 88 bits
     *
     * _Available since v4.7._
     */
    function toInt88(int256 value) internal pure returns (int88 downcasted) {
        downcasted = int88(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 88 bits");
    }

    /**
     * @dev Returns the downcasted int80 from int256, reverting on
     * overflow (when the input is less than smallest int80 or
     * greater than largest int80).
     *
     * Counterpart to Solidity's `int80` operator.
     *
     * Requirements:
     *
     * - input must fit into 80 bits
     *
     * _Available since v4.7._
     */
    function toInt80(int256 value) internal pure returns (int80 downcasted) {
        downcasted = int80(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 80 bits");
    }

    /**
     * @dev Returns the downcasted int72 from int256, reverting on
     * overflow (when the input is less than smallest int72 or
     * greater than largest int72).
     *
     * Counterpart to Solidity's `int72` operator.
     *
     * Requirements:
     *
     * - input must fit into 72 bits
     *
     * _Available since v4.7._
     */
    function toInt72(int256 value) internal pure returns (int72 downcasted) {
        downcasted = int72(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 72 bits");
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64 downcasted) {
        downcasted = int64(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 64 bits");
    }

    /**
     * @dev Returns the downcasted int56 from int256, reverting on
     * overflow (when the input is less than smallest int56 or
     * greater than largest int56).
     *
     * Counterpart to Solidity's `int56` operator.
     *
     * Requirements:
     *
     * - input must fit into 56 bits
     *
     * _Available since v4.7._
     */
    function toInt56(int256 value) internal pure returns (int56 downcasted) {
        downcasted = int56(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 56 bits");
    }

    /**
     * @dev Returns the downcasted int48 from int256, reverting on
     * overflow (when the input is less than smallest int48 or
     * greater than largest int48).
     *
     * Counterpart to Solidity's `int48` operator.
     *
     * Requirements:
     *
     * - input must fit into 48 bits
     *
     * _Available since v4.7._
     */
    function toInt48(int256 value) internal pure returns (int48 downcasted) {
        downcasted = int48(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 48 bits");
    }

    /**
     * @dev Returns the downcasted int40 from int256, reverting on
     * overflow (when the input is less than smallest int40 or
     * greater than largest int40).
     *
     * Counterpart to Solidity's `int40` operator.
     *
     * Requirements:
     *
     * - input must fit into 40 bits
     *
     * _Available since v4.7._
     */
    function toInt40(int256 value) internal pure returns (int40 downcasted) {
        downcasted = int40(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 40 bits");
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32 downcasted) {
        downcasted = int32(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 32 bits");
    }

    /**
     * @dev Returns the downcasted int24 from int256, reverting on
     * overflow (when the input is less than smallest int24 or
     * greater than largest int24).
     *
     * Counterpart to Solidity's `int24` operator.
     *
     * Requirements:
     *
     * - input must fit into 24 bits
     *
     * _Available since v4.7._
     */
    function toInt24(int256 value) internal pure returns (int24 downcasted) {
        downcasted = int24(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 24 bits");
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16 downcasted) {
        downcasted = int16(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 16 bits");
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8 downcasted) {
        downcasted = int8(value);
        require(downcasted == value, "SafeCast: value doesn't fit in 8 bits");
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     *
     * _Available since v3.0._
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

// File: @openzeppelin/[email protected]/governance/utils/IVotes.sol


// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)
pragma solidity ^0.8.0;

/**
 * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.
 *
 * _Available since v4.5._
 */
interface IVotes {
    /**
     * @dev Emitted when an account changes their delegate.
     */
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /**
     * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.
     */
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /**
     * @dev Returns the current amount of votes that `account` has.
     */
    function getVotes(address account) external view returns (uint256);

    /**
     * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).
     */
    function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);

    /**
     * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).
     *
     * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.
     * Votes that have not been delegated are still part of total supply, even though they would not participate in a
     * vote.
     */
    function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);

    /**
     * @dev Returns the delegate that `account` has chosen.
     */
    function delegates(address account) external view returns (address);

    /**
     * @dev Delegates votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) external;

    /**
     * @dev Delegates votes from signer to `delegatee`.
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/[email protected]/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV // Deprecated in v4.8
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/[email protected]/utils/cryptography/EIP712.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/[email protected]/utils/StorageSlot.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }
}

// File: @openzeppelin/[email protected]/utils/Arrays.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Arrays.sol)

pragma solidity ^0.8.0;



/**
 * @dev Collection of functions related to array types.
 */
library Arrays {
    using StorageSlot for bytes32;

    /**
     * @dev Searches a sorted `array` and returns the first index that contains
     * a value greater or equal to `element`. If no such index exists (i.e. all
     * values in the array are strictly less than `element`), the array length is
     * returned. Time complexity O(log n).
     *
     * `array` is expected to be sorted in ascending order, and to contain no
     * repeated elements.
     */
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        if (array.length == 0) {
            return 0;
        }

        uint256 low = 0;
        uint256 high = array.length;

        while (low < high) {
            uint256 mid = Math.average(low, high);

            // Note that mid will always be strictly less than high (i.e. it will be a valid array index)
            // because Math.average rounds down (it does integer division with truncation).
            if (unsafeAccess(array, mid).value > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
        if (low > 0 && unsafeAccess(array, low - 1).value == element) {
            return low - 1;
        } else {
            return low;
        }
    }

    /**
     * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
     *
     * WARNING: Only use if you are certain `pos` is lower than the array length.
     */
    function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlot.AddressSlot storage) {
        bytes32 slot;
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0, arr.slot)
            slot := add(keccak256(0, 0x20), pos)
        }
        return slot.getAddressSlot();
    }

    /**
     * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
     *
     * WARNING: Only use if you are certain `pos` is lower than the array length.
     */
    function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlot.Bytes32Slot storage) {
        bytes32 slot;
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0, arr.slot)
            slot := add(keccak256(0, 0x20), pos)
        }
        return slot.getBytes32Slot();
    }

    /**
     * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check.
     *
     * WARNING: Only use if you are certain `pos` is lower than the array length.
     */
    function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlot.Uint256Slot storage) {
        bytes32 slot;
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0, arr.slot)
            slot := add(keccak256(0, 0x20), pos)
        }
        return slot.getUint256Slot();
    }
}

// File: @openzeppelin/[email protected]/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: @openzeppelin/[email protected]/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: @openzeppelin/[email protected]/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/[email protected]/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20FlashMint.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/ERC20FlashMint.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the ERC3156 Flash loans extension, as defined in
 * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156].
 *
 * Adds the {flashLoan} method, which provides flash loan support at the token
 * level. By default there is no fee, but this can be changed by overriding {flashFee}.
 *
 * _Available since v4.1._
 */
abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender {
    bytes32 private constant _RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan");

    /**
     * @dev Returns the maximum amount of tokens available for loan.
     * @param token The address of the token that is requested.
     * @return The amount of token that can be loaned.
     */
    function maxFlashLoan(address token) public view virtual override returns (uint256) {
        return token == address(this) ? type(uint256).max - ERC20.totalSupply() : 0;
    }

    /**
     * @dev Returns the fee applied when doing flash loans. This function calls
     * the {_flashFee} function which returns the fee applied when doing flash
     * loans.
     * @param token The token to be flash loaned.
     * @param amount The amount of tokens to be loaned.
     * @return The fees applied to the corresponding flash loan.
     */
    function flashFee(address token, uint256 amount) public view virtual override returns (uint256) {
        require(token == address(this), "ERC20FlashMint: wrong token");
        return _flashFee(token, amount);
    }

    /**
     * @dev Returns the fee applied when doing flash loans. By default this
     * implementation has 0 fees. This function can be overloaded to make
     * the flash loan mechanism deflationary.
     * @param token The token to be flash loaned.
     * @param amount The amount of tokens to be loaned.
     * @return The fees applied to the corresponding flash loan.
     */
    function _flashFee(address token, uint256 amount) internal view virtual returns (uint256) {
        // silence warning about unused variable without the addition of bytecode.
        token;
        amount;
        return 0;
    }

    /**
     * @dev Returns the receiver address of the flash fee. By default this
     * implementation returns the address(0) which means the fee amount will be burnt.
     * This function can be overloaded to change the fee receiver.
     * @return The address for which the flash fee will be sent to.
     */
    function _flashFeeReceiver() internal view virtual returns (address) {
        return address(0);
    }

    /**
     * @dev Performs a flash loan. New tokens are minted and sent to the
     * `receiver`, who is required to implement the {IERC3156FlashBorrower}
     * interface. By the end of the flash loan, the receiver is expected to own
     * amount + fee tokens and have them approved back to the token contract itself so
     * they can be burned.
     * @param receiver The receiver of the flash loan. Should implement the
     * {IERC3156FlashBorrower-onFlashLoan} interface.
     * @param token The token to be flash loaned. Only `address(this)` is
     * supported.
     * @param amount The amount of tokens to be loaned.
     * @param data An arbitrary datafield that is passed to the receiver.
     * @return `true` if the flash loan was successful.
     */
    // This function can reenter, but it doesn't pose a risk because it always preserves the property that the amount
    // minted at the beginning is always recovered and burned at the end, or else the entire function will revert.
    // slither-disable-next-line reentrancy-no-eth
    function flashLoan(
        IERC3156FlashBorrower receiver,
        address token,
        uint256 amount,
        bytes calldata data
    ) public virtual override returns (bool) {
        require(amount <= maxFlashLoan(token), "ERC20FlashMint: amount exceeds maxFlashLoan");
        uint256 fee = flashFee(token, amount);
        _mint(address(receiver), amount);
        require(
            receiver.onFlashLoan(msg.sender, token, amount, fee, data) == _RETURN_VALUE,
            "ERC20FlashMint: invalid return value"
        );
        address flashFeeReceiver = _flashFeeReceiver();
        _spendAllowance(address(receiver), address(this), amount + fee);
        if (fee == 0 || flashFeeReceiver == address(0)) {
            _burn(address(receiver), amount + fee);
        } else {
            _burn(address(receiver), amount);
            _transfer(address(receiver), flashFeeReceiver, fee);
        }
        return true;
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    /**
     * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
     * However, to ensure consistency with the upgradeable transpiler, we will continue
     * to reserve a slot.
     * @custom:oz-renamed-from _PERMIT_TYPEHASH
     */
    // solhint-disable-next-line var-name-mixedcase
    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Votes.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/extensions/ERC20Votes.sol)

pragma solidity ^0.8.0;






/**
 * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,
 * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.
 *
 * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.
 *
 * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
 * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting
 * power can be queried through the public accessors {getVotes} and {getPastVotes}.
 *
 * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it
 * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.
 *
 * _Available since v4.2._
 */
abstract contract ERC20Votes is IVotes, ERC20Permit {
    struct Checkpoint {
        uint32 fromBlock;
        uint224 votes;
    }

    bytes32 private constant _DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    mapping(address => address) private _delegates;
    mapping(address => Checkpoint[]) private _checkpoints;
    Checkpoint[] private _totalSupplyCheckpoints;

    /**
     * @dev Get the `pos`-th checkpoint for `account`.
     */
    function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {
        return _checkpoints[account][pos];
    }

    /**
     * @dev Get number of checkpoints for `account`.
     */
    function numCheckpoints(address account) public view virtual returns (uint32) {
        return SafeCast.toUint32(_checkpoints[account].length);
    }

    /**
     * @dev Get the address `account` is currently delegating to.
     */
    function delegates(address account) public view virtual override returns (address) {
        return _delegates[account];
    }

    /**
     * @dev Gets the current votes balance for `account`
     */
    function getVotes(address account) public view virtual override returns (uint256) {
        uint256 pos = _checkpoints[account].length;
        return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
    }

    /**
     * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_checkpoints[account], blockNumber);
    }

    /**
     * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.
     * It is but NOT the sum of all the delegated votes!
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);
    }

    /**
     * @dev Lookup a value in a list of (sorted) checkpoints.
     */
    function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {
        // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.
        //
        // Initially we check if the block is recent to narrow the search range.
        // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).
        // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.
        // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)
        // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)
        // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not
        // out of bounds (in which case we're looking too far in the past and the result is 0).
        // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is
        // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out
        // the same.
        uint256 length = ckpts.length;

        uint256 low = 0;
        uint256 high = length;

        if (length > 5) {
            uint256 mid = length - Math.sqrt(length);
            if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        while (low < high) {
            uint256 mid = Math.average(low, high);
            if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;
    }

    /**
     * @dev Delegate votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) public virtual override {
        _delegate(_msgSender(), delegatee);
    }

    /**
     * @dev Delegates votes from signer to `delegatee`
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= expiry, "ERC20Votes: signature expired");
        address signer = ECDSA.recover(
            _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
            v,
            r,
            s
        );
        require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce");
        _delegate(signer, delegatee);
    }

    /**
     * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).
     */
    function _maxSupply() internal view virtual returns (uint224) {
        return type(uint224).max;
    }

    /**
     * @dev Snapshots the totalSupply after it has been increased.
     */
    function _mint(address account, uint256 amount) internal virtual override {
        super._mint(account, amount);
        require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes");

        _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);
    }

    /**
     * @dev Snapshots the totalSupply after it has been decreased.
     */
    function _burn(address account, uint256 amount) internal virtual override {
        super._burn(account, amount);

        _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);
    }

    /**
     * @dev Move voting power when tokens are transferred.
     *
     * Emits a {IVotes-DelegateVotesChanged} event.
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._afterTokenTransfer(from, to, amount);

        _moveVotingPower(delegates(from), delegates(to), amount);
    }

    /**
     * @dev Change delegation for `delegator` to `delegatee`.
     *
     * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.
     */
    function _delegate(address delegator, address delegatee) internal virtual {
        address currentDelegate = delegates(delegator);
        uint256 delegatorBalance = balanceOf(delegator);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveVotingPower(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveVotingPower(
        address src,
        address dst,
        uint256 amount
    ) private {
        if (src != dst && amount > 0) {
            if (src != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);
                emit DelegateVotesChanged(src, oldWeight, newWeight);
            }

            if (dst != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);
                emit DelegateVotesChanged(dst, oldWeight, newWeight);
            }
        }
    }

    function _writeCheckpoint(
        Checkpoint[] storage ckpts,
        function(uint256, uint256) view returns (uint256) op,
        uint256 delta
    ) private returns (uint256 oldWeight, uint256 newWeight) {
        uint256 pos = ckpts.length;

        Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);

        oldWeight = oldCkpt.votes;
        newWeight = op(oldWeight, delta);

        if (pos > 0 && oldCkpt.fromBlock == block.number) {
            _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);
        } else {
            ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));
        }
    }

    function _add(uint256 a, uint256 b) private pure returns (uint256) {
        return a + b;
    }

    function _subtract(uint256 a, uint256 b) private pure returns (uint256) {
        return a - b;
    }

    function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {
        assembly {
            mstore(0, ckpts.slot)
            result.slot := add(keccak256(0, 0x20), pos)
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Snapshot.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/extensions/ERC20Snapshot.sol)

pragma solidity ^0.8.0;




/**
 * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
 * total supply at the time are recorded for later access.
 *
 * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
 * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
 * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
 * used to create an efficient ERC20 forking mechanism.
 *
 * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
 * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
 * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
 * and the account address.
 *
 * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it
 * return `block.number` will trigger the creation of snapshot at the beginning of each new block. When overriding this
 * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract.
 *
 * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient
 * alternative consider {ERC20Votes}.
 *
 * ==== Gas Costs
 *
 * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
 * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
 * smaller since identical balances in subsequent snapshots are stored as a single entry.
 *
 * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
 * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
 * transfers will have normal cost until the next snapshot, and so on.
 */

abstract contract ERC20Snapshot is ERC20 {
    // Inspired by Jordi Baylina's MiniMeToken to record historical balances:
    // https://github.com/Giveth/minime/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol

    using Arrays for uint256[];
    using Counters for Counters.Counter;

    // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
    // Snapshot struct, but that would impede usage of functions that work on an array.
    struct Snapshots {
        uint256[] ids;
        uint256[] values;
    }

    mapping(address => Snapshots) private _accountBalanceSnapshots;
    Snapshots private _totalSupplySnapshots;

    // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
    Counters.Counter private _currentSnapshotId;

    /**
     * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.
     */
    event Snapshot(uint256 id);

    /**
     * @dev Creates a new snapshot and returns its snapshot id.
     *
     * Emits a {Snapshot} event that contains the same id.
     *
     * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
     * set of accounts, for example using {AccessControl}, or it may be open to the public.
     *
     * [WARNING]
     * ====
     * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
     * you must consider that it can potentially be used by attackers in two ways.
     *
     * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
     * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
     * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
     * section above.
     *
     * We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
     * ====
     */
    function _snapshot() internal virtual returns (uint256) {
        _currentSnapshotId.increment();

        uint256 currentId = _getCurrentSnapshotId();
        emit Snapshot(currentId);
        return currentId;
    }

    /**
     * @dev Get the current snapshotId
     */
    function _getCurrentSnapshotId() internal view virtual returns (uint256) {
        return _currentSnapshotId.current();
    }

    /**
     * @dev Retrieves the balance of `account` at the time `snapshotId` was created.
     */
    function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);

        return snapshotted ? value : balanceOf(account);
    }

    /**
     * @dev Retrieves the total supply at the time `snapshotId` was created.
     */
    function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) {
        (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);

        return snapshotted ? value : totalSupply();
    }

    // Update balance and/or total supply snapshots before the values are modified. This is implemented
    // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations.
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        if (from == address(0)) {
            // mint
            _updateAccountSnapshot(to);
            _updateTotalSupplySnapshot();
        } else if (to == address(0)) {
            // burn
            _updateAccountSnapshot(from);
            _updateTotalSupplySnapshot();
        } else {
            // transfer
            _updateAccountSnapshot(from);
            _updateAccountSnapshot(to);
        }
    }

    function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) {
        require(snapshotId > 0, "ERC20Snapshot: id is 0");
        require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id");

        // When a valid snapshot is queried, there are three possibilities:
        //  a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
        //  created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
        //  to this id is the current one.
        //  b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
        //  requested id, and its value is the one to return.
        //  c) More snapshots were created after the requested one, and the queried value was later modified. There will be
        //  no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
        //  larger than the requested one.
        //
        // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
        // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
        // exactly this.

        uint256 index = snapshots.ids.findUpperBound(snapshotId);

        if (index == snapshots.ids.length) {
            return (false, 0);
        } else {
            return (true, snapshots.values[index]);
        }
    }

    function _updateAccountSnapshot(address account) private {
        _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
    }

    function _updateTotalSupplySnapshot() private {
        _updateSnapshot(_totalSupplySnapshots, totalSupply());
    }

    function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
        uint256 currentId = _getCurrentSnapshotId();
        if (_lastSnapshotId(snapshots.ids) < currentId) {
            snapshots.ids.push(currentId);
            snapshots.values.push(currentValue);
        }
    }

    function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
        if (ids.length == 0) {
            return 0;
        } else {
            return ids[ids.length - 1];
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contract-08c86b2618.sol


pragma solidity ^0.8.9;








/// @custom:security-contact [email protected]
contract DUKET is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, ERC20Permit, ERC20Votes, ERC20FlashMint {
    constructor() ERC20("DUKET", "DUK") ERC20Permit("DUKET") {
        _mint(msg.sender, 1000000000 * 10 ** decimals());
    }

    function snapshot() public onlyOwner {
        _snapshot();
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Snapshot)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Snapshot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"snapshotId","type":"uint256"}],"name":"balanceOfAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrower","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"snapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"uint256","name":"snapshotId","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b506040518060400160405280600581526020017f44554b4554000000000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f44554b45540000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f44554b00000000000000000000000000000000000000000000000000000000008152508160039081620000fd919062001235565b5080600490816200010f919062001235565b50505062000132620001266200022b60201b60201c565b6200023360201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200019b818484620002f960201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050506200022533620001fa6200033560201b60201c565b600a620002089190620014ac565b633b9aca00620002199190620014fd565b6200033e60201b60201c565b62001950565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000838383463060405160200162000316959493929190620015b9565b6040516020818303038152906040528051906020012090509392505050565b60006012905090565b6200035582826200035960201b620015391760201c565b5050565b6200037082826200041760201b620015c61760201c565b620003806200058460201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620003ae620005a860201b60201c565b1115620003f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003e9906200169d565b60405180910390fd5b62000411600e620005b260201b6200171c1783620005ca60201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000480906200170f565b60405180910390fd5b6200049d60008383620008d760201b60201c565b8060026000828254620004b1919062001731565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200056491906200176c565b60405180910390a36200058060008383620008f460201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b60008183620005c2919062001731565b905092915050565b6000806000858054905090506000808214620006a5576200060087600184620005f4919062001789565b6200091160201b60201c565b6040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050620006e1565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506200071484868860201c565b925060008211801562000730575043816000015163ffffffff16145b15620007c3576200074c836200092660201b620017321760201c565b6200076c8860018562000760919062001789565b6200091160201b60201c565b60000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620008cd565b866040518060400160405280620007e5436200099460201b6200179d1760201c565b63ffffffff16815260200162000806866200092660201b620017321760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b620008ef838383620009ea60201b620017f01760201c565b505050565b6200090c83838362000ae360201b620018a81760201c565b505050565b60008260005281602060002001905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156200098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000983906200183a565b60405180910390fd5b819050919050565b600063ffffffff8016821115620009e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009d990620018d2565b60405180910390fd5b819050919050565b62000a0283838362000b3360201b620018d31760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000a5e5762000a488262000b3860201b60201c565b62000a5862000b9b60201b60201c565b62000ade565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000aba5762000aa48362000b3860201b60201c565b62000ab462000b9b60201b60201c565b62000add565b62000acb8362000b3860201b60201c565b62000adc8262000b3860201b60201c565b5b5b505050565b62000afb83838362000bbf60201b620018d81760201c565b62000b2e62000b108462000bc460201b60201c565b62000b218462000bc460201b60201c565b8362000c2d60201b60201c565b505050565b505050565b62000b98600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000b8c8362000e5060201b60201c565b62000e9860201b60201c565b50565b62000bbd600662000bb1620005a860201b60201c565b62000e9860201b60201c565b565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000c6a5750600081115b1562000e4b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000d5d5760008062000d04600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000f2460201b620018dd1785620005ca60201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000d52929190620018f4565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000e4a5760008062000df1600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620005b260201b6200171c1785620005ca60201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000e3f929190620018f4565b60405180910390a250505b5b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600062000eaa62000f3c60201b60201c565b90508062000ec18460000162000f5a60201b60201c565b101562000f1f5782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b6000818362000f34919062001789565b905092915050565b600062000f55600862000fad60201b620018f31760201c565b905090565b60008082805490500362000f72576000905062000fa8565b816001838054905062000f86919062001789565b8154811062000f9a5762000f9962001921565b5b906000526020600020015490505b919050565b600081600001549050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200103d57607f821691505b60208210810362001053576200105262000ff5565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620010bd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200107e565b620010c986836200107e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062001116620011106200110a84620010e1565b620010eb565b620010e1565b9050919050565b6000819050919050565b6200113283620010f5565b6200114a62001141826200111d565b8484546200108b565b825550505050565b600090565b6200116162001152565b6200116e81848462001127565b505050565b5b8181101562001196576200118a60008262001157565b60018101905062001174565b5050565b601f821115620011e557620011af8162001059565b620011ba846200106e565b81016020851015620011ca578190505b620011e2620011d9856200106e565b83018262001173565b50505b505050565b600082821c905092915050565b60006200120a60001984600802620011ea565b1980831691505092915050565b6000620012258383620011f7565b9150826002028217905092915050565b620012408262000fbb565b67ffffffffffffffff8111156200125c576200125b62000fc6565b5b62001268825462001024565b620012758282856200119a565b600060209050601f831160018114620012ad576000841562001298578287015190505b620012a4858262001217565b86555062001314565b601f198416620012bd8662001059565b60005b82811015620012e757848901518255600182019150602085019450602081019050620012c0565b8683101562001307578489015162001303601f891682620011f7565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620013aa578086048111156200138257620013816200131c565b5b6001851615620013925780820291505b8081029050620013a2856200134b565b945062001362565b94509492505050565b600082620013c5576001905062001498565b81620013d5576000905062001498565b8160018114620013ee5760028114620013f9576200142f565b600191505062001498565b60ff8411156200140e576200140d6200131c565b5b8360020a9150848211156200142857620014276200131c565b5b5062001498565b5060208310610133831016604e8410600b8410161715620014695782820a9050838111156200146357620014626200131c565b5b62001498565b62001478848484600162001358565b925090508184048111156200149257620014916200131c565b5b81810290505b9392505050565b600060ff82169050919050565b6000620014b982620010e1565b9150620014c6836200149f565b9250620014f57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620013b3565b905092915050565b60006200150a82620010e1565b91506200151783620010e1565b92508282026200152781620010e1565b915082820484148315176200154157620015406200131c565b5b5092915050565b6000819050919050565b6200155d8162001548565b82525050565b6200156e81620010e1565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620015a18262001574565b9050919050565b620015b38162001594565b82525050565b600060a082019050620015d0600083018862001552565b620015df602083018762001552565b620015ee604083018662001552565b620015fd606083018562001563565b6200160c6080830184620015a8565b9695505050505050565b600082825260208201905092915050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b60006200168560308362001616565b9150620016928262001627565b604082019050919050565b60006020820190508181036000830152620016b88162001676565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620016f7601f8362001616565b91506200170482620016bf565b602082019050919050565b600060208201905081810360008301526200172a81620016e8565b9050919050565b60006200173e82620010e1565b91506200174b83620010e1565b92508282019050808211156200176657620017656200131c565b5b92915050565b600060208201905062001783600083018462001563565b92915050565b60006200179682620010e1565b9150620017a383620010e1565b9250828203905081811115620017be57620017bd6200131c565b5b92915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b60006200182260278362001616565b91506200182f82620017c4565b604082019050919050565b60006020820190508181036000830152620018558162001813565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620018ba60268362001616565b9150620018c7826200185c565b604082019050919050565b60006020820190508181036000830152620018ed81620018ab565b9050919050565b60006040820190506200190b600083018562001563565b6200191a602083018462001563565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60805160a05160c05160e0516101005161012051614d56620019a06000396000611e8201526000611ec401526000611ea301526000611dd801526000611e2e01526000611e570152614d566000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063715018a61161011a5780639ab24eb0116100ad578063d505accf1161007c578063d505accf14610638578063d9d98ce414610654578063dd62ed3e14610684578063f1127ed8146106b4578063f2fde38b146106e4576101fb565b80639ab24eb01461058c578063a457c2d7146105bc578063a9059cbb146105ec578063c3cda5201461061c576101fb565b80638e539e8c116100e95780638e539e8c1461050457806395d89b41146105345780639711715a14610552578063981b24d01461055c576101fb565b8063715018a61461049057806379cc67901461049a5780637ecebe00146104b65780638da5cb5b146104e6576101fb565b806342966c68116101925780635cffe9de116101615780635cffe9de146103d0578063613255ab146104005780636fcfff451461043057806370a0823114610460576101fb565b806342966c68146103385780634ee2cd7e14610354578063587cde1e146103845780635c19a95c146103b4576101fb565b8063313ce567116101ce578063313ce5671461029c5780633644e515146102ba57806339509351146102d85780633a46b1a814610308576101fb565b806306fdde0314610200578063095ea7b31461021e57806318160ddd1461024e57806323b872dd1461026c575b600080fd5b610208610700565b6040516102159190613396565b60405180910390f35b61023860048036038101906102339190613456565b610792565b60405161024591906134b1565b60405180910390f35b6102566107b5565b60405161026391906134db565b60405180910390f35b610286600480360381019061028191906134f6565b6107bf565b60405161029391906134b1565b60405180910390f35b6102a46107ee565b6040516102b19190613565565b60405180910390f35b6102c26107f7565b6040516102cf9190613599565b60405180910390f35b6102f260048036038101906102ed9190613456565b610806565b6040516102ff91906134b1565b60405180910390f35b610322600480360381019061031d9190613456565b61083d565b60405161032f91906134db565b60405180910390f35b610352600480360381019061034d91906135b4565b6108d1565b005b61036e60048036038101906103699190613456565b6108e5565b60405161037b91906134db565b60405180910390f35b61039e600480360381019061039991906135e1565b610955565b6040516103ab919061361d565b60405180910390f35b6103ce60048036038101906103c991906135e1565b6109be565b005b6103ea60048036038101906103e591906136db565b6109d2565b6040516103f791906134b1565b60405180910390f35b61041a600480360381019061041591906135e1565b610bbf565b60405161042791906134db565b60405180910390f35b61044a600480360381019061044591906135e1565b610c36565b6040516104579190613782565b60405180910390f35b61047a600480360381019061047591906135e1565b610c8a565b60405161048791906134db565b60405180910390f35b610498610cd2565b005b6104b460048036038101906104af9190613456565b610ce6565b005b6104d060048036038101906104cb91906135e1565b610d06565b6040516104dd91906134db565b60405180910390f35b6104ee610d56565b6040516104fb919061361d565b60405180910390f35b61051e600480360381019061051991906135b4565b610d80565b60405161052b91906134db565b60405180910390f35b61053c610dd6565b6040516105499190613396565b60405180910390f35b61055a610e68565b005b610576600480360381019061057191906135b4565b610e7b565b60405161058391906134db565b60405180910390f35b6105a660048036038101906105a191906135e1565b610eac565b6040516105b391906134db565b60405180910390f35b6105d660048036038101906105d19190613456565b610fbd565b6040516105e391906134b1565b60405180910390f35b61060660048036038101906106019190613456565b611034565b60405161061391906134b1565b60405180910390f35b610636600480360381019061063191906137f5565b611057565b005b610652600480360381019061064d9190613882565b61115b565b005b61066e60048036038101906106699190613456565b61129d565b60405161067b91906134db565b60405180910390f35b61069e60048036038101906106999190613924565b61131f565b6040516106ab91906134db565b60405180910390f35b6106ce60048036038101906106c99190613990565b6113a6565b6040516106db9190613a45565b60405180910390f35b6106fe60048036038101906106f991906135e1565b6114b6565b005b60606003805461070f90613a8f565b80601f016020809104026020016040519081016040528092919081815260200182805461073b90613a8f565b80156107885780601f1061075d57610100808354040283529160200191610788565b820191906000526020600020905b81548152906001019060200180831161076b57829003601f168201915b5050505050905090565b60008061079d611901565b90506107aa818585611909565b600191505092915050565b6000600254905090565b6000806107ca611901565b90506107d7858285611ad2565b6107e2858585611b5e565b60019150509392505050565b60006012905090565b6000610801611dd4565b905090565b600080610811611901565b9050610832818585610823858961131f565b61082d9190613aef565b611909565b600191505092915050565b6000438210610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890613b6f565b60405180910390fd5b6108c9600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611eee565b905092915050565b6108e26108dc611901565b8261203f565b50565b600080600061093284600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061204d565b91509150816109495761094485610c8a565b61094b565b805b9250505092915050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109cf6109c9611901565b82612142565b50565b60006109dd85610bbf565b841115610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1690613c01565b60405180910390fd5b6000610a2b868661129d565b9050610a37878661225c565b7f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd98773ffffffffffffffffffffffffffffffffffffffff166323e30c8b338989868a8a6040518763ffffffff1660e01b8152600401610a9b96959493929190613c6e565b6020604051808303816000875af1158015610aba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ade9190613cdf565b14610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1590613d7e565b60405180910390fd5b6000610b2861226a565b9050610b4088308489610b3b9190613aef565b611ad2565b6000821480610b7b5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b15610b9a57610b95888388610b909190613aef565b61203f565b610bb0565b610ba4888761203f565b610baf888284611b5e565b5b60019250505095945050505050565b60003073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610bfb576000610c2f565b610c036107b5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610c2e9190613d9e565b5b9050919050565b6000610c83600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061179d565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610cda61226f565b610ce460006122ed565b565b610cf882610cf2611901565b83611ad2565b610d02828261203f565b5050565b6000610d4f600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118f3565b9050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000438210610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90613b6f565b60405180910390fd5b610dcf600e83611eee565b9050919050565b606060048054610de590613a8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1190613a8f565b8015610e5e5780601f10610e3357610100808354040283529160200191610e5e565b820191906000526020600020905b815481529060010190602001808311610e4157829003601f168201915b5050505050905090565b610e7061226f565b610e786123b3565b50565b6000806000610e8b84600661204d565b9150915081610ea157610e9c6107b5565b610ea3565b805b92505050919050565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610f9457600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610f489190613d9e565b81548110610f5957610f58613dd2565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610f97565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b600080610fc8611901565b90506000610fd6828661131f565b90508381101561101b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101290613e73565b60405180910390fd5b6110288286868403611909565b60019250505092915050565b60008061103f611901565b905061104c818585611b5e565b600191505092915050565b8342111561109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109190613edf565b60405180910390fd5b60006110fc6110f47fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8989896040516020016110d99493929190613eff565b60405160208183030381529060405280519060200120612409565b858585612423565b90506111078161244e565b8614611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613f90565b60405180910390fd5b6111528188612142565b50505050505050565b8342111561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590613ffc565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886111cd8c61244e565b896040516020016111e39695949392919061401c565b604051602081830303815290604052805190602001209050600061120682612409565b9050600061121682878787612423565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d906140c9565b60405180910390fd5b6112918a8a8a611909565b50505050505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461130d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130490614135565b60405180910390fd5b61131783836124ac565b905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6113ae6132c8565b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff168154811061140557611404613dd2565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b6114be61226f565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361152d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611524906141c7565b60405180910390fd5b611536816122ed565b50565b61154382826115c6565b61154b6124b4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166115716107b5565b11156115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990614259565b60405180910390fd5b6115c0600e61171c836124d8565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c906142c5565b60405180910390fd5b611641600083836127a7565b80600260008282546116539190613aef565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161170491906134db565b60405180910390a3611718600083836127b7565b5050565b6000818361172a9190613aef565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90614357565b60405180910390fd5b819050919050565b600063ffffffff80168211156117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df906143e9565b60405180910390fd5b819050919050565b6117fb8383836118d3565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361184557611838826127c7565b61184061281a565b6118a3565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361188f57611882836127c7565b61188a61281a565b6118a2565b611898836127c7565b6118a1826127c7565b5b5b505050565b6118b38383836118d8565b6118ce6118bf84610955565b6118c884610955565b8361282e565b505050565b505050565b505050565b600081836118eb9190613d9e565b905092915050565b600081600001549050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196f9061447b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119de9061450d565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ac591906134db565b60405180910390a3505050565b6000611ade848461131f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b585781811015611b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4190614579565b60405180910390fd5b611b578484848403611909565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc49061460b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c339061469d565b60405180910390fd5b611c478383836127a7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc49061472f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611dbb91906134db565b60405180910390a3611dce8484846127b7565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015611e5057507f000000000000000000000000000000000000000000000000000000000000000046145b15611e7d577f00000000000000000000000000000000000000000000000000000000000000009050611eeb565b611ee87f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612a27565b90505b90565b600080838054905090506000808290506005831115611f64576000611f1284612a61565b84611f1d9190613d9e565b905085611f2a8883612b5a565b60000160009054906101000a900463ffffffff1663ffffffff161115611f5257809150611f62565b600181611f5f9190613aef565b92505b505b5b80821015611fc4576000611f798383612b6f565b905085611f868883612b5a565b60000160009054906101000a900463ffffffff1663ffffffff161115611fae57809150611fbe565b600181611fbb9190613aef565b92505b50611f65565b6000811461201357611fe286600183611fdd9190613d9e565b612b5a565b60000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16612016565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b6120498282612b95565b5050565b60008060008411612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a9061479b565b60405180910390fd5b61209b612bb3565b8411156120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d490614807565b60405180910390fd5b60006120f58585600001612bc490919063ffffffff16565b90508360000180549050810361211257600080925092505061213b565b600184600101828154811061212a57612129613dd2565b5b906000526020600020015492509250505b9250929050565b600061214d83610955565b9050600061215a84610c8a565b905082600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461225682848361282e565b50505050565b6122668282611539565b5050565b600090565b612277611901565b73ffffffffffffffffffffffffffffffffffffffff16612295610d56565b73ffffffffffffffffffffffffffffffffffffffff16146122eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e290614873565b60405180910390fd5b565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006123bf6008612c7d565b60006123c9612bb3565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb67816040516123fa91906134db565b60405180910390a18091505090565b600061241c612416611dd4565b83612c93565b9050919050565b600080600061243487878787612cc6565b9150915061244181612da8565b8192505050949350505050565b600080600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061249b816118f3565b91506124a681612c7d565b50919050565b600092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008082146125a757612503876001846124fe9190613d9e565b612b5a565b6040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250506125e3565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935061261884868863ffffffff16565b9250600082118015612633575043816000015163ffffffff16145b156126ad5761264183611732565b612657886001856126529190613d9e565b612b5a565b60000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061279d565b8660405180604001604052806126c24361179d565b63ffffffff1681526020016126d686611732565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b6127b28383836117f0565b505050565b6127c28383836118a8565b505050565b612817600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061281283610c8a565b612f0e565b50565b61282c60066128276107b5565b612f0e565b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561286a5750600081115b15612a2257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612948576000806128f1600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118dd856124d8565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405161293d929190614893565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a21576000806129ca600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061171c856124d8565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612a16929190614893565b60405180910390a250505b5b505050565b60008383834630604051602001612a429594939291906148bc565b6040516020818303038152906040528051906020012090509392505050565b6000808203612a735760009050612b55565b60006001612a8084612f89565b901c6001901b90506001818481612a9a57612a9961490f565b5b048201901c90506001818481612ab357612ab261490f565b5b048201901c90506001818481612acc57612acb61490f565b5b048201901c90506001818481612ae557612ae461490f565b5b048201901c90506001818481612afe57612afd61490f565b5b048201901c90506001818481612b1757612b1661490f565b5b048201901c90506001818481612b3057612b2f61490f565b5b048201901c9050612b5181828581612b4b57612b4a61490f565b5b0461306a565b9150505b919050565b60008260005281602060002001905092915050565b60006002828418612b80919061493e565b828416612b8d9190613aef565b905092915050565b612b9f8282613083565b612bad600e6118dd836124d8565b50505050565b6000612bbf60086118f3565b905090565b600080838054905003612bda5760009050612c77565b600080848054905090505b80821015612c2e576000612bf98383612b6f565b905084612c068783613250565b600001541115612c1857809150612c28565b600181612c259190613aef565b92505b50612be5565b600082118015612c56575083612c5086600185612c4b9190613d9e565b613250565b60000154145b15612c7157600182612c689190613d9e565b92505050612c77565b81925050505b92915050565b6001816000016000828254019250508190555050565b60008282604051602001612ca89291906149e7565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612d01576000600391509150612d9f565b600060018787878760405160008152602001604052604051612d269493929190614a1e565b6020604051602081039080840390855afa158015612d48573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612d9657600060019250925050612d9f565b80600092509250505b94509492505050565b60006004811115612dbc57612dbb614a63565b5b816004811115612dcf57612dce614a63565b5b0315612f0b5760016004811115612de957612de8614a63565b5b816004811115612dfc57612dfb614a63565b5b03612e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3390614ade565b60405180910390fd5b60026004811115612e5057612e4f614a63565b5b816004811115612e6357612e62614a63565b5b03612ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9a90614b4a565b60405180910390fd5b60036004811115612eb757612eb6614a63565b5b816004811115612eca57612ec9614a63565b5b03612f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0190614bdc565b60405180910390fd5b5b50565b6000612f18612bb3565b905080612f2784600001613272565b1015612f845782600001819080600181540180825580915050600190039060005260206000200160009091909190915055826001018290806001815401808255809150506001900390600052602060002001600090919091909150555b505050565b600080600090506000608084901c1115612fab57608083901c92506080810190505b6000604084901c1115612fc657604083901c92506040810190505b6000602084901c1115612fe157602083901c92506020810190505b6000601084901c1115612ffc57601083901c92506010810190505b6000600884901c111561301757600883901c92506008810190505b6000600484901c111561303257600483901c92506004810190505b6000600284901c111561304d57600283901c92506002810190505b6000600184901c1115613061576001810190505b80915050919050565b6000818310613079578161307b565b825b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e990614c6e565b60405180910390fd5b6130fe826000836127a7565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317b90614d00565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161323791906134db565b60405180910390a361324b836000846127b7565b505050565b60008083600052826020600020019050613269816132be565b91505092915050565b60008082805490500361328857600090506132b9565b816001838054905061329a9190613d9e565b815481106132ab576132aa613dd2565b5b906000526020600020015490505b919050565b6000819050919050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b83811015613340578082015181840152602081019050613325565b60008484015250505050565b6000601f19601f8301169050919050565b600061336882613306565b6133728185613311565b9350613382818560208601613322565b61338b8161334c565b840191505092915050565b600060208201905081810360008301526133b0818461335d565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133ed826133c2565b9050919050565b6133fd816133e2565b811461340857600080fd5b50565b60008135905061341a816133f4565b92915050565b6000819050919050565b61343381613420565b811461343e57600080fd5b50565b6000813590506134508161342a565b92915050565b6000806040838503121561346d5761346c6133b8565b5b600061347b8582860161340b565b925050602061348c85828601613441565b9150509250929050565b60008115159050919050565b6134ab81613496565b82525050565b60006020820190506134c660008301846134a2565b92915050565b6134d581613420565b82525050565b60006020820190506134f060008301846134cc565b92915050565b60008060006060848603121561350f5761350e6133b8565b5b600061351d8682870161340b565b935050602061352e8682870161340b565b925050604061353f86828701613441565b9150509250925092565b600060ff82169050919050565b61355f81613549565b82525050565b600060208201905061357a6000830184613556565b92915050565b6000819050919050565b61359381613580565b82525050565b60006020820190506135ae600083018461358a565b92915050565b6000602082840312156135ca576135c96133b8565b5b60006135d884828501613441565b91505092915050565b6000602082840312156135f7576135f66133b8565b5b60006136058482850161340b565b91505092915050565b613617816133e2565b82525050565b6000602082019050613632600083018461360e565b92915050565b6000613643826133e2565b9050919050565b61365381613638565b811461365e57600080fd5b50565b6000813590506136708161364a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261369b5761369a613676565b5b8235905067ffffffffffffffff8111156136b8576136b761367b565b5b6020830191508360018202830111156136d4576136d3613680565b5b9250929050565b6000806000806000608086880312156136f7576136f66133b8565b5b600061370588828901613661565b95505060206137168882890161340b565b945050604061372788828901613441565b935050606086013567ffffffffffffffff811115613748576137476133bd565b5b61375488828901613685565b92509250509295509295909350565b600063ffffffff82169050919050565b61377c81613763565b82525050565b60006020820190506137976000830184613773565b92915050565b6137a681613549565b81146137b157600080fd5b50565b6000813590506137c38161379d565b92915050565b6137d281613580565b81146137dd57600080fd5b50565b6000813590506137ef816137c9565b92915050565b60008060008060008060c08789031215613812576138116133b8565b5b600061382089828a0161340b565b965050602061383189828a01613441565b955050604061384289828a01613441565b945050606061385389828a016137b4565b935050608061386489828a016137e0565b92505060a061387589828a016137e0565b9150509295509295509295565b600080600080600080600060e0888a0312156138a1576138a06133b8565b5b60006138af8a828b0161340b565b97505060206138c08a828b0161340b565b96505060406138d18a828b01613441565b95505060606138e28a828b01613441565b94505060806138f38a828b016137b4565b93505060a06139048a828b016137e0565b92505060c06139158a828b016137e0565b91505092959891949750929550565b6000806040838503121561393b5761393a6133b8565b5b60006139498582860161340b565b925050602061395a8582860161340b565b9150509250929050565b61396d81613763565b811461397857600080fd5b50565b60008135905061398a81613964565b92915050565b600080604083850312156139a7576139a66133b8565b5b60006139b58582860161340b565b92505060206139c68582860161397b565b9150509250929050565b6139d981613763565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b613a10816139df565b82525050565b604082016000820151613a2c60008501826139d0565b506020820151613a3f6020850182613a07565b50505050565b6000604082019050613a5a6000830184613a16565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613aa757607f821691505b602082108103613aba57613ab9613a60565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613afa82613420565b9150613b0583613420565b9250828201905080821115613b1d57613b1c613ac0565b5b92915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000613b59601f83613311565b9150613b6482613b23565b602082019050919050565b60006020820190508181036000830152613b8881613b4c565b9050919050565b7f4552433230466c6173684d696e743a20616d6f756e742065786365656473206d60008201527f6178466c6173684c6f616e000000000000000000000000000000000000000000602082015250565b6000613beb602b83613311565b9150613bf682613b8f565b604082019050919050565b60006020820190508181036000830152613c1a81613bde565b9050919050565b600082825260208201905092915050565b82818337600083830152505050565b6000613c4d8385613c21565b9350613c5a838584613c32565b613c638361334c565b840190509392505050565b600060a082019050613c83600083018961360e565b613c90602083018861360e565b613c9d60408301876134cc565b613caa60608301866134cc565b8181036080830152613cbd818486613c41565b9050979650505050505050565b600081519050613cd9816137c9565b92915050565b600060208284031215613cf557613cf46133b8565b5b6000613d0384828501613cca565b91505092915050565b7f4552433230466c6173684d696e743a20696e76616c69642072657475726e207660008201527f616c756500000000000000000000000000000000000000000000000000000000602082015250565b6000613d68602483613311565b9150613d7382613d0c565b604082019050919050565b60006020820190508181036000830152613d9781613d5b565b9050919050565b6000613da982613420565b9150613db483613420565b9250828203905081811115613dcc57613dcb613ac0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613e5d602583613311565b9150613e6882613e01565b604082019050919050565b60006020820190508181036000830152613e8c81613e50565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000613ec9601d83613311565b9150613ed482613e93565b602082019050919050565b60006020820190508181036000830152613ef881613ebc565b9050919050565b6000608082019050613f14600083018761358a565b613f21602083018661360e565b613f2e60408301856134cc565b613f3b60608301846134cc565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000613f7a601983613311565b9150613f8582613f44565b602082019050919050565b60006020820190508181036000830152613fa981613f6d565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000613fe6601d83613311565b9150613ff182613fb0565b602082019050919050565b6000602082019050818103600083015261401581613fd9565b9050919050565b600060c082019050614031600083018961358a565b61403e602083018861360e565b61404b604083018761360e565b61405860608301866134cc565b61406560808301856134cc565b61407260a08301846134cc565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006140b3601e83613311565b91506140be8261407d565b602082019050919050565b600060208201905081810360008301526140e2816140a6565b9050919050565b7f4552433230466c6173684d696e743a2077726f6e6720746f6b656e0000000000600082015250565b600061411f601b83613311565b915061412a826140e9565b602082019050919050565b6000602082019050818103600083015261414e81614112565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141b1602683613311565b91506141bc82614155565b604082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000614243603083613311565b915061424e826141e7565b604082019050919050565b6000602082019050818103600083015261427281614236565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006142af601f83613311565b91506142ba82614279565b602082019050919050565b600060208201905081810360008301526142de816142a2565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000614341602783613311565b915061434c826142e5565b604082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006143d3602683613311565b91506143de82614377565b604082019050919050565b60006020820190508181036000830152614402816143c6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614465602483613311565b915061447082614409565b604082019050919050565b6000602082019050818103600083015261449481614458565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006144f7602283613311565b91506145028261449b565b604082019050919050565b60006020820190508181036000830152614526816144ea565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000614563601d83613311565b915061456e8261452d565b602082019050919050565b6000602082019050818103600083015261459281614556565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006145f5602583613311565b915061460082614599565b604082019050919050565b60006020820190508181036000830152614624816145e8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614687602383613311565b91506146928261462b565b604082019050919050565b600060208201905081810360008301526146b68161467a565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614719602683613311565b9150614724826146bd565b604082019050919050565b600060208201905081810360008301526147488161470c565b9050919050565b7f4552433230536e617073686f743a206964206973203000000000000000000000600082015250565b6000614785601683613311565b91506147908261474f565b602082019050919050565b600060208201905081810360008301526147b481614778565b9050919050565b7f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000600082015250565b60006147f1601d83613311565b91506147fc826147bb565b602082019050919050565b60006020820190508181036000830152614820816147e4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061485d602083613311565b915061486882614827565b602082019050919050565b6000602082019050818103600083015261488c81614850565b9050919050565b60006040820190506148a860008301856134cc565b6148b560208301846134cc565b9392505050565b600060a0820190506148d1600083018861358a565b6148de602083018761358a565b6148eb604083018661358a565b6148f860608301856134cc565b614905608083018461360e565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061494982613420565b915061495483613420565b9250826149645761496361490f565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006149b060028361496f565b91506149bb8261497a565b600282019050919050565b6000819050919050565b6149e16149dc82613580565b6149c6565b82525050565b60006149f2826149a3565b91506149fe82856149d0565b602082019150614a0e82846149d0565b6020820191508190509392505050565b6000608082019050614a33600083018761358a565b614a406020830186613556565b614a4d604083018561358a565b614a5a606083018461358a565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614ac8601883613311565b9150614ad382614a92565b602082019050919050565b60006020820190508181036000830152614af781614abb565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614b34601f83613311565b9150614b3f82614afe565b602082019050919050565b60006020820190508181036000830152614b6381614b27565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bc6602283613311565b9150614bd182614b6a565b604082019050919050565b60006020820190508181036000830152614bf581614bb9565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c58602183613311565b9150614c6382614bfc565b604082019050919050565b60006020820190508181036000830152614c8781614c4b565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cea602283613311565b9150614cf582614c8e565b604082019050919050565b60006020820190508181036000830152614d1981614cdd565b905091905056fea26469706673582212208e1d2972a61358701d04b448afda29d221044700c030916624af1daae70cc4c964736f6c63430008110033

Deployed ByteCode Sourcemap

128605:1106:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88913:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91264:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90033:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92045:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89875:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;107740:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92749:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110948:268;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;127891:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;123407:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110322:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113834:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;103949:959;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101035:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110078:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90204:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82320:103;;;:::i;:::-;;128301:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;107482:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81672:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;111505:259;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89132:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;128848:67;;;:::i;:::-;;123777:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110534:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93490:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90537:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114030:591;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;106771:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101589:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90793:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109848:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82578:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88913:100;88967:13;89000:5;88993:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88913:100;:::o;91264:201::-;91347:4;91364:13;91380:12;:10;:12::i;:::-;91364:28;;91403:32;91412:5;91419:7;91428:6;91403:8;:32::i;:::-;91453:4;91446:11;;;91264:201;;;;:::o;90033:108::-;90094:7;90121:12;;90114:19;;90033:108;:::o;92045:295::-;92176:4;92193:15;92211:12;:10;:12::i;:::-;92193:30;;92234:38;92250:4;92256:7;92265:6;92234:15;:38::i;:::-;92283:27;92293:4;92299:2;92303:6;92283:9;:27::i;:::-;92328:4;92321:11;;;92045:295;;;;;:::o;89875:93::-;89933:5;89958:2;89951:9;;89875:93;:::o;107740:115::-;107800:7;107827:20;:18;:20::i;:::-;107820:27;;107740:115;:::o;92749:238::-;92837:4;92854:13;92870:12;:10;:12::i;:::-;92854:28;;92893:64;92902:5;92909:7;92946:10;92918:25;92928:5;92935:7;92918:9;:25::i;:::-;:38;;;;:::i;:::-;92893:8;:64::i;:::-;92975:4;92968:11;;;92749:238;;;;:::o;110948:268::-;111046:7;111088:12;111074:11;:26;111066:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;111154:54;111173:12;:21;111186:7;111173:21;;;;;;;;;;;;;;;111196:11;111154:18;:54::i;:::-;111147:61;;110948:268;;;;:::o;127891:91::-;127947:27;127953:12;:10;:12::i;:::-;127967:6;127947:5;:27::i;:::-;127891:91;:::o;123407:266::-;123494:7;123515:16;123533:13;123550:55;123559:10;123571:24;:33;123596:7;123571:33;;;;;;;;;;;;;;;123550:8;:55::i;:::-;123514:91;;;;123625:11;:40;;123647:18;123657:7;123647:9;:18::i;:::-;123625:40;;;123639:5;123625:40;123618:47;;;;123407:266;;;;:::o;110322:128::-;110396:7;110423:10;:19;110434:7;110423:19;;;;;;;;;;;;;;;;;;;;;;;;;110416:26;;110322:128;;;:::o;113834:114::-;113906:34;113916:12;:10;:12::i;:::-;113930:9;113906;:34::i;:::-;113834:114;:::o;103949:959::-;104128:4;104163:19;104176:5;104163:12;:19::i;:::-;104153:6;:29;;104145:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;104241:11;104255:23;104264:5;104271:6;104255:8;:23::i;:::-;104241:37;;104289:32;104303:8;104314:6;104289:5;:32::i;:::-;100772:45;104354:8;:20;;;104375:10;104387:5;104394:6;104402:3;104407:4;;104354:58;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;104332:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;104504:24;104531:19;:17;:19::i;:::-;104504:46;;104561:63;104585:8;104604:4;104620:3;104611:6;:12;;;;:::i;:::-;104561:15;:63::i;:::-;104646:1;104639:3;:8;:42;;;;104679:1;104651:30;;:16;:30;;;104639:42;104635:244;;;104698:38;104712:8;104732:3;104723:6;:12;;;;:::i;:::-;104698:5;:38::i;:::-;104635:244;;;104769:32;104783:8;104794:6;104769:5;:32::i;:::-;104816:51;104834:8;104845:16;104863:3;104816:9;:51::i;:::-;104635:244;104896:4;104889:11;;;;103949:959;;;;;;;:::o;101035:178::-;101110:7;101154:4;101137:22;;:5;:22;;;:68;;101204:1;101137:68;;;101182:19;:17;:19::i;:::-;101162:17;:39;;;;:::i;:::-;101137:68;101130:75;;101035:178;;;:::o;110078:151::-;110148:6;110174:47;110192:12;:21;110205:7;110192:21;;;;;;;;;;;;;;;:28;;;;110174:17;:47::i;:::-;110167:54;;110078:151;;;:::o;90204:127::-;90278:7;90305:9;:18;90315:7;90305:18;;;;;;;;;;;;;;;;90298:25;;90204:127;;;:::o;82320:103::-;81558:13;:11;:13::i;:::-;82385:30:::1;82412:1;82385:18;:30::i;:::-;82320:103::o:0;128301:164::-;128378:46;128394:7;128403:12;:10;:12::i;:::-;128417:6;128378:15;:46::i;:::-;128435:22;128441:7;128450:6;128435:5;:22::i;:::-;128301:164;;:::o;107482:128::-;107551:7;107578:24;:7;:14;107586:5;107578:14;;;;;;;;;;;;;;;:22;:24::i;:::-;107571:31;;107482:128;;;:::o;81672:87::-;81718:7;81745:6;;;;;;;;;;;81738:13;;81672:87;:::o;111505:259::-;111592:7;111634:12;111620:11;:26;111612:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;111700:56;111719:23;111744:11;111700:18;:56::i;:::-;111693:63;;111505:259;;;:::o;89132:104::-;89188:13;89221:7;89214:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89132:104;:::o;128848:67::-;81558:13;:11;:13::i;:::-;128896:11:::1;:9;:11::i;:::-;;128848:67::o:0;123777:234::-;123849:7;123870:16;123888:13;123905:43;123914:10;123926:21;123905:8;:43::i;:::-;123869:79;;;;123968:11;:35;;123990:13;:11;:13::i;:::-;123968:35;;;123982:5;123968:35;123961:42;;;;123777:234;;;:::o;110534:212::-;110607:7;110627:11;110641:12;:21;110654:7;110641:21;;;;;;;;;;;;;;;:28;;;;110627:42;;110694:1;110687:3;:8;:51;;110702:12;:21;110715:7;110702:21;;;;;;;;;;;;;;;110730:1;110724:3;:7;;;;:::i;:::-;110702:30;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;;;;;;;;;110687:51;;;110698:1;110687:51;110680:58;;;;;110534:212;;;:::o;93490:436::-;93583:4;93600:13;93616:12;:10;:12::i;:::-;93600:28;;93639:24;93666:25;93676:5;93683:7;93666:9;:25::i;:::-;93639:52;;93730:15;93710:16;:35;;93702:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;93823:60;93832:5;93839:7;93867:15;93848:16;:34;93823:8;:60::i;:::-;93914:4;93907:11;;;;93490:436;;;;:::o;90537:193::-;90616:4;90633:13;90649:12;:10;:12::i;:::-;90633:28;;90672;90682:5;90689:2;90693:6;90672:9;:28::i;:::-;90718:4;90711:11;;;90537:193;;;;:::o;114030:591::-;114257:6;114238:15;:25;;114230:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;114308:14;114325:174;114353:87;109528:71;114413:9;114424:5;114431:6;114380:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;114370:69;;;;;;114353:16;:87::i;:::-;114455:1;114471;114487;114325:13;:174::i;:::-;114308:191;;114527:17;114537:6;114527:9;:17::i;:::-;114518:5;:26;114510:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;114585:28;114595:6;114603:9;114585;:28::i;:::-;114219:402;114030:591;;;;;;:::o;106771:645::-;107015:8;106996:15;:27;;106988:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;107070:18;105946:95;107130:5;107137:7;107146:5;107153:16;107163:5;107153:9;:16::i;:::-;107171:8;107101:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;107091:90;;;;;;107070:111;;107194:12;107209:28;107226:10;107209:16;:28::i;:::-;107194:43;;107250:14;107267:28;107281:4;107287:1;107290;107293;107267:13;:28::i;:::-;107250:45;;107324:5;107314:15;;:6;:15;;;107306:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;107377:31;107386:5;107393:7;107402:5;107377:8;:31::i;:::-;106977:439;;;106771:645;;;;;;;:::o;101589:219::-;101676:7;101721:4;101704:22;;:5;:22;;;101696:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;101776:24;101786:5;101793:6;101776:9;:24::i;:::-;101769:31;;101589:219;;;;:::o;90793:151::-;90882:7;90909:11;:18;90921:5;90909:18;;;;;;;;;;;;;;;:27;90928:7;90909:27;;;;;;;;;;;;;;;;90902:34;;90793:151;;;;:::o;109848:150::-;109927:17;;:::i;:::-;109964:12;:21;109977:7;109964:21;;;;;;;;;;;;;;;109986:3;109964:26;;;;;;;;;;:::i;:::-;;;;;;;;;109957:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109848:150;;;;:::o;82578:201::-;81558:13;:11;:13::i;:::-;82687:1:::1;82667:22;;:8;:22;;::::0;82659:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;82743:28;82762:8;82743:18;:28::i;:::-;82578:201:::0;:::o;114927:290::-;115012:28;115024:7;115033:6;115012:11;:28::i;:::-;115076:12;:10;:12::i;:::-;115059:29;;:13;:11;:13::i;:::-;:29;;115051:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;115154:55;115171:23;115196:4;115202:6;115154:16;:55::i;:::-;;;114927:290;;:::o;95523:548::-;95626:1;95607:21;;:7;:21;;;95599:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;95677:49;95706:1;95710:7;95719:6;95677:20;:49::i;:::-;95755:6;95739:12;;:22;;;;;;;:::i;:::-;;;;;;;;95932:6;95910:9;:18;95920:7;95910:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;95986:7;95965:37;;95982:1;95965:37;;;95995:6;95965:37;;;;;;:::i;:::-;;;;;;;;96015:48;96043:1;96047:7;96056:6;96015:19;:48::i;:::-;95523:548;;:::o;117880:98::-;117938:7;117969:1;117965;:5;;;;:::i;:::-;117958:12;;117880:98;;;;:::o;5486:195::-;5543:7;5580:17;5571:26;;:5;:26;;5563:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5667:5;5652:21;;5486:195;;;:::o;18322:190::-;18378:6;18414:16;18405:25;;:5;:25;;18397:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;18498:5;18484:20;;18322:190;;;:::o;124228:622::-;124371:44;124398:4;124404:2;124408:6;124371:26;:44::i;:::-;124448:1;124432:18;;:4;:18;;;124428:415;;124488:26;124511:2;124488:22;:26::i;:::-;124529:28;:26;:28::i;:::-;124428:415;;;124593:1;124579:16;;:2;:16;;;124575:268;;124633:28;124656:4;124633:22;:28::i;:::-;124676;:26;:28::i;:::-;124575:268;;;124762:28;124785:4;124762:22;:28::i;:::-;124805:26;124828:2;124805:22;:26::i;:::-;124575:268;124428:415;124228:622;;;:::o;115652:262::-;115794:43;115820:4;115826:2;115830:6;115794:25;:43::i;:::-;115850:56;115867:15;115877:4;115867:9;:15::i;:::-;115884:13;115894:2;115884:9;:13::i;:::-;115899:6;115850:16;:56::i;:::-;115652:262;;;:::o;99241:125::-;;;;:::o;99970:124::-;;;;:::o;117986:103::-;118049:7;118080:1;118076;:5;;;;:::i;:::-;118069:12;;117986:103;;;;:::o;44199:114::-;44264:7;44291;:14;;;44284:21;;44199:114;;;:::o;80217:98::-;80270:7;80297:10;80290:17;;80217:98;:::o;97517:380::-;97670:1;97653:19;;:5;:19;;;97645:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;97751:1;97732:21;;:7;:21;;;97724:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;97835:6;97805:11;:18;97817:5;97805:18;;;;;;;;;;;;;;;:27;97824:7;97805:27;;;;;;;;;;;;;;;:36;;;;97873:7;97857:32;;97866:5;97857:32;;;97882:6;97857:32;;;;;;:::i;:::-;;;;;;;;97517:380;;;:::o;98188:453::-;98323:24;98350:25;98360:5;98367:7;98350:9;:25::i;:::-;98323:52;;98410:17;98390:16;:37;98386:248;;98472:6;98452:16;:26;;98444:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;98556:51;98565:5;98572:7;98600:6;98581:16;:25;98556:8;:51::i;:::-;98386:248;98312:329;98188:453;;;:::o;94396:840::-;94543:1;94527:18;;:4;:18;;;94519:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;94620:1;94606:16;;:2;:16;;;94598:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;94675:38;94696:4;94702:2;94706:6;94675:20;:38::i;:::-;94726:19;94748:9;:15;94758:4;94748:15;;;;;;;;;;;;;;;;94726:37;;94797:6;94782:11;:21;;94774:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;94914:6;94900:11;:20;94882:9;:15;94892:4;94882:15;;;;;;;;;;;;;;;:38;;;;95117:6;95100:9;:13;95110:2;95100:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;95167:2;95152:26;;95161:4;95152:26;;;95171:6;95152:26;;;;;;:::i;:::-;;;;;;;;95191:37;95211:4;95217:2;95221:6;95191:19;:37::i;:::-;94508:728;94396:840;;;:::o;72009:314::-;72062:7;72103:12;72086:29;;72094:4;72086:29;;;:66;;;;;72136:16;72119:13;:33;72086:66;72082:234;;;72176:24;72169:31;;;;72082:234;72240:64;72262:10;72274:12;72288:15;72240:21;:64::i;:::-;72233:71;;72009:314;;:::o;111853:1895::-;111952:7;113053:14;113070:5;:12;;;;113053:29;;113095:11;113121:12;113136:6;113121:21;;113168:1;113159:6;:10;113155:251;;;113186:11;113209:17;113219:6;113209:9;:17::i;:::-;113200:6;:26;;;;:::i;:::-;113186:40;;113283:11;113245:25;113259:5;113266:3;113245:13;:25::i;:::-;:35;;;;;;;;;;;;:49;;;113241:154;;;113322:3;113315:10;;113241:154;;;113378:1;113372:3;:7;;;;:::i;:::-;113366:13;;113241:154;113171:235;113155:251;113418;113431:4;113425:3;:10;113418:251;;;113452:11;113466:23;113479:3;113484:4;113466:12;:23::i;:::-;113452:37;;113546:11;113508:25;113522:5;113529:3;113508:13;:25::i;:::-;:35;;;;;;;;;;;;:49;;;113504:154;;;113585:3;113578:10;;113504:154;;;113641:1;113635:3;:7;;;;:::i;:::-;113629:13;;113504:154;113437:232;113418:251;;;113696:1;113688:4;:9;:52;;113704:30;113718:5;113732:1;113725:4;:8;;;;:::i;:::-;113704:13;:30::i;:::-;:36;;;;;;;;;;;;113688:52;;;113700:1;113688:52;113681:59;;;;;;;111853:1895;;;;:::o;129553:155::-;129672:28;129684:7;129693:6;129672:11;:28::i;:::-;129553:155;;:::o;124858:1619::-;124947:4;124953:7;124994:1;124981:10;:14;124973:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;125055:23;:21;:23::i;:::-;125041:10;:37;;125033:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;126251:13;126267:40;126296:10;126267:9;:13;;:28;;:40;;;;:::i;:::-;126251:56;;126333:9;:13;;:20;;;;126324:5;:29;126320:150;;126378:5;126385:1;126370:17;;;;;;;126320:150;126428:4;126434:9;:16;;126451:5;126434:23;;;;;;;;:::i;:::-;;;;;;;;;;126420:38;;;;;124858:1619;;;;;;:::o;116092:388::-;116177:23;116203:20;116213:9;116203;:20::i;:::-;116177:46;;116234:24;116261:20;116271:9;116261;:20::i;:::-;116234:47;;116316:9;116292:10;:21;116303:9;116292:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;116387:9;116343:54;;116370:15;116343:54;;116359:9;116343:54;;;;;;;;;;;;116410:62;116427:15;116444:9;116455:16;116410;:62::i;:::-;116166:314;;116092:388;;:::o;129400:145::-;129514:23;129526:2;129530:6;129514:11;:23::i;:::-;129400:145;;:::o;102768:105::-;102828:7;102768:105;:::o;81837:132::-;81912:12;:10;:12::i;:::-;81901:23;;:7;:5;:7::i;:::-;:23;;;81893:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;81837:132::o;82939:191::-;83013:16;83032:6;;;;;;;;;;;83013:25;;83058:8;83049:6;;:17;;;;;;;;;;;;;;;;;;83113:8;83082:40;;83103:8;83082:40;;;;;;;;;;;;83002:128;82939:191;:::o;122879:223::-;122926:7;122946:30;:18;:28;:30::i;:::-;122989:17;123009:23;:21;:23::i;:::-;122989:43;;123048:19;123057:9;123048:19;;;;;;:::i;:::-;;;;;;;;123085:9;123078:16;;;122879:223;:::o;73236:167::-;73313:7;73340:55;73362:20;:18;:20::i;:::-;73384:10;73340:21;:55::i;:::-;73333:62;;73236:167;;;:::o;66876:279::-;67004:7;67025:17;67044:18;67066:25;67077:4;67083:1;67086;67089;67066:10;:25::i;:::-;67024:67;;;;67102:18;67114:5;67102:11;:18::i;:::-;67138:9;67131:16;;;;66876:279;;;;;;:::o;107993:207::-;108053:15;108081:30;108114:7;:14;108122:5;108114:14;;;;;;;;;;;;;;;108081:47;;108149:15;:5;:13;:15::i;:::-;108139:25;;108175:17;:5;:15;:17::i;:::-;108070:130;107993:207;;;:::o;102207:234::-;102288:7;102207:234;;;;:::o;114728:105::-;114781:7;114808:17;114801:24;;114728:105;:::o;117139:733::-;117313:17;117332;117362:11;117376:5;:12;;;;117362:26;;117401:25;117436:1;117429:3;:8;:59;;117459:29;117473:5;117486:1;117480:3;:7;;;;:::i;:::-;117459:13;:29::i;:::-;117429:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117440:16;;;;;;;;117451:1;117440:16;;;;;;117454:1;117440:16;;;;;117429:59;117401:87;;117513:7;:13;;;117501:25;;;;117549:20;117552:9;117563:5;117549:2;:20;;:::i;:::-;117537:32;;117592:1;117586:3;:7;:44;;;;;117618:12;117597:7;:17;;;:33;;;117586:44;117582:283;;;117685:29;117704:9;117685:18;:29::i;:::-;117647;117661:5;117674:1;117668:3;:7;;;;:::i;:::-;117647:13;:29::i;:::-;:35;;;:67;;;;;;;;;;;;;;;;;;117582:283;;;117747:5;117758:94;;;;;;;;117781:31;117799:12;117781:17;:31::i;:::-;117758:94;;;;;;117821:29;117840:9;117821:18;:29::i;:::-;117758:94;;;;;117747:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117582:283;117351:521;;117139:733;;;;;;:::o;128993:198::-;129139:44;129166:4;129172:2;129176:6;129139:26;:44::i;:::-;128993:198;;;:::o;129199:193::-;129341:43;129367:4;129373:2;129377:6;129341:25;:43::i;:::-;129199:193;;;:::o;126485:146::-;126553:70;126569:24;:33;126594:7;126569:33;;;;;;;;;;;;;;;126604:18;126614:7;126604:9;:18::i;:::-;126553:15;:70::i;:::-;126485:146;:::o;126639:118::-;126696:53;126712:21;126735:13;:11;:13::i;:::-;126696:15;:53::i;:::-;126639:118::o;116488:643::-;116620:3;116613:10;;:3;:10;;;;:24;;;;;116636:1;116627:6;:10;116613:24;116609:515;;;116673:1;116658:17;;:3;:17;;;116654:224;;116697:17;116716;116737:54;116754:12;:17;116767:3;116754:17;;;;;;;;;;;;;;;116773:9;116784:6;116737:16;:54::i;:::-;116696:95;;;;116836:3;116815:47;;;116841:9;116852;116815:47;;;;;;;:::i;:::-;;;;;;;;116677:201;;116654:224;116913:1;116898:17;;:3;:17;;;116894:219;;116937:17;116956;116977:49;116994:12;:17;117007:3;116994:17;;;;;;;;;;;;;;;117013:4;117019:6;116977:16;:49::i;:::-;116936:90;;;;117071:3;117050:47;;;117076:9;117087;117050:47;;;;;;;:::i;:::-;;;;;;;;116917:196;;116894:219;116609:515;116488:643;;;:::o;72331:263::-;72475:7;72523:8;72533;72543:11;72556:13;72579:4;72512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72502:84;;;;;;72495:91;;72331:263;;;;;:::o;51260:1673::-;51308:7;51337:1;51332;:6;51328:47;;51362:1;51355:8;;;;51328:47;52066:14;52100:1;52089:7;52094:1;52089:4;:7::i;:::-;:12;;52083:1;:19;;52066:36;;52568:1;52557:6;52553:1;:10;;;;;:::i;:::-;;;52544:6;:19;52543:26;;52534:35;;52618:1;52607:6;52603:1;:10;;;;;:::i;:::-;;;52594:6;:19;52593:26;;52584:35;;52668:1;52657:6;52653:1;:10;;;;;:::i;:::-;;;52644:6;:19;52643:26;;52634:35;;52718:1;52707:6;52703:1;:10;;;;;:::i;:::-;;;52694:6;:19;52693:26;;52684:35;;52768:1;52757:6;52753:1;:10;;;;;:::i;:::-;;;52744:6;:19;52743:26;;52734:35;;52818:1;52807:6;52803:1;:10;;;;;:::i;:::-;;;52794:6;:19;52793:26;;52784:35;;52868:1;52857:6;52853:1;:10;;;;;:::i;:::-;;;52844:6;:19;52843:26;;52834:35;;52891:23;52895:6;52907;52903:1;:10;;;;;:::i;:::-;;;52891:3;:23::i;:::-;52884:30;;;51260:1673;;;;:::o;118097:244::-;118183:25;118255:10;118252:1;118245:21;118319:3;118312:4;118309:1;118299:18;118295:28;118280:43;;118097:244;;;;:::o;45661:156::-;45723:7;45808:1;45803;45799;:5;45798:11;;;;:::i;:::-;45793:1;45789;:5;45788:21;;;;:::i;:::-;45781:28;;45661:156;;;;:::o;115311:194::-;115396:28;115408:7;115417:6;115396:11;:28::i;:::-;115437:60;115454:23;115479:9;115490:6;115437:16;:60::i;:::-;;;115311:194;;:::o;123168:127::-;123232:7;123259:28;:18;:26;:28::i;:::-;123252:35;;123168:127;:::o;76914:958::-;77003:7;77043:1;77027:5;:12;;;;:17;77023:58;;77068:1;77061:8;;;;77023:58;77093:11;77119:12;77134:5;:12;;;;77119:27;;77159:444;77172:4;77166:3;:10;77159:444;;;77193:11;77207:23;77220:3;77225:4;77207:12;:23::i;:::-;77193:37;;77484:7;77451:24;77464:5;77471:3;77451:12;:24::i;:::-;:30;;;:40;77447:145;;;77519:3;77512:10;;77447:145;;;77575:1;77569:3;:7;;;;:::i;:::-;77563:13;;77447:145;77178:425;77159:444;;;77729:1;77723:3;:7;:56;;;;;77772:7;77734:28;77747:5;77760:1;77754:3;:7;;;;:::i;:::-;77734:12;:28::i;:::-;:34;;;:45;77723:56;77719:146;;;77809:1;77803:3;:7;;;;:::i;:::-;77796:14;;;;;;77719:146;77850:3;77843:10;;;;76914:958;;;;;:::o;44321:127::-;44428:1;44410:7;:14;;;:19;;;;;;;;;;;44321:127;:::o;68567:196::-;68660:7;68726:15;68743:10;68697:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68687:68;;;;;;68680:75;;68567:196;;;;:::o;65217:1520::-;65348:7;65357:12;66282:66;66277:1;66269:10;;:79;66265:163;;;66381:1;66385:30;66365:51;;;;;;66265:163;66525:14;66542:24;66552:4;66558:1;66561;66564;66542:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66525:41;;66599:1;66581:20;;:6;:20;;;66577:103;;66634:1;66638:29;66618:50;;;;;;;66577:103;66700:6;66708:20;66692:37;;;;;65217:1520;;;;;;;;:::o;60609:521::-;60687:20;60678:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;60674:449;60724:7;60674:449;60785:29;60776:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;60772:351;;60831:34;;;;;;;;;;:::i;:::-;;;;;;;;60772:351;60896:35;60887:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;60883:240;;60948:41;;;;;;;;;;:::i;:::-;;;;;;;;60883:240;61020:30;61011:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;61007:116;;61067:44;;;;;;;;;;:::i;:::-;;;;;;;;61007:116;60609:521;;:::o;126765:310::-;126860:17;126880:23;:21;:23::i;:::-;126860:43;;126951:9;126918:30;126934:9;:13;;126918:15;:30::i;:::-;:42;126914:154;;;126977:9;:13;;126996:9;126977:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;127021:9;:16;;127043:12;127021:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;126914:154;126849:226;126765:310;;:::o;53410:1019::-;53462:7;53482:14;53499:1;53482:18;;53555:1;53549:3;53540:5;:12;;:16;53536:102;;;53587:3;53577:13;;;;;53619:3;53609:13;;;;53536:102;53670:1;53665:2;53656:5;:11;;:15;53652:99;;;53702:2;53692:12;;;;;53733:2;53723:12;;;;53652:99;53783:1;53778:2;53769:5;:11;;:15;53765:99;;;53815:2;53805:12;;;;;53846:2;53836:12;;;;53765:99;53896:1;53891:2;53882:5;:11;;:15;53878:99;;;53928:2;53918:12;;;;;53959:2;53949:12;;;;53878:99;54008:1;54004;53995:5;:10;;:14;53991:96;;;54040:1;54030:11;;;;;54070:1;54060:11;;;;53991:96;54118:1;54114;54105:5;:10;;:14;54101:96;;;54150:1;54140:11;;;;;54180:1;54170:11;;;;54101:96;54228:1;54224;54215:5;:10;;:14;54211:96;;;54260:1;54250:11;;;;;54290:1;54280:11;;;;54211:96;54338:1;54334;54325:5;:10;;:14;54321:66;;;54370:1;54360:11;;;;54321:66;54415:6;54408:13;;;53410:1019;;;:::o;45436:106::-;45494:7;45525:1;45521;:5;:13;;45533:1;45521:13;;;45529:1;45521:13;45514:20;;45436:106;;;;:::o;96404:675::-;96507:1;96488:21;;:7;:21;;;96480:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;96560:49;96581:7;96598:1;96602:6;96560:20;:49::i;:::-;96622:22;96647:9;:18;96657:7;96647:18;;;;;;;;;;;;;;;;96622:43;;96702:6;96684:14;:24;;96676:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;96821:6;96804:14;:23;96783:9;:18;96793:7;96783:18;;;;;;;;;;;;;;;:44;;;;96938:6;96922:12;;:22;;;;;;;;;;;96999:1;96973:37;;96982:7;96973:37;;;97003:6;96973:37;;;;;;:::i;:::-;;;;;;;;97023:48;97043:7;97060:1;97064:6;97023:19;:48::i;:::-;96469:610;96404:675;;:::o;79183:342::-;79264:31;79308:12;79409:8;79406:1;79399:19;79464:3;79457:4;79454:1;79444:18;79440:28;79432:36;;79496:21;:4;:19;:21::i;:::-;79489:28;;;79183:342;;;;:::o;127083:212::-;127153:7;127191:1;127177:3;:10;;;;:15;127173:115;;127216:1;127209:8;;;;127173:115;127257:3;127274:1;127261:3;:10;;;;:14;;;;:::i;:::-;127257:19;;;;;;;;:::i;:::-;;;;;;;;;;127250:26;;127083:212;;;;:::o;76002:195::-;76063:21;76175:4;76165:14;;76002:195;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:77::-;4890:7;4919:5;4908:16;;4853:77;;;:::o;4936:118::-;5023:24;5041:5;5023:24;:::i;:::-;5018:3;5011:37;4936:118;;:::o;5060:222::-;5153:4;5191:2;5180:9;5176:18;5168:26;;5204:71;5272:1;5261:9;5257:17;5248:6;5204:71;:::i;:::-;5060:222;;;;:::o;5288:329::-;5347:6;5396:2;5384:9;5375:7;5371:23;5367:32;5364:119;;;5402:79;;:::i;:::-;5364:119;5522:1;5547:53;5592:7;5583:6;5572:9;5568:22;5547:53;:::i;:::-;5537:63;;5493:117;5288:329;;;;:::o;5623:::-;5682:6;5731:2;5719:9;5710:7;5706:23;5702:32;5699:119;;;5737:79;;:::i;:::-;5699:119;5857:1;5882:53;5927:7;5918:6;5907:9;5903:22;5882:53;:::i;:::-;5872:63;;5828:117;5623:329;;;;:::o;5958:118::-;6045:24;6063:5;6045:24;:::i;:::-;6040:3;6033:37;5958:118;;:::o;6082:222::-;6175:4;6213:2;6202:9;6198:18;6190:26;;6226:71;6294:1;6283:9;6279:17;6270:6;6226:71;:::i;:::-;6082:222;;;;:::o;6310:124::-;6375:7;6404:24;6422:5;6404:24;:::i;:::-;6393:35;;6310:124;;;:::o;6440:178::-;6541:52;6587:5;6541:52;:::i;:::-;6534:5;6531:63;6521:91;;6608:1;6605;6598:12;6521:91;6440:178;:::o;6624:195::-;6698:5;6736:6;6723:20;6714:29;;6752:61;6807:5;6752:61;:::i;:::-;6624:195;;;;:::o;6825:117::-;6934:1;6931;6924:12;6948:117;7057:1;7054;7047:12;7071:117;7180:1;7177;7170:12;7207:552;7264:8;7274:6;7324:3;7317:4;7309:6;7305:17;7301:27;7291:122;;7332:79;;:::i;:::-;7291:122;7445:6;7432:20;7422:30;;7475:18;7467:6;7464:30;7461:117;;;7497:79;;:::i;:::-;7461:117;7611:4;7603:6;7599:17;7587:29;;7665:3;7657:4;7649:6;7645:17;7635:8;7631:32;7628:41;7625:128;;;7672:79;;:::i;:::-;7625:128;7207:552;;;;;:::o;7765:1019::-;7890:6;7898;7906;7914;7922;7971:3;7959:9;7950:7;7946:23;7942:33;7939:120;;;7978:79;;:::i;:::-;7939:120;8098:1;8123:81;8196:7;8187:6;8176:9;8172:22;8123:81;:::i;:::-;8113:91;;8069:145;8253:2;8279:53;8324:7;8315:6;8304:9;8300:22;8279:53;:::i;:::-;8269:63;;8224:118;8381:2;8407:53;8452:7;8443:6;8432:9;8428:22;8407:53;:::i;:::-;8397:63;;8352:118;8537:2;8526:9;8522:18;8509:32;8568:18;8560:6;8557:30;8554:117;;;8590:79;;:::i;:::-;8554:117;8703:64;8759:7;8750:6;8739:9;8735:22;8703:64;:::i;:::-;8685:82;;;;8480:297;7765:1019;;;;;;;;:::o;8790:93::-;8826:7;8866:10;8859:5;8855:22;8844:33;;8790:93;;;:::o;8889:115::-;8974:23;8991:5;8974:23;:::i;:::-;8969:3;8962:36;8889:115;;:::o;9010:218::-;9101:4;9139:2;9128:9;9124:18;9116:26;;9152:69;9218:1;9207:9;9203:17;9194:6;9152:69;:::i;:::-;9010:218;;;;:::o;9234:118::-;9305:22;9321:5;9305:22;:::i;:::-;9298:5;9295:33;9285:61;;9342:1;9339;9332:12;9285:61;9234:118;:::o;9358:135::-;9402:5;9440:6;9427:20;9418:29;;9456:31;9481:5;9456:31;:::i;:::-;9358:135;;;;:::o;9499:122::-;9572:24;9590:5;9572:24;:::i;:::-;9565:5;9562:35;9552:63;;9611:1;9608;9601:12;9552:63;9499:122;:::o;9627:139::-;9673:5;9711:6;9698:20;9689:29;;9727:33;9754:5;9727:33;:::i;:::-;9627:139;;;;:::o;9772:1053::-;9874:6;9882;9890;9898;9906;9914;9963:3;9951:9;9942:7;9938:23;9934:33;9931:120;;;9970:79;;:::i;:::-;9931:120;10090:1;10115:53;10160:7;10151:6;10140:9;10136:22;10115:53;:::i;:::-;10105:63;;10061:117;10217:2;10243:53;10288:7;10279:6;10268:9;10264:22;10243:53;:::i;:::-;10233:63;;10188:118;10345:2;10371:53;10416:7;10407:6;10396:9;10392:22;10371:53;:::i;:::-;10361:63;;10316:118;10473:2;10499:51;10542:7;10533:6;10522:9;10518:22;10499:51;:::i;:::-;10489:61;;10444:116;10599:3;10626:53;10671:7;10662:6;10651:9;10647:22;10626:53;:::i;:::-;10616:63;;10570:119;10728:3;10755:53;10800:7;10791:6;10780:9;10776:22;10755:53;:::i;:::-;10745:63;;10699:119;9772:1053;;;;;;;;:::o;10831:1199::-;10942:6;10950;10958;10966;10974;10982;10990;11039:3;11027:9;11018:7;11014:23;11010:33;11007:120;;;11046:79;;:::i;:::-;11007:120;11166:1;11191:53;11236:7;11227:6;11216:9;11212:22;11191:53;:::i;:::-;11181:63;;11137:117;11293:2;11319:53;11364:7;11355:6;11344:9;11340:22;11319:53;:::i;:::-;11309:63;;11264:118;11421:2;11447:53;11492:7;11483:6;11472:9;11468:22;11447:53;:::i;:::-;11437:63;;11392:118;11549:2;11575:53;11620:7;11611:6;11600:9;11596:22;11575:53;:::i;:::-;11565:63;;11520:118;11677:3;11704:51;11747:7;11738:6;11727:9;11723:22;11704:51;:::i;:::-;11694:61;;11648:117;11804:3;11831:53;11876:7;11867:6;11856:9;11852:22;11831:53;:::i;:::-;11821:63;;11775:119;11933:3;11960:53;12005:7;11996:6;11985:9;11981:22;11960:53;:::i;:::-;11950:63;;11904:119;10831:1199;;;;;;;;;;:::o;12036:474::-;12104:6;12112;12161:2;12149:9;12140:7;12136:23;12132:32;12129:119;;;12167:79;;:::i;:::-;12129:119;12287:1;12312:53;12357:7;12348:6;12337:9;12333:22;12312:53;:::i;:::-;12302:63;;12258:117;12414:2;12440:53;12485:7;12476:6;12465:9;12461:22;12440:53;:::i;:::-;12430:63;;12385:118;12036:474;;;;;:::o;12516:120::-;12588:23;12605:5;12588:23;:::i;:::-;12581:5;12578:34;12568:62;;12626:1;12623;12616:12;12568:62;12516:120;:::o;12642:137::-;12687:5;12725:6;12712:20;12703:29;;12741:32;12767:5;12741:32;:::i;:::-;12642:137;;;;:::o;12785:472::-;12852:6;12860;12909:2;12897:9;12888:7;12884:23;12880:32;12877:119;;;12915:79;;:::i;:::-;12877:119;13035:1;13060:53;13105:7;13096:6;13085:9;13081:22;13060:53;:::i;:::-;13050:63;;13006:117;13162:2;13188:52;13232:7;13223:6;13212:9;13208:22;13188:52;:::i;:::-;13178:62;;13133:117;12785:472;;;;;:::o;13263:105::-;13338:23;13355:5;13338:23;:::i;:::-;13333:3;13326:36;13263:105;;:::o;13374:142::-;13411:7;13451:58;13444:5;13440:70;13429:81;;13374:142;;;:::o;13522:108::-;13599:24;13617:5;13599:24;:::i;:::-;13594:3;13587:37;13522:108;;:::o;13704:517::-;13857:4;13852:3;13848:14;13949:4;13942:5;13938:16;13932:23;13968:61;14023:4;14018:3;14014:14;14000:12;13968:61;:::i;:::-;13872:167;14122:4;14115:5;14111:16;14105:23;14141:63;14198:4;14193:3;14189:14;14175:12;14141:63;:::i;:::-;14049:165;13826:395;13704:517;;:::o;14227:334::-;14376:4;14414:2;14403:9;14399:18;14391:26;;14427:127;14551:1;14540:9;14536:17;14527:6;14427:127;:::i;:::-;14227:334;;;;:::o;14567:180::-;14615:77;14612:1;14605:88;14712:4;14709:1;14702:15;14736:4;14733:1;14726:15;14753:320;14797:6;14834:1;14828:4;14824:12;14814:22;;14881:1;14875:4;14871:12;14902:18;14892:81;;14958:4;14950:6;14946:17;14936:27;;14892:81;15020:2;15012:6;15009:14;14989:18;14986:38;14983:84;;15039:18;;:::i;:::-;14983:84;14804:269;14753:320;;;:::o;15079:180::-;15127:77;15124:1;15117:88;15224:4;15221:1;15214:15;15248:4;15245:1;15238:15;15265:191;15305:3;15324:20;15342:1;15324:20;:::i;:::-;15319:25;;15358:20;15376:1;15358:20;:::i;:::-;15353:25;;15401:1;15398;15394:9;15387:16;;15422:3;15419:1;15416:10;15413:36;;;15429:18;;:::i;:::-;15413:36;15265:191;;;;:::o;15462:181::-;15602:33;15598:1;15590:6;15586:14;15579:57;15462:181;:::o;15649:366::-;15791:3;15812:67;15876:2;15871:3;15812:67;:::i;:::-;15805:74;;15888:93;15977:3;15888:93;:::i;:::-;16006:2;16001:3;15997:12;15990:19;;15649:366;;;:::o;16021:419::-;16187:4;16225:2;16214:9;16210:18;16202:26;;16274:9;16268:4;16264:20;16260:1;16249:9;16245:17;16238:47;16302:131;16428:4;16302:131;:::i;:::-;16294:139;;16021:419;;;:::o;16446:230::-;16586:34;16582:1;16574:6;16570:14;16563:58;16655:13;16650:2;16642:6;16638:15;16631:38;16446:230;:::o;16682:366::-;16824:3;16845:67;16909:2;16904:3;16845:67;:::i;:::-;16838:74;;16921:93;17010:3;16921:93;:::i;:::-;17039:2;17034:3;17030:12;17023:19;;16682:366;;;:::o;17054:419::-;17220:4;17258:2;17247:9;17243:18;17235:26;;17307:9;17301:4;17297:20;17293:1;17282:9;17278:17;17271:47;17335:131;17461:4;17335:131;:::i;:::-;17327:139;;17054:419;;;:::o;17479:168::-;17562:11;17596:6;17591:3;17584:19;17636:4;17631:3;17627:14;17612:29;;17479:168;;;;:::o;17653:146::-;17750:6;17745:3;17740;17727:30;17791:1;17782:6;17777:3;17773:16;17766:27;17653:146;;;:::o;17827:314::-;17923:3;17944:70;18007:6;18002:3;17944:70;:::i;:::-;17937:77;;18024:56;18073:6;18068:3;18061:5;18024:56;:::i;:::-;18105:29;18127:6;18105:29;:::i;:::-;18100:3;18096:39;18089:46;;17827:314;;;;;:::o;18147:771::-;18380:4;18418:3;18407:9;18403:19;18395:27;;18432:71;18500:1;18489:9;18485:17;18476:6;18432:71;:::i;:::-;18513:72;18581:2;18570:9;18566:18;18557:6;18513:72;:::i;:::-;18595;18663:2;18652:9;18648:18;18639:6;18595:72;:::i;:::-;18677;18745:2;18734:9;18730:18;18721:6;18677:72;:::i;:::-;18797:9;18791:4;18787:20;18781:3;18770:9;18766:19;18759:49;18825:86;18906:4;18897:6;18889;18825:86;:::i;:::-;18817:94;;18147:771;;;;;;;;;:::o;18924:143::-;18981:5;19012:6;19006:13;18997:22;;19028:33;19055:5;19028:33;:::i;:::-;18924:143;;;;:::o;19073:351::-;19143:6;19192:2;19180:9;19171:7;19167:23;19163:32;19160:119;;;19198:79;;:::i;:::-;19160:119;19318:1;19343:64;19399:7;19390:6;19379:9;19375:22;19343:64;:::i;:::-;19333:74;;19289:128;19073:351;;;;:::o;19430:223::-;19570:34;19566:1;19558:6;19554:14;19547:58;19639:6;19634:2;19626:6;19622:15;19615:31;19430:223;:::o;19659:366::-;19801:3;19822:67;19886:2;19881:3;19822:67;:::i;:::-;19815:74;;19898:93;19987:3;19898:93;:::i;:::-;20016:2;20011:3;20007:12;20000:19;;19659:366;;;:::o;20031:419::-;20197:4;20235:2;20224:9;20220:18;20212:26;;20284:9;20278:4;20274:20;20270:1;20259:9;20255:17;20248:47;20312:131;20438:4;20312:131;:::i;:::-;20304:139;;20031:419;;;:::o;20456:194::-;20496:4;20516:20;20534:1;20516:20;:::i;:::-;20511:25;;20550:20;20568:1;20550:20;:::i;:::-;20545:25;;20594:1;20591;20587:9;20579:17;;20618:1;20612:4;20609:11;20606:37;;;20623:18;;:::i;:::-;20606:37;20456:194;;;;:::o;20656:180::-;20704:77;20701:1;20694:88;20801:4;20798:1;20791:15;20825:4;20822:1;20815:15;20842:224;20982:34;20978:1;20970:6;20966:14;20959:58;21051:7;21046:2;21038:6;21034:15;21027:32;20842:224;:::o;21072:366::-;21214:3;21235:67;21299:2;21294:3;21235:67;:::i;:::-;21228:74;;21311:93;21400:3;21311:93;:::i;:::-;21429:2;21424:3;21420:12;21413:19;;21072:366;;;:::o;21444:419::-;21610:4;21648:2;21637:9;21633:18;21625:26;;21697:9;21691:4;21687:20;21683:1;21672:9;21668:17;21661:47;21725:131;21851:4;21725:131;:::i;:::-;21717:139;;21444:419;;;:::o;21869:179::-;22009:31;22005:1;21997:6;21993:14;21986:55;21869:179;:::o;22054:366::-;22196:3;22217:67;22281:2;22276:3;22217:67;:::i;:::-;22210:74;;22293:93;22382:3;22293:93;:::i;:::-;22411:2;22406:3;22402:12;22395:19;;22054:366;;;:::o;22426:419::-;22592:4;22630:2;22619:9;22615:18;22607:26;;22679:9;22673:4;22669:20;22665:1;22654:9;22650:17;22643:47;22707:131;22833:4;22707:131;:::i;:::-;22699:139;;22426:419;;;:::o;22851:553::-;23028:4;23066:3;23055:9;23051:19;23043:27;;23080:71;23148:1;23137:9;23133:17;23124:6;23080:71;:::i;:::-;23161:72;23229:2;23218:9;23214:18;23205:6;23161:72;:::i;:::-;23243;23311:2;23300:9;23296:18;23287:6;23243:72;:::i;:::-;23325;23393:2;23382:9;23378:18;23369:6;23325:72;:::i;:::-;22851:553;;;;;;;:::o;23410:175::-;23550:27;23546:1;23538:6;23534:14;23527:51;23410:175;:::o;23591:366::-;23733:3;23754:67;23818:2;23813:3;23754:67;:::i;:::-;23747:74;;23830:93;23919:3;23830:93;:::i;:::-;23948:2;23943:3;23939:12;23932:19;;23591:366;;;:::o;23963:419::-;24129:4;24167:2;24156:9;24152:18;24144:26;;24216:9;24210:4;24206:20;24202:1;24191:9;24187:17;24180:47;24244:131;24370:4;24244:131;:::i;:::-;24236:139;;23963:419;;;:::o;24388:179::-;24528:31;24524:1;24516:6;24512:14;24505:55;24388:179;:::o;24573:366::-;24715:3;24736:67;24800:2;24795:3;24736:67;:::i;:::-;24729:74;;24812:93;24901:3;24812:93;:::i;:::-;24930:2;24925:3;24921:12;24914:19;;24573:366;;;:::o;24945:419::-;25111:4;25149:2;25138:9;25134:18;25126:26;;25198:9;25192:4;25188:20;25184:1;25173:9;25169:17;25162:47;25226:131;25352:4;25226:131;:::i;:::-;25218:139;;24945:419;;;:::o;25370:775::-;25603:4;25641:3;25630:9;25626:19;25618:27;;25655:71;25723:1;25712:9;25708:17;25699:6;25655:71;:::i;:::-;25736:72;25804:2;25793:9;25789:18;25780:6;25736:72;:::i;:::-;25818;25886:2;25875:9;25871:18;25862:6;25818:72;:::i;:::-;25900;25968:2;25957:9;25953:18;25944:6;25900:72;:::i;:::-;25982:73;26050:3;26039:9;26035:19;26026:6;25982:73;:::i;:::-;26065;26133:3;26122:9;26118:19;26109:6;26065:73;:::i;:::-;25370:775;;;;;;;;;:::o;26151:180::-;26291:32;26287:1;26279:6;26275:14;26268:56;26151:180;:::o;26337:366::-;26479:3;26500:67;26564:2;26559:3;26500:67;:::i;:::-;26493:74;;26576:93;26665:3;26576:93;:::i;:::-;26694:2;26689:3;26685:12;26678:19;;26337:366;;;:::o;26709:419::-;26875:4;26913:2;26902:9;26898:18;26890:26;;26962:9;26956:4;26952:20;26948:1;26937:9;26933:17;26926:47;26990:131;27116:4;26990:131;:::i;:::-;26982:139;;26709:419;;;:::o;27134:177::-;27274:29;27270:1;27262:6;27258:14;27251:53;27134:177;:::o;27317:366::-;27459:3;27480:67;27544:2;27539:3;27480:67;:::i;:::-;27473:74;;27556:93;27645:3;27556:93;:::i;:::-;27674:2;27669:3;27665:12;27658:19;;27317:366;;;:::o;27689:419::-;27855:4;27893:2;27882:9;27878:18;27870:26;;27942:9;27936:4;27932:20;27928:1;27917:9;27913:17;27906:47;27970:131;28096:4;27970:131;:::i;:::-;27962:139;;27689:419;;;:::o;28114:225::-;28254:34;28250:1;28242:6;28238:14;28231:58;28323:8;28318:2;28310:6;28306:15;28299:33;28114:225;:::o;28345:366::-;28487:3;28508:67;28572:2;28567:3;28508:67;:::i;:::-;28501:74;;28584:93;28673:3;28584:93;:::i;:::-;28702:2;28697:3;28693:12;28686:19;;28345:366;;;:::o;28717:419::-;28883:4;28921:2;28910:9;28906:18;28898:26;;28970:9;28964:4;28960:20;28956:1;28945:9;28941:17;28934:47;28998:131;29124:4;28998:131;:::i;:::-;28990:139;;28717:419;;;:::o;29142:235::-;29282:34;29278:1;29270:6;29266:14;29259:58;29351:18;29346:2;29338:6;29334:15;29327:43;29142:235;:::o;29383:366::-;29525:3;29546:67;29610:2;29605:3;29546:67;:::i;:::-;29539:74;;29622:93;29711:3;29622:93;:::i;:::-;29740:2;29735:3;29731:12;29724:19;;29383:366;;;:::o;29755:419::-;29921:4;29959:2;29948:9;29944:18;29936:26;;30008:9;30002:4;29998:20;29994:1;29983:9;29979:17;29972:47;30036:131;30162:4;30036:131;:::i;:::-;30028:139;;29755:419;;;:::o;30180:181::-;30320:33;30316:1;30308:6;30304:14;30297:57;30180:181;:::o;30367:366::-;30509:3;30530:67;30594:2;30589:3;30530:67;:::i;:::-;30523:74;;30606:93;30695:3;30606:93;:::i;:::-;30724:2;30719:3;30715:12;30708:19;;30367:366;;;:::o;30739:419::-;30905:4;30943:2;30932:9;30928:18;30920:26;;30992:9;30986:4;30982:20;30978:1;30967:9;30963:17;30956:47;31020:131;31146:4;31020:131;:::i;:::-;31012:139;;30739:419;;;:::o;31164:226::-;31304:34;31300:1;31292:6;31288:14;31281:58;31373:9;31368:2;31360:6;31356:15;31349:34;31164:226;:::o;31396:366::-;31538:3;31559:67;31623:2;31618:3;31559:67;:::i;:::-;31552:74;;31635:93;31724:3;31635:93;:::i;:::-;31753:2;31748:3;31744:12;31737:19;;31396:366;;;:::o;31768:419::-;31934:4;31972:2;31961:9;31957:18;31949:26;;32021:9;32015:4;32011:20;32007:1;31996:9;31992:17;31985:47;32049:131;32175:4;32049:131;:::i;:::-;32041:139;;31768:419;;;:::o;32193:225::-;32333:34;32329:1;32321:6;32317:14;32310:58;32402:8;32397:2;32389:6;32385:15;32378:33;32193:225;:::o;32424:366::-;32566:3;32587:67;32651:2;32646:3;32587:67;:::i;:::-;32580:74;;32663:93;32752:3;32663:93;:::i;:::-;32781:2;32776:3;32772:12;32765:19;;32424:366;;;:::o;32796:419::-;32962:4;33000:2;32989:9;32985:18;32977:26;;33049:9;33043:4;33039:20;33035:1;33024:9;33020:17;33013:47;33077:131;33203:4;33077:131;:::i;:::-;33069:139;;32796:419;;;:::o;33221:223::-;33361:34;33357:1;33349:6;33345:14;33338:58;33430:6;33425:2;33417:6;33413:15;33406:31;33221:223;:::o;33450:366::-;33592:3;33613:67;33677:2;33672:3;33613:67;:::i;:::-;33606:74;;33689:93;33778:3;33689:93;:::i;:::-;33807:2;33802:3;33798:12;33791:19;;33450:366;;;:::o;33822:419::-;33988:4;34026:2;34015:9;34011:18;34003:26;;34075:9;34069:4;34065:20;34061:1;34050:9;34046:17;34039:47;34103:131;34229:4;34103:131;:::i;:::-;34095:139;;33822:419;;;:::o;34247:221::-;34387:34;34383:1;34375:6;34371:14;34364:58;34456:4;34451:2;34443:6;34439:15;34432:29;34247:221;:::o;34474:366::-;34616:3;34637:67;34701:2;34696:3;34637:67;:::i;:::-;34630:74;;34713:93;34802:3;34713:93;:::i;:::-;34831:2;34826:3;34822:12;34815:19;;34474:366;;;:::o;34846:419::-;35012:4;35050:2;35039:9;35035:18;35027:26;;35099:9;35093:4;35089:20;35085:1;35074:9;35070:17;35063:47;35127:131;35253:4;35127:131;:::i;:::-;35119:139;;34846:419;;;:::o;35271:179::-;35411:31;35407:1;35399:6;35395:14;35388:55;35271:179;:::o;35456:366::-;35598:3;35619:67;35683:2;35678:3;35619:67;:::i;:::-;35612:74;;35695:93;35784:3;35695:93;:::i;:::-;35813:2;35808:3;35804:12;35797:19;;35456:366;;;:::o;35828:419::-;35994:4;36032:2;36021:9;36017:18;36009:26;;36081:9;36075:4;36071:20;36067:1;36056:9;36052:17;36045:47;36109:131;36235:4;36109:131;:::i;:::-;36101:139;;35828:419;;;:::o;36253:224::-;36393:34;36389:1;36381:6;36377:14;36370:58;36462:7;36457:2;36449:6;36445:15;36438:32;36253:224;:::o;36483:366::-;36625:3;36646:67;36710:2;36705:3;36646:67;:::i;:::-;36639:74;;36722:93;36811:3;36722:93;:::i;:::-;36840:2;36835:3;36831:12;36824:19;;36483:366;;;:::o;36855:419::-;37021:4;37059:2;37048:9;37044:18;37036:26;;37108:9;37102:4;37098:20;37094:1;37083:9;37079:17;37072:47;37136:131;37262:4;37136:131;:::i;:::-;37128:139;;36855:419;;;:::o;37280:222::-;37420:34;37416:1;37408:6;37404:14;37397:58;37489:5;37484:2;37476:6;37472:15;37465:30;37280:222;:::o;37508:366::-;37650:3;37671:67;37735:2;37730:3;37671:67;:::i;:::-;37664:74;;37747:93;37836:3;37747:93;:::i;:::-;37865:2;37860:3;37856:12;37849:19;;37508:366;;;:::o;37880:419::-;38046:4;38084:2;38073:9;38069:18;38061:26;;38133:9;38127:4;38123:20;38119:1;38108:9;38104:17;38097:47;38161:131;38287:4;38161:131;:::i;:::-;38153:139;;37880:419;;;:::o;38305:225::-;38445:34;38441:1;38433:6;38429:14;38422:58;38514:8;38509:2;38501:6;38497:15;38490:33;38305:225;:::o;38536:366::-;38678:3;38699:67;38763:2;38758:3;38699:67;:::i;:::-;38692:74;;38775:93;38864:3;38775:93;:::i;:::-;38893:2;38888:3;38884:12;38877:19;;38536:366;;;:::o;38908:419::-;39074:4;39112:2;39101:9;39097:18;39089:26;;39161:9;39155:4;39151:20;39147:1;39136:9;39132:17;39125:47;39189:131;39315:4;39189:131;:::i;:::-;39181:139;;38908:419;;;:::o;39333:172::-;39473:24;39469:1;39461:6;39457:14;39450:48;39333:172;:::o;39511:366::-;39653:3;39674:67;39738:2;39733:3;39674:67;:::i;:::-;39667:74;;39750:93;39839:3;39750:93;:::i;:::-;39868:2;39863:3;39859:12;39852:19;;39511:366;;;:::o;39883:419::-;40049:4;40087:2;40076:9;40072:18;40064:26;;40136:9;40130:4;40126:20;40122:1;40111:9;40107:17;40100:47;40164:131;40290:4;40164:131;:::i;:::-;40156:139;;39883:419;;;:::o;40308:179::-;40448:31;40444:1;40436:6;40432:14;40425:55;40308:179;:::o;40493:366::-;40635:3;40656:67;40720:2;40715:3;40656:67;:::i;:::-;40649:74;;40732:93;40821:3;40732:93;:::i;:::-;40850:2;40845:3;40841:12;40834:19;;40493:366;;;:::o;40865:419::-;41031:4;41069:2;41058:9;41054:18;41046:26;;41118:9;41112:4;41108:20;41104:1;41093:9;41089:17;41082:47;41146:131;41272:4;41146:131;:::i;:::-;41138:139;;40865:419;;;:::o;41290:182::-;41430:34;41426:1;41418:6;41414:14;41407:58;41290:182;:::o;41478:366::-;41620:3;41641:67;41705:2;41700:3;41641:67;:::i;:::-;41634:74;;41717:93;41806:3;41717:93;:::i;:::-;41835:2;41830:3;41826:12;41819:19;;41478:366;;;:::o;41850:419::-;42016:4;42054:2;42043:9;42039:18;42031:26;;42103:9;42097:4;42093:20;42089:1;42078:9;42074:17;42067:47;42131:131;42257:4;42131:131;:::i;:::-;42123:139;;41850:419;;;:::o;42275:332::-;42396:4;42434:2;42423:9;42419:18;42411:26;;42447:71;42515:1;42504:9;42500:17;42491:6;42447:71;:::i;:::-;42528:72;42596:2;42585:9;42581:18;42572:6;42528:72;:::i;:::-;42275:332;;;;;:::o;42613:664::-;42818:4;42856:3;42845:9;42841:19;42833:27;;42870:71;42938:1;42927:9;42923:17;42914:6;42870:71;:::i;:::-;42951:72;43019:2;43008:9;43004:18;42995:6;42951:72;:::i;:::-;43033;43101:2;43090:9;43086:18;43077:6;43033:72;:::i;:::-;43115;43183:2;43172:9;43168:18;43159:6;43115:72;:::i;:::-;43197:73;43265:3;43254:9;43250:19;43241:6;43197:73;:::i;:::-;42613:664;;;;;;;;:::o;43283:180::-;43331:77;43328:1;43321:88;43428:4;43425:1;43418:15;43452:4;43449:1;43442:15;43469:185;43509:1;43526:20;43544:1;43526:20;:::i;:::-;43521:25;;43560:20;43578:1;43560:20;:::i;:::-;43555:25;;43599:1;43589:35;;43604:18;;:::i;:::-;43589:35;43646:1;43643;43639:9;43634:14;;43469:185;;;;:::o;43660:148::-;43762:11;43799:3;43784:18;;43660:148;;;;:::o;43814:214::-;43954:66;43950:1;43942:6;43938:14;43931:90;43814:214;:::o;44034:400::-;44194:3;44215:84;44297:1;44292:3;44215:84;:::i;:::-;44208:91;;44308:93;44397:3;44308:93;:::i;:::-;44426:1;44421:3;44417:11;44410:18;;44034:400;;;:::o;44440:79::-;44479:7;44508:5;44497:16;;44440:79;;;:::o;44525:157::-;44630:45;44650:24;44668:5;44650:24;:::i;:::-;44630:45;:::i;:::-;44625:3;44618:58;44525:157;;:::o;44688:663::-;44929:3;44951:148;45095:3;44951:148;:::i;:::-;44944:155;;45109:75;45180:3;45171:6;45109:75;:::i;:::-;45209:2;45204:3;45200:12;45193:19;;45222:75;45293:3;45284:6;45222:75;:::i;:::-;45322:2;45317:3;45313:12;45306:19;;45342:3;45335:10;;44688:663;;;;;:::o;45357:545::-;45530:4;45568:3;45557:9;45553:19;45545:27;;45582:71;45650:1;45639:9;45635:17;45626:6;45582:71;:::i;:::-;45663:68;45727:2;45716:9;45712:18;45703:6;45663:68;:::i;:::-;45741:72;45809:2;45798:9;45794:18;45785:6;45741:72;:::i;:::-;45823;45891:2;45880:9;45876:18;45867:6;45823:72;:::i;:::-;45357:545;;;;;;;:::o;45908:180::-;45956:77;45953:1;45946:88;46053:4;46050:1;46043:15;46077:4;46074:1;46067:15;46094:174;46234:26;46230:1;46222:6;46218:14;46211:50;46094:174;:::o;46274:366::-;46416:3;46437:67;46501:2;46496:3;46437:67;:::i;:::-;46430:74;;46513:93;46602:3;46513:93;:::i;:::-;46631:2;46626:3;46622:12;46615:19;;46274:366;;;:::o;46646:419::-;46812:4;46850:2;46839:9;46835:18;46827:26;;46899:9;46893:4;46889:20;46885:1;46874:9;46870:17;46863:47;46927:131;47053:4;46927:131;:::i;:::-;46919:139;;46646:419;;;:::o;47071:181::-;47211:33;47207:1;47199:6;47195:14;47188:57;47071:181;:::o;47258:366::-;47400:3;47421:67;47485:2;47480:3;47421:67;:::i;:::-;47414:74;;47497:93;47586:3;47497:93;:::i;:::-;47615:2;47610:3;47606:12;47599:19;;47258:366;;;:::o;47630:419::-;47796:4;47834:2;47823:9;47819:18;47811:26;;47883:9;47877:4;47873:20;47869:1;47858:9;47854:17;47847:47;47911:131;48037:4;47911:131;:::i;:::-;47903:139;;47630:419;;;:::o;48055:221::-;48195:34;48191:1;48183:6;48179:14;48172:58;48264:4;48259:2;48251:6;48247:15;48240:29;48055:221;:::o;48282:366::-;48424:3;48445:67;48509:2;48504:3;48445:67;:::i;:::-;48438:74;;48521:93;48610:3;48521:93;:::i;:::-;48639:2;48634:3;48630:12;48623:19;;48282:366;;;:::o;48654:419::-;48820:4;48858:2;48847:9;48843:18;48835:26;;48907:9;48901:4;48897:20;48893:1;48882:9;48878:17;48871:47;48935:131;49061:4;48935:131;:::i;:::-;48927:139;;48654:419;;;:::o;49079:220::-;49219:34;49215:1;49207:6;49203:14;49196:58;49288:3;49283:2;49275:6;49271:15;49264:28;49079:220;:::o;49305:366::-;49447:3;49468:67;49532:2;49527:3;49468:67;:::i;:::-;49461:74;;49544:93;49633:3;49544:93;:::i;:::-;49662:2;49657:3;49653:12;49646:19;;49305:366;;;:::o;49677:419::-;49843:4;49881:2;49870:9;49866:18;49858:26;;49930:9;49924:4;49920:20;49916:1;49905:9;49901:17;49894:47;49958:131;50084:4;49958:131;:::i;:::-;49950:139;;49677:419;;;:::o;50102:221::-;50242:34;50238:1;50230:6;50226:14;50219:58;50311:4;50306:2;50298:6;50294:15;50287:29;50102:221;:::o;50329:366::-;50471:3;50492:67;50556:2;50551:3;50492:67;:::i;:::-;50485:74;;50568:93;50657:3;50568:93;:::i;:::-;50686:2;50681:3;50677:12;50670:19;;50329:366;;;:::o;50701:419::-;50867:4;50905:2;50894:9;50890:18;50882:26;;50954:9;50948:4;50944:20;50940:1;50929:9;50925:17;50918:47;50982:131;51108:4;50982:131;:::i;:::-;50974:139;;50701:419;;;:::o

Swarm Source

ipfs://8e1d2972a61358701d04b448afda29d221044700c030916624af1daae70cc4c9
Loading