false
true
0

Contract Address Details

0x4ED8321722ACB984aB6B249C4AE74a58CAD7E4e8

Contract Name
Config
Creator
0xecff74–734e20 at 0x92399b–1ee344
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
34 Transactions
Transfers
0 Transfers
Gas Used
1,294,994
Last Balance Update
25962166
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Config




Optimization enabled
true
Compiler version
v0.8.23+commit.f704f362




Optimization runs
200
EVM Version
paris




Verified at
2024-06-14T19:19:03.855586Z

Constructor Arguments

0x000000000000000000000000ecff74da7b590b733f9a8a08ea6ed31e75734e20

Arg [0] (address) : 0xecff74da7b590b733f9a8a08ea6ed31e75734e20

              

contracts/audited/Config.sol

// SPDX-License-Identifier: UNLICENSED
// ©Copyright, 2023, AlexNa Holdings, Inc, All Rights Reserved

// SAVVA ecosystem environment variables
// by @AlexNa

pragma solidity ^0.8.18;

import "@openzeppelin/contracts/access/Ownable.sol";
import "../interfaces/IConfig.sol";

contract Config is IConfig, Ownable {
    mapping(bytes32 => string) public config;
    mapping(bytes32 => uint256) public configUint;
    mapping(bytes32 => address) public configAddress;

    constructor(address _initialOwner) Ownable(_initialOwner) {
        configUint[bytes32("authorShare")] = 400; // share of the author in the content fund in percents * 100 ( 100 = 1%)
        configUint[bytes32("nftOwnerCut")] = 200; // NFT owner's cut in percents * 100 ( 100 = 1%)
        configUint[bytes32("minContribution")] = 1 ether; // minimum contribution to the content fund in SAVVA tokens
        configUint[bytes32("timeForRound")] = 3 days; // how long is the round of the content fund in seconds
        configUint[bytes32("winnerShare")] = 30; // round prize share of the fund in percents
        configUint[bytes32("minFundToShare")] = 100 ether; // minimum fund to share in SAVVA tokens
        configUint[bytes32("staking_withdraw_delay")] = 14 days; // staking cooldown time in seconds
        configUint[bytes32("contentNFT_mintPrice")] = 10000 ether; // price to mint a content NFT
        configUint[bytes32("sac_min_deposit")] = 10000 ether; // minimum deposit to sac for SAVVA tokens
        configUint[bytes32("patron_payment_period")] = 7 days; // period of patron payments in seconds
        configUint[bytes32("gov_proposal_price")] = 1000 ether; // price to create a proposal

        configAddress[bytes32("contract_savvaToken")] = address(0); // SAVVA token contract
        configAddress[bytes32("contract_randomOracle")] = address(0); // random oracle (0 - no oracle)
        configAddress[bytes32("contract_staking")] = address(0); // Staking contract
        configAddress[bytes32("contract_userProfile")] = address(0); // Staking contract
        configAddress[bytes32("contract_contentNFT")] = address(0); // Content NFT contract
        configAddress[bytes32("contract_contentFund")] = address(0); // Content Fund contract
        configAddress[bytes32("contract_governance")] = address(0); // Governance contract
        configAddress[bytes32("contract_contentRegistry")] = address(0); // Content Registry contract
        configAddress[bytes32("contract_savvaFaucet")] = address(0); // SAVVA Faucet contract
        configAddress[bytes32("contract_nftMarketplace")] = address(0); // NFT Market Place contract
        configAddress[bytes32("contract_promo")] = address(0); // Promo contract
        configAddress[bytes32("contract_buyBurn")] = address(0); // Buy&Burn contract
        configAddress[bytes32("contract_listMarket")] = address(0); // List Market contract
        configAddress[bytes32("contract_authorOfTheMonth")] = address(0); // Author of the Month contract

        // Buy & Burn parameters
        configAddress[bytes32("pulsex_factory")] = address(
            0x29eA7545DEf87022BAdc76323F373EA1e707C523 // Buy&Burn PulseX factory contract
        );
        configAddress[bytes32("WPLS")] = address(
            0xA1077a294dDE1B09bB078844df40758a5D0f9a27 // WETH contract (WPLS)
        );
        configUint[bytes32("pulsex_slippage")] = 10; // slippage tolerance ( reserve/amount min)

        // Minimum staked amounts
        configUint[bytes32("min_staked_to_post")] = 5000 ether; // minimum staked amount to post content
    }

    event ConfigSet(bytes32 key, string value);
    event ConfigUintSet(bytes32 key, uint256 value);
    event ConfigAddressSet(bytes32 key, address value);

    function set(bytes32 key, string memory value) public override {
        require(
            _msgSender() == owner() ||
                _msgSender() == configAddress[bytes32("contract_governance")],
            "Config: caller is not the owner or governance"
        );

        config[key] = value;
        emit ConfigSet(key, value);
    }

    function get(bytes32 key) public view override returns (string memory) {
        return config[key];
    }

    function setUInt(bytes32 key, uint256 value) public override {
        require(
            _msgSender() == owner() ||
                _msgSender() == configAddress[bytes32("contract_governance")],
            "Config: caller is not the owner or governance"
        );

        configUint[key] = value;
        emit ConfigUintSet(key, value);
    }

    function getUInt(bytes32 key) public view override returns (uint256) {
        return configUint[key];
    }

    function setAddr(bytes32 key, address value) public override {
        require(
            _msgSender() == owner() ||
                _msgSender() == configAddress[bytes32("contract_governance")],
            "Config: caller is not the owner or governance"
        );

        configAddress[key] = value;
        emit ConfigAddressSet(key, value);
    }

    function getAddr(bytes32 key) public view override returns (address) {
        return configAddress[key];
    }
}
        

@openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}
          

@openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}
          

contracts/interfaces/IConfig.sol

// SPDX-License-Identifier: UNLICENSED
// ©Copyright, 2023, AlexNa Holdings, Inc, All Rights Reserved

// Config contract interface
// by AlexNa

pragma solidity ^0.8.18;

interface IConfig {
    function get(bytes32 key) external view returns (string memory);

    function getUInt(bytes32 key) external view returns (uint256);

    function getAddr(bytes32 key) external view returns (address);

    function set(bytes32 key, string memory value) external;

    function setUInt(bytes32 key, uint256 value) external;

    function setAddr(bytes32 key, address value) external;
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_initialOwner","internalType":"address"}]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"event","name":"ConfigAddressSet","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32","indexed":false},{"type":"address","name":"value","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ConfigSet","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32","indexed":false},{"type":"string","name":"value","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ConfigUintSet","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"config","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"configAddress","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"configUint","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"get","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getAddr","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getUInt","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"},{"type":"string","name":"value","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAddr","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"},{"type":"address","name":"value","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setUInt","inputs":[{"type":"bytes32","name":"key","internalType":"bytes32"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b5060405161103438038061103483398101604081905261002f91610588565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61006781610538565b50506101907fe82f4dc6acd7163eed06bcb03b7783e1cb7f11cf389fca63170111ab7dba774a5560c87fd6091c3a496137fad5dcf61b9505f5488512cf5043739c41ccfa977231c014bd55670de0b6b3a76400007f603609b2c2bb017d39fc13b1acac7e9071c509508049b9d437d2b8ab9258d21c556203f4807f71af2c92516b5a9cd62fcea203091fd00db25777a829204e681a610d632b4a6155601e7f145c9b183db5871a1f1134e8574bcb81e0c534747ff73e19c8d06fd9031fdf1d5568056bc75e2d631000007f4402a146191f98f03503061e60f4930c614adc376a00e1570929af57d72146c955621275007ff5b377329cf0862e53e74aa2a9e602ebfd867eca8304e2bfb1c79a248287d9a15569021e19e0c9bab24000007f0185a557c2e340e8faca46143badb71fbdd5945f1528a07c8d3e9326e39bbf8d8190557fb3c8adeec1cd709170af8d40afaffa16036d22c2239d1e8db4e6cf130c4d8ea75562093a807f2f342517fbbb18ff068ae91609869ce0255e783d1c23d689b0005f359c34a9f155683635c9adc5dea000007f9705b021a3cac36d6c3a5463937b2a6acdac2d269a436bf547a496e0e4e01b61557f59849912ec13f3e1d95003b4df71a78fdf5ff3f4d56620e488fc4897bc5cd13f80546001600160a01b03199081169091557f75b0e8f1636d6ffce857d19250594fc7652f2284701ca59081ea1bdcbbd0a0b88054821690557ffdcbff1dec12e373b2c8106ba54caf4945fd5e4f7e669856757e6540d41798258054821690557f7bdc2df71ea2f77fdad38621e9c4d4b71849cd396623ce414da88191fd2cb84f8054821690557fd75cf8e0f90f7c4105be3afd8f4fe5683bcacd42c22deefdcb239b788d768f968054821690557f9debec972be40180b8a1a3403915ea069cc5e62d344ad834db2f20dd8afc2c448054821690557f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b211958054821690557fa56d8c8e614d28d9fad2d0fcb06bd8be488f7f9ac3003e6b8821dd637445e3ef8054821690557fb1cedc34c4521f324d7c6a0c5b48484fcb80a050f1036c845f9dc06356a4749e8054821690557f26a9aad8893a1a66a4639a83575abc8189845f077e135ec437b8b761af468ce68054821690557f0dcbe77190c4365155ad352e498042663dd8421f160ff69ab40604b1b672b0f98054821690557f5d57400de72fc973ca563950a2b8dec9078edc813c2fac84a217b1c6d2cb61c28054821690557f9f3baa1b3e0576da46abd0fc48e2a5b38d7c7e2194ef571f2bf65d2904fc749d8054821690557f6d5f6dc3eef010e9dba3350eba24c58ce644701c6e9547e9fc10413ab7ca6c498054821690557f82a5463334d9fc019140882ee41d1c1fc77911c33e0d7a77f984119bb9eee22a805482167329ea7545def87022badc76323f373ea1e707c5231790557fea22e330469ea483c306b6591e13e96cd90083fbb78a104593db5a3d59c0b3ee805490911673a1077a294dde1b09bb078844df40758a5d0f9a271790556002602052600a7f9f72a11af3a1f9ec537ef017bdf7dc30b30e9607c1f9bf6dbf29f9dd359ba50a55711b5a5b97dcdd185ad95917dd1bd7dc1bdcdd60721b60005269010f0cf064dd592000007fc55d7162b5b323ab2b48479c9eb159240586ac4c1a396569f9d52be2f23ccf78556105b8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561059a57600080fd5b81516001600160a01b03811681146105b157600080fd5b9392505050565b610a6d806105c76000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b480003311610071578063b48000331461017b578063cc718f761461018e578063d1497974146101a1578063d5fa2b00146101c1578063f2fde38b146101d4578063f6ab6d99146101e757600080fd5b80634ccee9b6146100b95780635aec6259146100ff5780636ca402aa1461012d578063715018a6146101425780638da5cb5b1461014a5780638eaa6ac01461015b575b600080fd5b6100e26100c73660046106af565b6000908152600360205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b61011f61010d3660046106af565b60009081526002602052604090205490565b6040519081526020016100f6565b61014061013b3660046106c8565b610210565b005b6101406102ef565b6000546001600160a01b03166100e2565b61016e6101693660046106af565b610303565b6040516100f69190610730565b610140610189366004610760565b6103a5565b61016e61019c3660046106af565b610475565b61011f6101af3660046106af565b60026020526000908152604090205481565b6101406101cf366004610837565b61050f565b6101406101e2366004610863565b6105f4565b6100e26101f53660046106af565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061027a575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61029f5760405162461bcd60e51b81526004016102969061087e565b60405180910390fd5b60008281526002602090815260409182902083905581518481529081018390527f6fa0b3b1f0c099a6546524f51cfe670b8d7d2fd04d92b23947bc31f6d6d39d4891015b60405180910390a15050565b6102f7610632565b610301600061065f565b565b6000818152600160205260409020805460609190610320906108cb565b80601f016020809104026020016040519081016040528092919081815260200182805461034c906108cb565b80156103995780601f1061036e57610100808354040283529160200191610399565b820191906000526020600020905b81548152906001019060200180831161037c57829003601f168201915b50505050509050919050565b6000546001600160a01b031633148061040f575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61042b5760405162461bcd60e51b81526004016102969061087e565b60008281526001602052604090206104438282610956565b507ffaa64e5c84378932cdde82210614c85e045b50036f1845d76065b3df58ff642e82826040516102e3929190610a16565b6001602052600090815260409020805461048e906108cb565b80601f01602080910402602001604051908101604052809291908181526020018280546104ba906108cb565b80156105075780601f106104dc57610100808354040283529160200191610507565b820191906000526020600020905b8154815290600101906020018083116104ea57829003601f168201915b505050505081565b6000546001600160a01b0316331480610579575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b6105955760405162461bcd60e51b81526004016102969061087e565b60008281526003602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251858152918201527fc49a1532a3a86c7c2959f79966bf474864dd28e1af8910c0ab29cf86232d870291016102e3565b6105fc610632565b6001600160a01b03811661062657604051631e4fbdf760e01b815260006004820152602401610296565b61062f8161065f565b50565b6000546001600160a01b031633146103015760405163118cdaa760e01b8152336004820152602401610296565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156106c157600080fd5b5035919050565b600080604083850312156106db57600080fd5b50508035926020909101359150565b6000815180845260005b81811015610710576020818501810151868301820152016106f4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061074360208301846106ea565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561077357600080fd5b82359150602083013567ffffffffffffffff8082111561079257600080fd5b818501915085601f8301126107a657600080fd5b8135818111156107b8576107b861074a565b604051601f8201601f19908116603f011681019083821181831017156107e0576107e061074a565b816040528281528860208487010111156107f957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b80356001600160a01b038116811461083257600080fd5b919050565b6000806040838503121561084a57600080fd5b8235915061085a6020840161081b565b90509250929050565b60006020828403121561087557600080fd5b6107438261081b565b6020808252602d908201527f436f6e6669673a2063616c6c6572206973206e6f7420746865206f776e65722060408201526c6f7220676f7665726e616e636560981b606082015260800190565b600181811c908216806108df57607f821691505b6020821081036108ff57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610951576000816000526020600020601f850160051c8101602086101561092e5750805b601f850160051c820191505b8181101561094d5782815560010161093a565b5050505b505050565b815167ffffffffffffffff8111156109705761097061074a565b6109848161097e84546108cb565b84610905565b602080601f8311600181146109b957600084156109a15750858301515b600019600386901b1c1916600185901b17855561094d565b600085815260208120601f198616915b828110156109e8578886015182559484019460019091019084016109c9565b5085821015610a065787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000610a2f60408301846106ea565b94935050505056fea2646970667358221220ee71ceb279011ef432ef88bfb1b895f40ce9162a93be9089ed8ee0f96509fac864736f6c63430008170033000000000000000000000000ecff74da7b590b733f9a8a08ea6ed31e75734e20

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b480003311610071578063b48000331461017b578063cc718f761461018e578063d1497974146101a1578063d5fa2b00146101c1578063f2fde38b146101d4578063f6ab6d99146101e757600080fd5b80634ccee9b6146100b95780635aec6259146100ff5780636ca402aa1461012d578063715018a6146101425780638da5cb5b1461014a5780638eaa6ac01461015b575b600080fd5b6100e26100c73660046106af565b6000908152600360205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020015b60405180910390f35b61011f61010d3660046106af565b60009081526002602052604090205490565b6040519081526020016100f6565b61014061013b3660046106c8565b610210565b005b6101406102ef565b6000546001600160a01b03166100e2565b61016e6101693660046106af565b610303565b6040516100f69190610730565b610140610189366004610760565b6103a5565b61016e61019c3660046106af565b610475565b61011f6101af3660046106af565b60026020526000908152604090205481565b6101406101cf366004610837565b61050f565b6101406101e2366004610863565b6105f4565b6100e26101f53660046106af565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b031633148061027a575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61029f5760405162461bcd60e51b81526004016102969061087e565b60405180910390fd5b60008281526002602090815260409182902083905581518481529081018390527f6fa0b3b1f0c099a6546524f51cfe670b8d7d2fd04d92b23947bc31f6d6d39d4891015b60405180910390a15050565b6102f7610632565b610301600061065f565b565b6000818152600160205260409020805460609190610320906108cb565b80601f016020809104026020016040519081016040528092919081815260200182805461034c906108cb565b80156103995780601f1061036e57610100808354040283529160200191610399565b820191906000526020600020905b81548152906001019060200180831161037c57829003601f168201915b50505050509050919050565b6000546001600160a01b031633148061040f575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b61042b5760405162461bcd60e51b81526004016102969061087e565b60008281526001602052604090206104438282610956565b507ffaa64e5c84378932cdde82210614c85e045b50036f1845d76065b3df58ff642e82826040516102e3929190610a16565b6001602052600090815260409020805461048e906108cb565b80601f01602080910402602001604051908101604052809291908181526020018280546104ba906108cb565b80156105075780601f106104dc57610100808354040283529160200191610507565b820191906000526020600020905b8154815290600101906020018083116104ea57829003601f168201915b505050505081565b6000546001600160a01b0316331480610579575072636f6e74726163745f676f7665726e616e636560681b60005260036020527f042ee08034bb26982bb6bc2ae351e242be55d5d97751300f66df1aee88b21195546001600160a01b0316336001600160a01b0316145b6105955760405162461bcd60e51b81526004016102969061087e565b60008281526003602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251858152918201527fc49a1532a3a86c7c2959f79966bf474864dd28e1af8910c0ab29cf86232d870291016102e3565b6105fc610632565b6001600160a01b03811661062657604051631e4fbdf760e01b815260006004820152602401610296565b61062f8161065f565b50565b6000546001600160a01b031633146103015760405163118cdaa760e01b8152336004820152602401610296565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156106c157600080fd5b5035919050565b600080604083850312156106db57600080fd5b50508035926020909101359150565b6000815180845260005b81811015610710576020818501810151868301820152016106f4565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061074360208301846106ea565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561077357600080fd5b82359150602083013567ffffffffffffffff8082111561079257600080fd5b818501915085601f8301126107a657600080fd5b8135818111156107b8576107b861074a565b604051601f8201601f19908116603f011681019083821181831017156107e0576107e061074a565b816040528281528860208487010111156107f957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b80356001600160a01b038116811461083257600080fd5b919050565b6000806040838503121561084a57600080fd5b8235915061085a6020840161081b565b90509250929050565b60006020828403121561087557600080fd5b6107438261081b565b6020808252602d908201527f436f6e6669673a2063616c6c6572206973206e6f7420746865206f776e65722060408201526c6f7220676f7665726e616e636560981b606082015260800190565b600181811c908216806108df57607f821691505b6020821081036108ff57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610951576000816000526020600020601f850160051c8101602086101561092e5750805b601f850160051c820191505b8181101561094d5782815560010161093a565b5050505b505050565b815167ffffffffffffffff8111156109705761097061074a565b6109848161097e84546108cb565b84610905565b602080601f8311600181146109b957600084156109a15750858301515b600019600386901b1c1916600185901b17855561094d565b600085815260208120601f198616915b828110156109e8578886015182559484019460019091019084016109c9565b5085821015610a065787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201526000610a2f60408301846106ea565b94935050505056fea2646970667358221220ee71ceb279011ef432ef88bfb1b895f40ce9162a93be9089ed8ee0f96509fac864736f6c63430008170033