Contract 0x70c006878a5a50ed185ac4c87d837633923de296 5

 
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x46f218da26ebe95d668d52a1acbd10958bf9f7052f67d4e02b8bf2ded25e947fSafe Transfer(pending)2021-11-30 9:24:071 sec ago0x779657b104e69b9f35cd419fa60dab7e11a8f288 IN 0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC(Pending)
0x2c9bb3e38acb5495773a693723afd187aa9e6a166b26a032702b185acac0e7c3Safe Transfer(pending)2021-11-30 9:24:071 sec ago0xd71ed596d8a74549deddffd8f4560cee261b37eb IN 0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC(Pending)
0xbc0fa121b6b458cf5702da5163bc161b67a6163319b5d802754f2e4f573e8e31Safe Transfer219689002021-11-30 9:23:061 min ago0x68808524f8ab7059d2023e1da57998508eb1bab6 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x2ce69f2c634f7b20d5b7ab513f2e0b8e6b37dc08cb810ed49a981cb5a740ad5aSafe Transfer219688972021-11-30 9:23:001 min ago0xa7bf3d2a20365e7cabf1dd95b58f22deb216b6b6 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x27a53561d2fb190f8a919a48f6ded1a42677563625c20a770067ea1c48ff6ba2Safe Transfer219688932021-11-30 9:22:481 min ago0xf91bd63f341f8a2f13b90a31c472b939226bea3c IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x728937afa8631b83af8043981f87ec14e5f80ed8f8b7233d0180bed90cff9124Safe Transfer219688932021-11-30 9:22:481 min ago0x95cf06f3f4ab34faa8726c198895cdbf2304f201 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x9028ec61931121c65418be49e2f29093a75fa61f9e8b8e3ac26192376cb7d5c9Safe Transfer219688882021-11-30 9:22:381 min ago0x394894133048bd7dc4993e81642236f3ddec5526 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x58e7a505dae9dbe39035f1235a0b8cf50697a93bf56cec24dc263a824429b7b7Safe Transfer219688862021-11-30 9:22:341 min ago0x609111ba0913035ceedf6fe1fd73baf52341402d IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x21ccdf58e93a72ae83da44d7409764af32ed3cccfa8e430b68567fd431b9356eSafe Transfer219688822021-11-30 9:22:261 min ago0xc1a2fc5caeeecde94ee733a92f20fbb519a4c7ff IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0xf46e64fb7091b46afd5971bff14858e0d18a4ccc9913843557a012146963f146Safe Transfer219688802021-11-30 9:22:221 min ago0xb961a821985884b041c2c098b02d84f458a320e6 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00192825
0x1addbc48a7424d9d2b8b76b1c22daec5a96bd460e8d172f36668ffac5e191202Safe Transfer219688802021-11-30 9:22:221 min ago0x5d11e3879410cdd33baef473da9faa5463452b9d IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.001440478
0x294cae2158c62983146cdd12dcc2bfb6180fb7c2acea71d698cf9dc12b63c3f6Safe Transfer219688762021-11-30 9:22:141 min ago0x3a2fad5303f6eaa2bcdd900f0cdced4243160ffc IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0xfbc75f24e6318fda9318bb065567175c9018af4d496dc2001e59e69ef68a5bc1Safe Transfer219688732021-11-30 9:22:082 mins ago0x3b1603c670b60152de6b883a9afbc154f2ee2636 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x1783c08c3b3974c8509610bc16bb809ad675181abb17bd0ec8f1fd0299ab8310Safe Transfer219688722021-11-30 9:22:062 mins ago0x4d880163b79531b88c95675a020fdbdf48338479 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x910b64876e99bdff08e616daf9a25f5f998a3a6e309fe41926ec6d0a97960714Safe Transfer219688702021-11-30 9:22:022 mins ago0x9ea27adbfa272cc8d07e579a051978ebf8cb7acb IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x9b960176ebe5713415c581a400eb2762642b77bb50b828f00d9e95d6bd98e203Safe Transfer219688612021-11-30 9:21:442 mins ago0x804144f3f9162448232c85a1d8708c3996ca75c3 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x09824bd6d03589b9839b00e4f577277bda58987cac3740484ee9b670193fc12dSafe Transfer219688612021-11-30 9:21:442 mins ago0xf436c686e9f438d3521fd0aac797bcbda9efab3e IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00178401
0xfece2961087e3302a8f7220c3525ac756f5cac8e9e322061c1f533f7560f046dSafe Transfer219688602021-11-30 9:21:422 mins ago0x324311246d9b6c6629c4eb10a1a2092b2bf0d427 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0xac0d632cc5cb18c2fd07dd03c63545ddb85601dbac0fe5ee9cd25679ef41c83bSafe Transfer219688572021-11-30 9:21:362 mins ago0x7f326798d3be0a5715e4d4a910f15e25c14861b9 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0xafffdbc8bad304f42b3281a3e82ddcda12607bbda0e53a14e8ca9d2f712383b8Safe Transfer219688552021-11-30 9:21:322 mins ago0x0a296b2758e0b9fe390f0c785d12acd6bcbb87a7 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.002249625
0xc541792c1e7fedb2fece35bc1fa0a189135d3d8374aba95e6fac6c0252b731b3Safe Transfer219688532021-11-30 9:21:282 mins ago0xc948523cd3b435f6238e65a506c5fa4440d22dd5 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x124737a4430b645830043ac30095d942bd33b13bfd6afe74ac235a837a42c81eSafe Transfer219688512021-11-30 9:21:242 mins ago0xa7bf3d2a20365e7cabf1dd95b58f22deb216b6b6 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0x35af3d0af20f59c9d383215f4179c657a1ccb2dcae1242bf93c98aa93b4034a7Safe Transfer219688492021-11-30 9:21:202 mins ago0x7dc845156fa693a2dee95687875f291f2392d5ca IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0xbfdd0fdfc477761d805a5bef461d6a8faa028adae7dc725b8517d36e2f8bb1cdSafe Transfer219688462021-11-30 9:21:142 mins ago0xe01237d5dd903bfac54e9d21342ceeeddef67209 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.00127101
0xe8bcb4e7c235e15c26090e23fa59462d4065265e74d9ae0f11060bcdd4897752Safe Transfer219688402021-11-30 9:21:023 mins ago0x32b7db2bf18e98534791f78731d30760cdb7cc56 IN  0x70c006878a5a50ed185ac4c87d837633923de2960 MATIC0.001398111
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PolygonREVV

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-07-27
*/

// Sources flattened with hardhat v2.4.3 https://hardhat.org

// File @animoca/ethereum-contracts-core-1.1.1/contracts/utils/types/[email protected]

// SPDX-License-Identifier: MIT

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Upgrades the address type to check if it is a contract.
 */
library AddressIsContract {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20Wrapper
 * Wraps ERC20 functions to support non-standard implementations which do not return a bool value.
 * Calls to the wrapped functions revert only if they throw or if they return false.
 */
library ERC20Wrapper {
    using AddressIsContract for address;

    function wrappedTransfer(
        IWrappedERC20 token,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function wrappedTransferFrom(
        IWrappedERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function wrappedApprove(
        IWrappedERC20 token,
        address spender,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal {
        address target = address(token);
        require(target.isContract(), "ERC20Wrapper: non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = target.call(callData);
        if (success) {
            if (data.length != 0) {
                require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed");
            }
        } else {
            // revert using a standard revert message
            if (data.length == 0) {
                revert("ERC20Wrapper: operation failed");
            }

            // revert using the revert message coming from the call
            assembly {
                let size := mload(data)
                revert(add(32, data), size)
            }
        }
    }
}

interface IWrappedERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/metatx/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/*
 * 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.
 */
abstract contract ManagedIdentity {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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


// File @animoca/ethereum-contracts-core-1.1.1/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-173 Contract Ownership Standard
 * Note: the ERC-165 identifier for this interface is 0x7f5828d0
 */
interface IERC173 {
    /**
     * Event emited when ownership of a contract changes.
     * @param previousOwner the previous owner.
     * @param newOwner the new owner.
     */
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * Get the address of the owner
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * Set the address of the new owner of the contract
     * Set newOwner to address(0) to renounce any ownership.
     * @dev Emits an {OwnershipTransferred} event.
     * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership.
     */
    function transferOwnership(address newOwner) external;
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/access/[email protected]

pragma solidity >=0.7.6 <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 ManagedIdentity, IERC173 {
    address internal _owner;

    /**
     * Initializes the contract, setting the deployer as the initial owner.
     * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event.
     */
    constructor(address owner_) {
        _owner = owner_;
        emit OwnershipTransferred(address(0), owner_);
    }

    /**
     * Gets the address of the current contract owner.
     */
    function owner() public view virtual override returns (address) {
        return _owner;
    }

    /**
     * See {IERC173-transferOwnership(address)}
     * @dev Reverts if the sender is not the current contract owner.
     * @param newOwner the address of the new owner. Use the zero address to renounce the ownership.
     */
    function transferOwnership(address newOwner) public virtual override {
        _requireOwnership(_msgSender());
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

    /**
     * @dev Reverts if `account` is not the contract owner.
     * @param account the account to test.
     */
    function _requireOwnership(address account) internal virtual {
        require(account == this.owner(), "Ownable: not the owner");
    }
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;



abstract contract Recoverable is ManagedIdentity, Ownable {
    using ERC20Wrapper for IWrappedERC20;

    /**
     * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens
     * so that the extraction is limited to only amounts sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length.
     * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function.
     * @dev Reverts if one of the ERC20 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param tokens the list of ERC20 token addresses.
     * @param amounts the list of token amounts to transfer.
     */
    function recoverERC20s(
        address[] calldata accounts,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]);
        }
    }

    /**
     * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens
     * so that the extraction is limited to only tokens sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length.
     * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function.
     * @dev Reverts if one of the ERC721 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param contracts the list of ERC721 contract addresses.
     * @param tokenIds the list of token ids to transfer.
     */
    function recoverERC721s(
        address[] calldata accounts,
        address[] calldata contracts,
        uint256[] calldata tokenIds
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]);
        }
    }
}

interface IRecoverableERC721 {
    /// See {IERC721-transferFrom(address,address,uint256)}
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/introspection/[email protected]

pragma solidity >=0.7.6 <0.8.0;

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


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, basic interface
 * @dev See https://eips.ethereum.org/EIPS/eip-20
 * Note: The ERC-165 identifier for this interface is 0x36372b07.
 */
interface IERC20 {
    /**
     * @dev Emitted when tokens are transferred, including zero value transfers.
     * @param _from The account where the transferred tokens are withdrawn from.
     * @param _to The account where the transferred tokens are deposited to.
     * @param _value The amount of tokens being transferred.
     */
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    /**
     * @dev Emitted when a successful call to {IERC20-approve(address,uint256)} is made.
     * @param _owner The account granting an allowance to `_spender`.
     * @param _spender The account being granted an allowance from `_owner`.
     * @param _value The allowance amount being granted.
     */
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    /**
     * @notice Returns the total token supply.
     * @return The total token supply.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @notice Returns the account balance of another account with address `owner`.
     * @param owner The account whose balance will be returned.
     * @return The account balance of another account with address `owner`.
     */
    function balanceOf(address owner) external view returns (uint256);

    /**
     * Transfers `value` amount of tokens to address `to`.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender does not have enough balance.
     * @dev Emits an {IERC20-Transfer} event.
     * @dev Transfers of 0 values are treated as normal transfers and fire the {IERC20-Transfer} event.
     * @param to The receiver account.
     * @param value The amount of tokens to transfer.
     * @return True if the transfer succeeds, false otherwise.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @notice Transfers `value` amount of tokens from address `from` to address `to` via the approval mechanism.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not `from` and has not been approved by `from` for at least `value`.
     * @dev Reverts if `from` does not have at least `value` of balance.
     * @dev Emits an {IERC20-Transfer} event.
     * @dev Transfers of 0 values are treated as normal transfers and fire the {IERC20-Transfer} event.
     * @param from The emitter account.
     * @param to The receiver account.
     * @param value The amount of tokens to transfer.
     * @return True if the transfer succeeds, false otherwise.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    /**
     * Sets `value` as the allowance from the caller to `spender`.
     *  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
     * @dev Reverts if `spender` is the zero address.
     * @dev Emits the {IERC20-Approval} event.
     * @param spender The account being granted the allowance by the message caller.
     * @param value The allowance amount to grant.
     * @return True if the approval succeeds, false otherwise.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * Returns the amount which `spender` is allowed to spend on behalf of `owner`.
     * @param owner The account that has granted an allowance to `spender`.
     * @param spender The account that was granted an allowance by `owner`.
     * @return The amount which `spender` is allowed to spend on behalf of `owner`.
     */
    function allowance(address owner, address spender) external view returns (uint256);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Detailed
 * See https://eips.ethereum.org/EIPS/eip-20
 * Note: the ERC-165 identifier for this interface is 0xa219a025.
 */
interface IERC20Detailed {
    /**
     * Returns the name of the token. E.g. "My Token".
     * @return The name of the token.
     */
    function name() external view returns (string memory);

    /**
     * Returns the symbol of the token. E.g. "HIX".
     * @return The symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * Returns the number of decimals used to display the balances.
     * 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.
     *
     * NOTE: This information is only used for _display_ purposes: it does  not impact the arithmetic of the contract.
     * @return The number of decimals used to display the balances.
     */
    function decimals() external view returns (uint8);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Allowance
 * See https://eips.ethereum.org/EIPS/eip-20
 * Note: the ERC-165 identifier for this interface is 0xd5b86388.
 */
interface IERC20Allowance {
    /**
     * Increases the allowance granted by the sender to `spender` by `value`.
     *  This is an alternative to {approve} that can be used as a mitigation for
     *  problems described in {IERC20-approve}.
     * @dev Reverts if `spender` is the zero address.
     * @dev Reverts if `spender`'s allowance overflows.
     * @dev Emits an {IERC20-Approval} event with an updated allowance for `spender`.
     * @param spender The account whose allowance is being increased by the message caller.
     * @param value The allowance amount increase.
     * @return True if the allowance increase succeeds, false otherwise.
     */
    function increaseAllowance(address spender, uint256 value) external returns (bool);

    /**
     * Decreases the allowance granted by the sender to `spender` by `value`.
     *  This is an alternative to {approve} that can be used as a mitigation for
     *  problems described in {IERC20-approve}.
     * @dev Reverts if `spender` is the zero address.
     * @dev Reverts if `spender` has an allowance with the message caller for less than `value`.
     * @dev Emits an {IERC20-Approval} event with an updated allowance for `spender`.
     * @param spender The account whose allowance is being decreased by the message caller.
     * @param value The allowance amount decrease.
     * @return True if the allowance decrease succeeds, false otherwise.
     */
    function decreaseAllowance(address spender, uint256 value) external returns (bool);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Safe Transfers
 * Note: the ERC-165 identifier for this interface is 0x53f41a97.
 */
interface IERC20SafeTransfers {
    /**
     * Transfers tokens from the caller to `to`. If this address is a contract, then calls `onERC20Received(address,address,uint256,bytes)` on it.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `value` is greater than the sender's balance.
     * @dev Reverts if `to` is a contract which does not implement `onERC20Received(address,address,uint256,bytes)`.
     * @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` returns a wrong value.
     * @dev Emits an {IERC20-Transfer} event.
     * @param to The address for the tokens to be transferred to.
     * @param amount The amount of tokens to be transferred.
     * @param data Optional additional data with no specified format, to be passed to the receiver contract.
     * @return true.
     */
    function safeTransfer(
        address to,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);

    /**
     * Transfers tokens from `from` to another address, using the allowance mechanism.
     *  If this address is a contract, then calls `onERC20Received(address,address,uint256,bytes)` on it.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `value` is greater than `from`'s balance.
     * @dev Reverts if the sender does not have at least `value` allowance by `from`.
     * @dev Reverts if `to` is a contract which does not implement `onERC20Received(address,address,uint256,bytes)`.
     * @dev Reverts if `to` is a contract and the call to `onERC20Received(address,address,uint256,bytes)` returns a wrong value.
     * @dev Emits an {IERC20-Transfer} event.
     * @param from The address which owns the tokens to be transferred.
     * @param to The address for the tokens to be transferred to.
     * @param amount The amount of tokens to be transferred.
     * @param data Optional additional data with no specified format, to be passed to the receiver contract.
     * @return true.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, optional extension: Multi Transfers
 * Note: the ERC-165 identifier for this interface is 0xd5b86388.
 */
interface IERC20BatchTransfers {
    /**
     * Moves multiple `amounts` tokens from the caller's account to each of `recipients`.
     * @dev Reverts if `recipients` and `amounts` have different lengths.
     * @dev Reverts if one of `recipients` is the zero address.
     * @dev Reverts if the caller has an insufficient balance.
     * @dev Emits an {IERC20-Transfer} event for each individual transfer.
     * @param recipients the list of recipients to transfer the tokens to.
     * @param amounts the amounts of tokens to transfer to each of `recipients`.
     * @return a boolean value indicating whether the operation succeeded.
     */
    function batchTransfer(address[] calldata recipients, uint256[] calldata amounts) external returns (bool);

    /**
     * Moves multiple `amounts` tokens from an account to each of `recipients`, using the approval mechanism.
     * @dev Reverts if `recipients` and `amounts` have different lengths.
     * @dev Reverts if one of `recipients` is the zero address.
     * @dev Reverts if `from` has an insufficient balance.
     * @dev Reverts if the sender does not have at least the sum of all `amounts` as allowance by `from`.
     * @dev Emits an {IERC20-Transfer} event for each individual transfer.
     * @dev Emits an {IERC20-Approval} event.
     * @param from The address which owns the tokens to be transferred.
     * @param recipients the list of recipients to transfer the tokens to.
     * @param amounts the amounts of tokens to transfer to each of `recipients`.
     * @return a boolean value indicating whether the operation succeeded.
     */
    function batchTransferFrom(
        address from,
        address[] calldata recipients,
        uint256[] calldata amounts
    ) external returns (bool);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, ERC1046 optional extension: Metadata
 * See https://eips.ethereum.org/EIPS/eip-1046
 * Note: the ERC-165 identifier for this interface is 0x3c130d90.
 */
interface IERC20Metadata {
    /**
     * Returns a distinct Uniform Resource Identifier (URI) for the token metadata.
     * @return a distinct Uniform Resource Identifier (URI) for the token metadata.
     */
    function tokenURI() external view returns (string memory);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, ERC2612 optional extension: permit – 712-signed approvals
 * @dev Interface for allowing ERC20 approvals to be made via ECDSA `secp256k1` signatures.
 * See https://eips.ethereum.org/EIPS/eip-2612
 * Note: the ERC-165 identifier for this interface is 0x9d8ff7da.
 */
interface IERC20Permit {
    /**
     * Sets `value` as the allowance of `spender` over the tokens of `owner`, given `owner` account's signed permit.
     * @dev WARNING: The standard ERC-20 race condition for approvals applies to `permit()` as well: https://swcregistry.io/docs/SWC-114
     * @dev Reverts if `owner` is the zero address.
     * @dev Reverts if the current blocktime is > `deadline`.
     * @dev Reverts if `r`, `s`, and `v` is not a valid `secp256k1` signature from `owner`.
     * @dev Emits an {IERC20-Approval} event.
     * @param owner The token owner granting the allowance to `spender`.
     * @param spender The token spender being granted the allowance by `owner`.
     * @param value The token amount of the allowance.
     * @param deadline The deadline from which the permit signature is no longer valid.
     * @param v Permit signature v parameter
     * @param r Permit signature r parameter.
     * @param s Permis signature s parameter.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * Returns the current permit nonce of `owner`.
     * @param owner the address to check the nonce of.
     * @return the current permit nonce of `owner`.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * Returns the EIP-712 encoded hash struct of the domain-specific information for permits.
     *
     * @dev A common ERC-20 permit implementation choice for the `DOMAIN_SEPARATOR` is:
     *
     *  keccak256(
     *      abi.encode(
     *          keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
     *          keccak256(bytes(name)),
     *          keccak256(bytes(version)),
     *          chainId,
     *          address(this)))
     *
     *  where
     *   - `name` (string) is the ERC-20 token name.
     *   - `version` (string) refers to the ERC-20 token contract version.
     *   - `chainId` (uint256) is the chain ID to which the ERC-20 token contract is deployed to.
     *   - `verifyingContract` (address) is the ERC-20 token contract address.
     *
     * @return the EIP-712 encoded hash struct of the domain-specific information for permits.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, Receiver
 * See https://eips.ethereum.org/EIPS/eip-20
 * Note: the ERC-165 identifier for this interface is 0x4fc35859.
 */
interface IERC20Receiver {
    /**
     * Handles the receipt of ERC20 tokens.
     * @param sender The initiator of the transfer.
     * @param from The address which transferred the tokens.
     * @param value The amount of tokens transferred.
     * @param data Optional additional data with no specified format.
     * @return bytes4 `bytes4(keccak256("onERC20Received(address,address,uint256,bytes)"))`
     */
    function onERC20Received(
        address sender,
        address from,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;











/**
 * @title ERC20 Fungible Token Contract.
 */
abstract contract ERC20 is
    ManagedIdentity,
    IERC165,
    IERC20,
    IERC20Detailed,
    IERC20Metadata,
    IERC20Allowance,
    IERC20BatchTransfers,
    IERC20SafeTransfers,
    IERC20Permit
{
    using AddressIsContract for address;

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)")
    bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    uint256 public immutable deploymentChainId;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 internal immutable _DOMAIN_SEPARATOR;

    mapping(address => uint256) public override nonces;

    string internal _name;
    string internal _symbol;
    uint8 internal immutable _decimals;
    string internal _tokenURI;

    mapping(address => uint256) internal _balances;
    mapping(address => mapping(address => uint256)) internal _allowances;
    uint256 internal _totalSupply;

    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        string memory tokenURI_
    ) {
        _name = name_;
        _symbol = symbol_;
        _decimals = decimals_;
        _tokenURI = tokenURI_;

        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        deploymentChainId = chainId;
        _DOMAIN_SEPARATOR = _calculateDomainSeparator(chainId, bytes(name_));
    }

    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() public view override returns (bytes32) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        // recompute the domain separator in case of fork and chainid update
        return chainId == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId, bytes(_name));
    }

    function _calculateDomainSeparator(uint256 chainId, bytes memory name_) private view returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(name_),
                    keccak256("1"),
                    chainId,
                    address(this)
                )
            );
    }

    /////////////////////////////////////////// ERC165 ///////////////////////////////////////

    /// @dev See {IERC165-supportsInterface}.
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == type(IERC20).interfaceId ||
            interfaceId == type(IERC20Detailed).interfaceId ||
            interfaceId == type(IERC20Metadata).interfaceId ||
            interfaceId == type(IERC20Allowance).interfaceId ||
            interfaceId == type(IERC20BatchTransfers).interfaceId ||
            interfaceId == type(IERC20SafeTransfers).interfaceId ||
            interfaceId == type(IERC20Permit).interfaceId;
    }

    /////////////////////////////////////////// ERC20Detailed ///////////////////////////////////////

    /// @dev See {IERC20Detailed-name}.
    function name() external view override returns (string memory) {
        return _name;
    }

    /// @dev See {IERC20Detailed-symbol}.
    function symbol() external view override returns (string memory) {
        return _symbol;
    }

    /// @dev See {IERC20Detailed-decimals}.
    function decimals() external view override returns (uint8) {
        return _decimals;
    }

    /////////////////////////////////////////// ERC20Metadata ///////////////////////////////////////

    /// @dev See {IERC20Metadata-tokenURI}.
    function tokenURI() external view override returns (string memory) {
        return _tokenURI;
    }

    /////////////////////////////////////////// ERC20 ///////////////////////////////////////

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

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

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

    /// @dev See {IERC20-approve}.
    function approve(address spender, uint256 value) external virtual override returns (bool) {
        _approve(_msgSender(), spender, value);
        return true;
    }

    /////////////////////////////////////////// ERC20 Allowance ///////////////////////////////////////

    /// @dev See {IERC20Allowance-increaseAllowance}.
    function increaseAllowance(address spender, uint256 addedValue) external virtual override returns (bool) {
        require(spender != address(0), "ERC20: zero address spender");
        address owner = _msgSender();
        uint256 allowance_ = _allowances[owner][spender];
        if (addedValue != 0) {
            uint256 newAllowance = allowance_ + addedValue;
            require(newAllowance > allowance_, "ERC20: allowance overflow");
            _allowances[owner][spender] = newAllowance;
            allowance_ = newAllowance;
        }
        emit Approval(owner, spender, allowance_);

        return true;
    }

    /// @dev See {IERC20Allowance-decreaseAllowance}.
    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual override returns (bool) {
        require(spender != address(0), "ERC20: zero address spender");
        _decreaseAllowance(_msgSender(), spender, subtractedValue);
        return true;
    }

    /// @dev See {IERC20-transfer}.
    function transfer(address to, uint256 value) external virtual override returns (bool) {
        _transfer(_msgSender(), to, value);
        return true;
    }

    /// @dev See {IERC20-transferFrom}.
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external virtual override returns (bool) {
        _transferFrom(_msgSender(), from, to, value);
        return true;
    }

    /////////////////////////////////////////// ERC20MultiTransfer ///////////////////////////////////////

    /// @dev See {IERC20MultiTransfer-multiTransfer(address[],uint256[])}.
    function batchTransfer(address[] calldata recipients, uint256[] calldata values) external virtual override returns (bool) {
        uint256 length = recipients.length;
        require(length == values.length, "ERC20: inconsistent arrays");
        address sender = _msgSender();
        uint256 balance = _balances[sender];

        uint256 totalValue;
        uint256 selfTransferTotalValue;
        for (uint256 i; i != length; ++i) {
            address to = recipients[i];
            require(to != address(0), "ERC20: to zero address");

            uint256 value = values[i];
            if (value != 0) {
                uint256 newTotalValue = totalValue + value;
                require(newTotalValue > totalValue, "ERC20: values overflow");
                totalValue = newTotalValue;
                if (sender != to) {
                    _balances[to] += value;
                } else {
                    require(value <= balance, "ERC20: insufficient balance");
                    selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true
                }
            }
            emit Transfer(sender, to, value);
        }

        if (totalValue != 0 && totalValue != selfTransferTotalValue) {
            uint256 newBalance = balance - totalValue;
            require(newBalance < balance, "ERC20: insufficient balance"); // balance must be sufficient, including self-transfers
            _balances[sender] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance
        }
        return true;
    }

    /// @dev See {IERC20MultiTransfer-multiTransferFrom(address,address[],uint256[])}.
    function batchTransferFrom(
        address from,
        address[] calldata recipients,
        uint256[] calldata values
    ) external virtual override returns (bool) {
        uint256 length = recipients.length;
        require(length == values.length, "ERC20: inconsistent arrays");

        uint256 balance = _balances[from];

        uint256 totalValue;
        uint256 selfTransferTotalValue;
        for (uint256 i; i != length; ++i) {
            address to = recipients[i];
            require(to != address(0), "ERC20: to zero address");

            uint256 value = values[i];

            if (value != 0) {
                uint256 newTotalValue = totalValue + value;
                require(newTotalValue > totalValue, "ERC20: values overflow");
                totalValue = newTotalValue;
                if (from != to) {
                    _balances[to] += value;
                } else {
                    require(value <= balance, "ERC20: insufficient balance");
                    selfTransferTotalValue += value; // cannot overflow as 'selfTransferTotalValue <= totalValue' is always true
                }
            }

            emit Transfer(from, to, value);
        }

        if (totalValue != 0 && totalValue != selfTransferTotalValue) {
            uint256 newBalance = balance - totalValue;
            require(newBalance < balance, "ERC20: insufficient balance"); // balance must be sufficient, including self-transfers
            _balances[from] = newBalance + selfTransferTotalValue; // do not deduct self-transfers from the sender balance
        }

        address sender = _msgSender();
        if (from != sender) {
            _decreaseAllowance(from, sender, totalValue);
        }

        return true;
    }

    /////////////////////////////////////////// ERC20SafeTransfers ///////////////////////////////////////

    /// @dev See {IERC20Safe-safeTransfer(address,uint256,bytes)}.
    function safeTransfer(
        address to,
        uint256 amount,
        bytes calldata data
    ) external virtual override returns (bool) {
        address sender = _msgSender();
        _transfer(sender, to, amount);
        if (to.isContract()) {
            require(IERC20Receiver(to).onERC20Received(sender, sender, amount, data) == type(IERC20Receiver).interfaceId, "ERC20: transfer refused");
        }
        return true;
    }

    /// @dev See {IERC20Safe-safeTransferFrom(address,address,uint256,bytes)}.
    function safeTransferFrom(
        address from,
        address to,
        uint256 amount,
        bytes calldata data
    ) external virtual override returns (bool) {
        address sender = _msgSender();
        _transferFrom(sender, from, to, amount);
        if (to.isContract()) {
            require(IERC20Receiver(to).onERC20Received(sender, from, amount, data) == type(IERC20Receiver).interfaceId, "ERC20: transfer refused");
        }
        return true;
    }

    /////////////////////////////////////////// ERC20Permit ///////////////////////////////////////

    /// @dev See {IERC2612-permit(address,address,uint256,uint256,uint8,bytes32,bytes32)}.
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override {
        require(owner != address(0), "ERC20: zero address owner");
        require(block.timestamp <= deadline, "ERC20: expired permit");
        bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline));
        bytes32 hash = keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR(), hashStruct));
        address signer = ecrecover(hash, v, r, s);
        require(signer == owner, "ERC20: invalid permit");
        _approve(owner, spender, value);
    }

    /////////////////////////////////////////// Internal Functions ///////////////////////////////////////

    function _approve(
        address owner,
        address spender,
        uint256 value
    ) internal {
        require(spender != address(0), "ERC20: zero address spender");
        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _decreaseAllowance(
        address owner,
        address spender,
        uint256 subtractedValue
    ) internal {
        uint256 allowance_ = _allowances[owner][spender];

        if (allowance_ != type(uint256).max && subtractedValue != 0) {
            // save gas when allowance is maximal by not reducing it (see https://github.com/ethereum/EIPs/issues/717)
            uint256 newAllowance = allowance_ - subtractedValue;
            require(newAllowance < allowance_, "ERC20: insufficient allowance");
            _allowances[owner][spender] = newAllowance;
            allowance_ = newAllowance;
        }
        emit Approval(owner, spender, allowance_);
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual {
        require(to != address(0), "ERC20: to zero address");

        if (value != 0) {
            uint256 balance = _balances[from];
            uint256 newBalance = balance - value;
            require(newBalance < balance, "ERC20: insufficient balance");
            if (from != to) {
                _balances[from] = newBalance;
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    function _transferFrom(
        address sender,
        address from,
        address to,
        uint256 value
    ) internal {
        _transfer(from, to, value);
        if (from != sender) {
            _decreaseAllowance(from, sender, value);
        }
    }

    function _mint(address to, uint256 value) internal virtual {
        require(to != address(0), "ERC20: zero address");
        uint256 supply = _totalSupply;
        if (value != 0) {
            uint256 newSupply = supply + value;
            require(newSupply > supply, "ERC20: supply overflow");
            _totalSupply = newSupply;
            _balances[to] += value; // balance cannot overflow if supply does not
        }
        emit Transfer(address(0), to, value);
    }

    function _batchMint(address[] memory recipients, uint256[] memory values) internal virtual {
        uint256 length = recipients.length;
        require(length == values.length, "ERC20: inconsistent arrays");

        uint256 totalValue;
        for (uint256 i; i != length; ++i) {
            address to = recipients[i];
            require(to != address(0), "ERC20: zero address");

            uint256 value = values[i];
            if (value != 0) {
                uint256 newTotalValue = totalValue + value;
                require(newTotalValue > totalValue, "ERC20: values overflow");
                totalValue = newTotalValue;
                _balances[to] += value; // balance cannot overflow if supply does not
            }
            emit Transfer(address(0), to, value);
        }

        if (totalValue != 0) {
            uint256 supply = _totalSupply;
            uint256 newSupply = supply + totalValue;
            require(newSupply > supply, "ERC20: supply overflow");
            _totalSupply = newSupply;
        }
    }

    function _burn(address from, uint256 value) internal virtual {
        if (value != 0) {
            uint256 balance = _balances[from];
            uint256 newBalance = balance - value;
            require(newBalance < balance, "ERC20: insufficient balance");
            _balances[from] = newBalance;
            _totalSupply -= value; // will not underflow if balance does not
        }
        emit Transfer(from, address(0), value);
    }

    function _burnFrom(address from, uint256 value) internal virtual {
        _burn(from, value);
        address sender = _msgSender();
        if (from != sender) {
            _decreaseAllowance(from, sender, value);
        }
    }

    function _batchBurnFrom(address[] memory owners, uint256[] memory values) internal virtual {
        uint256 length = owners.length;
        require(length == values.length, "ERC20: inconsistent arrays");

        address sender = _msgSender();

        uint256 totalValue;
        for (uint256 i; i != length; ++i) {
            address from = owners[i];
            uint256 value = values[i];
            if (value != 0) {
                uint256 balance = _balances[from];
                uint256 newBalance = balance - value;
                require(newBalance < balance, "ERC20: insufficient balance");
                _balances[from] = newBalance;
                totalValue += value; // totalValue cannot overflow if the individual balances do not underflow
            }
            emit Transfer(from, address(0), value);

            if (from != sender) {
                _decreaseAllowance(from, sender, value);
            }
        }

        if (totalValue != 0) {
            _totalSupply -= totalValue; // _totalSupply cannot underfow as balances do not underflow
        }
    }
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/bridging/[email protected]

pragma solidity >=0.7.6 <0.8.0;

interface IChildToken {
    function deposit(address user, bytes calldata depositData) external;
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;


abstract contract ERC20Receiver is IERC20Receiver, IERC165 {
    bytes4 internal constant _ERC20_RECEIVED = type(IERC20Receiver).interfaceId;
    bytes4 internal constant _ERC20_REJECTED = 0xffffffff;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC20Receiver).interfaceId;
    }
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/bridging/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
 * Polygon (MATIC) bridging base child ERC20 for deployment on the child chain (Polygon/MATIC).
 */
abstract contract ChildERC20Base is IChildToken, ERC20Receiver {
    event Withdrawn(address account, uint256 value);

    // see https://github.com/maticnetwork/pos-portal/blob/master/contracts/child/ChildChainManager/ChildChainManager.sol
    address public childChainManager;

    /**
     * Constructor
     * @param childChainManager_ the Polygon/MATIC ChildChainManager proxy address.
     */
    constructor(address childChainManager_) {
        childChainManager = childChainManager_;
    }

    function _requireDepositorRole(address account) internal view {
        require(account == childChainManager, "ChildERC20: only depositor");
    }
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;


abstract contract ChildERC20 is ERC20, ChildERC20Base {
    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        string memory tokenURI_,
        address childChainManager
    ) ERC20(name_, symbol_, decimals_, tokenURI_) ChildERC20Base(childChainManager) {}

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC20, ERC20Receiver) returns (bool) {
        return ERC20.supportsInterface(interfaceId) || ERC20Receiver.supportsInterface(interfaceId);
    }

    /**
     * Called when tokens have been deposited on the root chain.
     * @dev Should handle deposit by un-escrowing the required amount for user.
     * @dev Reverts if not sent by the depositor (ChildChainManager).
     * @param user address for whom deposit has been done.
     * @param depositData abi encoded amount.
     */
    function deposit(address user, bytes calldata depositData) public virtual override {
        _requireDepositorRole(_msgSender());
        uint256 amount = abi.decode(depositData, (uint256));
        _transfer(address(this), user, amount);
    }

    /**
     * Called when user wants to withdraw tokens back to the root chain.
     * @dev Should escrow user's tokens. This transaction will be verified when exiting on root chain.
     * @dev Emits a {Withdrawn} event.
     * @param amount amount of tokens to withdraw.
     */
    function withdraw(uint256 amount) public virtual {
        address sender = _msgSender();
        _transferFrom(sender, sender, address(this), amount);
        emit Withdrawn(sender, amount);
    }

    /**
     * Called when user wants to withdraw tokens back to the root chain (no pre-approval required).
     * @dev Should escrow user's tokens. This transaction will be verified when exiting on root chain.
     * @dev Reverts if the sender is not this contract.
     * @dev Emits a {Withdrawn} event.
     * _param operator The initiator of the transfer.
     * @param from The address which transferred the tokens.
     * @param amount The amount of tokens transferred.
     * _param data Optional additional data with no specified format.
     * @return bytes4 `bytes4(keccak256("onERC20Received(address,address,uint256,bytes)"))`
     */
    function onERC20Received(
        address, /*operator*/
        address from,
        uint256 amount,
        bytes calldata /*data*/
    ) public virtual override returns (bytes4) {
        require(_msgSender() == address(this), "ChildERC20: wrong sender");
        emit Withdrawn(from, amount);
        return _ERC20_RECEIVED;
    }
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

abstract contract UsingAppendedCallData {
    function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) {
        // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1
        // The assembly code is more direct than the Solidity version using `abi.decode`.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            sender := shr(96, calldataload(sub(calldatasize(), 20)))
        }
    }

    function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) {
        return msg.data[:msg.data.length - 20];
    }
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IERC2771 {
    function isTrustedForwarder(address forwarder) external view returns (bool);
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IForwarderRegistry {
    function isForwarderFor(address, address) external view returns (bool);
}


// File ethereum-universal-forwarder/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;



abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 {
    IForwarderRegistry internal immutable _forwarderRegistry;
    address internal immutable _universalForwarder;

    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) {
        _universalForwarder = universalForwarder;
        _forwarderRegistry = forwarderRegistry;
    }

    function isTrustedForwarder(address forwarder) external view virtual override returns (bool) {
        return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry);
    }

    function _msgSender() internal view virtual returns (address payable) {
        address payable msgSender = msg.sender;
        address payable sender = _lastAppendedDataAsSender();
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return sender;
        }

        // if msg.sender is neither the registry nor the universal forwarder,
        // we have to check the last 20bytes of the call data intepreted as an address
        // and check if the msg.sender was registered as forewarder for that address
        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) {
            return sender;
        }

        return msgSender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        address payable msgSender = msg.sender;
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return _msgDataAssuming20BytesAppendedData();
        }

        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) {
            return _msgDataAssuming20BytesAppendedData();
        }
        return msg.data;
    }
}


// File contracts/token/ERC20/PolygonREVV.sol

pragma solidity >=0.7.6 <0.8.0;




contract PolygonREVV is Recoverable, UsingUniversalForwarding, ChildERC20 {
    using ERC20Wrapper for IWrappedERC20;

    uint256 public escrowed;

    constructor(
        uint256 supply,
        address childChainManager,
        IForwarderRegistry forwarderRegistry,
        address universalForwarder
    ) ChildERC20("REVV", "REVV", 18, "", childChainManager) UsingUniversalForwarding(forwarderRegistry, universalForwarder) Ownable(msg.sender) {
        _mint(address(this), supply);
        escrowed = supply;
    }

    function setTokenURI(string memory tokenURI_) external {
        _requireOwnership(_msgSender());
        _tokenURI = tokenURI_;
    }

    function deposit(address user, bytes calldata depositData) public virtual override {
        escrowed -= abi.decode(depositData, (uint256));
        super.deposit(user, depositData);
    }

    function withdraw(uint256 amount) public virtual override {
        escrowed += amount;
        super.withdraw(amount);
    }

    function onERC20Received(
        address operator,
        address from,
        uint256 amount,
        bytes calldata data
    ) public virtual override returns (bytes4) {
        escrowed += amount;
        return super.onERC20Received(operator, from, amount, data);
    }

    function recoverERC20s(
        address[] calldata accounts,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external virtual override {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            address token = tokens[i];
            uint256 amount = amounts[i];
            if (token == address(this)) {
                uint256 recoverable = _balances[address(this)] - escrowed;
                require(amount <= recoverable, "Recov: insufficient balance");
            }
            IWrappedERC20(token).wrappedTransfer(accounts[i], amount);
        }
    }

    function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) {
        return UsingUniversalForwarding._msgSender();
    }

    function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) {
        return UsingUniversalForwarding._msgData();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"address","name":"childChainManager","type":"address"},{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawn","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":"value","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":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"childChainManager","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"deploymentChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"escrowed","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":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC20Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","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":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransfer","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"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"value","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"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040523480156200001257600080fd5b506040516200332138038062003321833981810160405260808110156200003857600080fd5b508051602080830151604080850151606090950151815180830183526004808252632922ab2b60e11b828701819052845180860186529182528187015283519586018452600080875280546001600160a01b031916339081178255945197989597959693959294919360129390928992839288928892889288928e928e928291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606091821b811660a05291901b1660805283516200010e90600290602087019062000372565b5082516200012490600390602086019062000372565b507fff0000000000000000000000000000000000000000000000000000000000000060f883901b166101005280516200016590600490602084019062000372565b504660c0819052620001788186620001c2565b60e0525050600880546001600160a01b0319166001600160a01b03959095169490941790935550620001b696503095508a94506200024c9350505050565b5050506009556200041e565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b6001600160a01b038216620002a8576040805162461bcd60e51b815260206004820152601360248201527f45524332303a207a65726f206164647265737300000000000000000000000000604482015290519081900360640190fd5b60075481156200032c578082018181116200030a576040805162461bcd60e51b815260206004820152601660248201527f45524332303a20737570706c79206f766572666c6f7700000000000000000000604482015290519081900360640190fd5b6007556001600160a01b03831660009081526005602052604090208054830190555b6040805183815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003aa5760008555620003f5565b82601f10620003c557805160ff1916838001178555620003f5565b82800160010185558215620003f5579182015b82811115620003f5578251825591602001919060010190620003d8565b506200040392915062000407565b5090565b5b8082111562000403576000815560010162000408565b60805160601c60a05160601c60c05160e0516101005160f81c612ea66200047b60003980610d0b525080610df3525080610d325280611c495250806113415280612a2652508061137c52806129eb5280612a7e5250612ea66000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80637ecebe001161010f578063c8291d84116100a2578063dd62ed3e11610071578063dd62ed3e14610a7a578063e0df5b6f14610aa8578063eb79554914610b4e578063f2fde38b14610bd3576101f0565b8063c8291d8414610999578063cd0d0096146109a1578063cf2c52cb146109a9578063d505accf14610a29576101f0565b8063a457c2d7116100de578063a457c2d71461079d578063a9059cbb146107c9578063b88d4fde146107f5578063c3666c3614610885576101f0565b80637ecebe001461068957806388d695b2146106af5780638da5cb5b1461077157806395d89b4114610795576101f0565b80633644e515116101875780634fc35859116101565780634fc358591461047c578063572b6c051461052957806370a082311461054f57806373c8a95814610575576101f0565b80633644e5151461036e57806339509351146103765780633c130d90146103a25780634885b254146103aa576101f0565b806318160ddd116101c357806318160ddd146102f357806323b872dd146102fb5780632e1a7d4d14610331578063313ce56714610350576101f0565b806301522b1e146101f557806301ffc9a71461020f57806306fdde031461024a578063095ea7b3146102c7575b600080fd5b6101fd610bf9565b60408051918252519081900360200190f35b6102366004803603602081101561022557600080fd5b50356001600160e01b031916610bff565b604080519115158252519081900360200190f35b610252610c1f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561028c578181015183820152602001610274565b50505050905090810190601f1680156102b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610236600480360360408110156102dd57600080fd5b506001600160a01b038135169060200135610cb3565b6101fd610cd0565b6102366004803603606081101561031157600080fd5b506001600160a01b03813581169160208101359091169060400135610cd6565b61034e6004803603602081101561034757600080fd5b5035610cf5565b005b610358610d09565b6040805160ff9092168252519081900360200190f35b6101fd610d2d565b6102366004803603604081101561038c57600080fd5b506001600160a01b038135169060200135610e19565b610252610f87565b610236600480360360608110156103c057600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156103eb57600080fd5b8201836020820111156103fd57600080fd5b8035906020019184602083028401116401000000008311171561041f57600080fd5b91939092909160208101903564010000000081111561043d57600080fd5b82018360208201111561044f57600080fd5b8035906020019184602083028401116401000000008311171561047157600080fd5b509092509050610fe8565b61050c6004803603608081101561049257600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156104cd57600080fd5b8201836020820111156104df57600080fd5b8035906020019184600183028401116401000000008311171561050157600080fd5b50909250905061131c565b604080516001600160e01b03199092168252519081900360200190f35b6102366004803603602081101561053f57600080fd5b50356001600160a01b031661133d565b6101fd6004803603602081101561056557600080fd5b50356001600160a01b03166113b6565b61034e6004803603606081101561058b57600080fd5b8101906020810181356401000000008111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460208302840111640100000000831117156105da57600080fd5b9193909290916020810190356401000000008111156105f857600080fd5b82018360208201111561060a57600080fd5b8035906020019184602083028401116401000000008311171561062c57600080fd5b91939092909160208101903564010000000081111561064a57600080fd5b82018360208201111561065c57600080fd5b8035906020019184602083028401116401000000008311171561067e57600080fd5b5090925090506113d1565b6101fd6004803603602081101561069f57600080fd5b50356001600160a01b0316611554565b610236600480360360408110156106c557600080fd5b8101906020810181356401000000008111156106e057600080fd5b8201836020820111156106f257600080fd5b8035906020019184602083028401116401000000008311171561071457600080fd5b91939092909160208101903564010000000081111561073257600080fd5b82018360208201111561074457600080fd5b8035906020019184602083028401116401000000008311171561076657600080fd5b509092509050611566565b610779611875565b604080516001600160a01b039092168252519081900360200190f35b610252611884565b610236600480360360408110156107b357600080fd5b506001600160a01b0381351690602001356118e5565b610236600480360360408110156107df57600080fd5b506001600160a01b038135169060200135611954565b6102366004803603608081101561080b57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561084657600080fd5b82018360208201111561085857600080fd5b8035906020019184600183028401116401000000008311171561087a57600080fd5b509092509050611968565b61034e6004803603606081101561089b57600080fd5b8101906020810181356401000000008111156108b657600080fd5b8201836020820111156108c857600080fd5b803590602001918460208302840111640100000000831117156108ea57600080fd5b91939092909160208101903564010000000081111561090857600080fd5b82018360208201111561091a57600080fd5b8035906020019184602083028401116401000000008311171561093c57600080fd5b91939092909160208101903564010000000081111561095a57600080fd5b82018360208201111561096c57600080fd5b8035906020019184602083028401116401000000008311171561098e57600080fd5b509092509050611af0565b610779611c38565b6101fd611c47565b61034e600480360360408110156109bf57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156109ea57600080fd5b8201836020820111156109fc57600080fd5b80359060200191846001830284011164010000000083111715610a1e57600080fd5b509092509050611c6b565b61034e600480360360e0811015610a3f57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611c97565b6101fd60048036036040811015610a9057600080fd5b506001600160a01b0381358116916020013516611f16565b61034e60048036036020811015610abe57600080fd5b810190602081018135640100000000811115610ad957600080fd5b820183602082011115610aeb57600080fd5b80359060200191846001830284011164010000000083111715610b0d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611f41945050505050565b61023660048036036060811015610b6457600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610b9457600080fd5b820183602082011115610ba657600080fd5b80359060200191846001830284011164010000000083111715610bc857600080fd5b509092509050611f63565b61034e60048036036020811015610be957600080fd5b50356001600160a01b03166120e9565b60095481565b6000610c0a8261215a565b80610c195750610c19826122f7565b92915050565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610ca85780601f10610c7d57610100808354040283529160200191610ca8565b820191906000526020600020905b815481529060010190602001808311610c8b57829003601f168201915b505050505090505b90565b6000610cc7610cc0612343565b8484612352565b50600192915050565b60075490565b6000610ceb610ce3612343565b85858561240f565b5060019392505050565b6009805482019055610d0681612444565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610df1576002805460408051602060018416156101000260001901909316849004601f8101849004840282018401909252818152610dec93859391929091830182828015610de25780601f10610db757610100808354040283529160200191610de2565b820191906000526020600020905b815481529060010190602001808311610dc557829003601f168201915b50505050506124a4565b610e13565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b60006001600160a01b038316610e76576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6000610e80612343565b6001600160a01b038082166000908152600660209081526040808320938916835292905220549091508315610f3157808401818111610f06576040805162461bcd60e51b815260206004820152601960248201527f45524332303a20616c6c6f77616e6365206f766572666c6f7700000000000000604482015290519081900360640190fd5b6001600160a01b038084166000908152600660209081526040808320938a1683529290522081905590505b846001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3506001949350505050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ca85780601f10610c7d57610100808354040283529160200191610ca8565b60008382811461103f576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b6001600160a01b0387166000908152600560205260408120549080805b8481146112515760008a8a8381811061107157fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b031614156110eb576040805162461bcd60e51b815260206004820152601660248201527f45524332303a20746f207a65726f206164647265737300000000000000000000604482015290519081900360640190fd5b60008989848181106110f957fe5b905060200201359050806000146111fc57848101858111611161576040805162461bcd60e51b815260206004820152601660248201527f45524332303a2076616c756573206f766572666c6f7700000000000000000000604482015290519081900360640190fd5b809550826001600160a01b03168e6001600160a01b0316146111a0576001600160a01b03831660009081526005602052604090208054830190556111fa565b868211156111f5576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b938101935b505b816001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505060010161105c565b5081158015906112615750808214155b156112db578183038381106112bd576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b6001600160a01b038b16600090815260056020526040902090820190555b60006112e5612343565b9050806001600160a01b03168b6001600160a01b03161461130b5761130b8b828561252e565b5060019a9950505050505050505050565b60098054840190556000611333868686868661263d565b9695505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610c1957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6001600160a01b031660009081526005602052604090205490565b6113e16113dc612343565b6126f9565b8483811480156113f057508082145b611441576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461154a57600086868381811061145957fe5b905060200201356001600160a01b03169050600085858481811061147957fe5b905060200201359050306001600160a01b0316826001600160a01b0316141561150757600954306000908152600560205260409020540380821115611505576040805162461bcd60e51b815260206004820152601b60248201527f5265636f763a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b505b6115408a8a8581811061151657fe5b905060200201356001600160a01b031682846001600160a01b03166127bd9092919063ffffffff16565b5050600101611444565b5050505050505050565b60016020526000908152604090205481565b6000838281146115bd576040805162461bcd60e51b815260206004820152601a60248201527f45524332303a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60006115c7612343565b6001600160a01b03811660009081526005602052604081205491925080805b8581146117db5760008b8b838181106115fb57fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415611675576040805162461bcd60e51b815260206004820152601660248201527f45524332303a20746f207a65726f206164647265737300000000000000000000604482015290519081900360640190fd5b60008a8a8481811061168357fe5b90506020020135905080600014611786578481018581116116eb576040805162461bcd60e51b815260206004820152601660248201527f45524332303a2076616c756573206f766572666c6f7700000000000000000000604482015290519081900360640190fd5b809550826001600160a01b0316886001600160a01b03161461172a576001600160a01b0383166000908152600560205260409020805483019055611784565b8682111561177f576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b938101935b505b816001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350506001016115e6565b5081158015906117eb5750808214155b1561186557818303838110611847576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b6001600160a01b038516600090815260056020526040902090820190555b5060019998505050505050505050565b6000546001600160a01b031690565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ca85780601f10610c7d57610100808354040283529160200191610ca8565b60006001600160a01b038316611942576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b610cc761194d612343565b848461252e565b6000610cc7611961612343565b848461283d565b600080611973612343565b90506119818188888861240f565b611993866001600160a01b03166129a4565b15611ae357634fc3585960e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916866001600160a01b0316634fc35859838a8989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b158015611a5b57600080fd5b505af1158015611a6f573d6000803e3d6000fd5b505050506040513d6020811015611a8557600080fd5b50516001600160e01b03191614611ae3576040805162461bcd60e51b815260206004820152601760248201527f45524332303a207472616e736665722072656675736564000000000000000000604482015290519081900360640190fd5b5060019695505050505050565b611afb6113dc612343565b848381148015611b0a57508082145b611b5b576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461154a57858582818110611b7157fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611b9c57fe5b905060200201356001600160a01b0316878786818110611bb857fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611c1557600080fd5b505af1158015611c29573d6000803e3d6000fd5b50505050806001019050611b5e565b6008546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b81816020811015611c7b57600080fd5b506009805491359091039055611c928383836129aa565b505050565b6001600160a01b038716611cf2576040805162461bcd60e51b815260206004820152601960248201527f45524332303a207a65726f2061646472657373206f776e657200000000000000604482015290519081900360640190fd5b83421115611d47576040805162461bcd60e51b815260206004820152601560248201527f45524332303a2065787069726564207065726d69740000000000000000000000604482015290519081900360640190fd5b6001600160a01b0380881660008181526001602081815260408084208054938401905580517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280820195909552948b166060850152608084018a905260a084019190915260c08084018990528451808503909101815260e09093019093528151919092012090611dd9610d2d565b8260405160200180807f190100000000000000000000000000000000000000000000000000000000000081525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050600060018287878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611e8d573d6000803e3d6000fd5b505050602060405103519050896001600160a01b0316816001600160a01b031614611eff576040805162461bcd60e51b815260206004820152601560248201527f45524332303a20696e76616c6964207065726d69740000000000000000000000604482015290519081900360640190fd5b611f0a8a8a8a612352565b50505050505050505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b611f4c6113dc612343565b8051611f5f906004906020840190612dcf565b5050565b600080611f6e612343565b9050611f7b81878761283d565b611f8d866001600160a01b03166129a4565b156120dd57634fc3585960e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916866001600160a01b0316634fc3585983848989896040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050602060405180830381600087803b15801561205557600080fd5b505af1158015612069573d6000803e3d6000fd5b505050506040513d602081101561207f57600080fd5b50516001600160e01b031916146120dd576040805162461bcd60e51b815260206004820152601760248201527f45524332303a207472616e736665722072656675736564000000000000000000604482015290519081900360640190fd5b50600195945050505050565b6120f46113dc612343565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60006001600160e01b031982167f01ffc9a70000000000000000000000000000000000000000000000000000000014806121bd57506001600160e01b031982167f36372b0700000000000000000000000000000000000000000000000000000000145b806121f157506001600160e01b031982167fa219a02500000000000000000000000000000000000000000000000000000000145b8061222557506001600160e01b031982167f3c130d9000000000000000000000000000000000000000000000000000000000145b8061225957506001600160e01b031982167f9d07518600000000000000000000000000000000000000000000000000000000145b8061228d57506001600160e01b031982167fc05327e600000000000000000000000000000000000000000000000000000000145b806122c157506001600160e01b031982167f53f41a9700000000000000000000000000000000000000000000000000000000145b80610c195750506001600160e01b0319167f9d8ff7da000000000000000000000000000000000000000000000000000000001490565b60006001600160e01b031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610c195750506001600160e01b031916634fc3585960e01b1490565b600061234d6129db565b905090565b6001600160a01b0382166123ad576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a207a65726f2061646472657373207370656e6465720000000000604482015290519081900360640190fd5b6001600160a01b03808416600081815260066020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b61241a83838361283d565b836001600160a01b0316836001600160a01b03161461243e5761243e83858361252e565b50505050565b600061244e612343565b905061245c8182308561240f565b604080516001600160a01b03831681526020810184905281517f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5929181900390910190a15050565b8051602091820120604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81850152808201929092527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606083015260808201939093523060a0808301919091528351808303909101815260c0909101909252815191012090565b6001600160a01b03808416600090815260066020908152604080832093861683529290522054600019811480159061256557508115155b156125ec578181038181106125c1576040805162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015290519081900360640190fd5b6001600160a01b03808616600090815260066020908152604080832093881683529290522081905590505b826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a350505050565b600030612648612343565b6001600160a01b0316146126a3576040805162461bcd60e51b815260206004820152601860248201527f4368696c6445524332303a2077726f6e672073656e6465720000000000000000604482015290519081900360640190fd5b604080516001600160a01b03871681526020810186905281517f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5929181900390910190a150634fc3585960e01b95945050505050565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273257600080fd5b505afa158015612746573d6000803e3d6000fd5b505050506040513d602081101561275c57600080fd5b50516001600160a01b03828116911614610d06576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611c92908490612b3b565b6001600160a01b038216612898576040805162461bcd60e51b815260206004820152601660248201527f45524332303a20746f207a65726f206164647265737300000000000000000000604482015290519081900360640190fd5b8015612954576001600160a01b03831660009081526005602052604090205481810381811061290e576040805162461bcd60e51b815260206004820152601b60248201527f45524332303a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b031614612951576001600160a01b038086166000908152600560205260408082208490559186168152208054840190555b50505b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b3b151590565b6129ba6129b5612343565b612d43565b6000828260208110156129cc57600080fd5b5035905061243e30858361283d565b600033816129e7612da5565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480612a5a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b15612a68579150610cb09050565b6001600160a01b0382163214801590612b2757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d6020811015612b2457600080fd5b50515b15612b35579150610cb09050565b50905090565b81612b4e6001600160a01b0382166129a4565b612b9f576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b60208310612bfa57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612bbd565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612c5c576040519150601f19603f3d011682016040523d82523d6000602084013e612c61565b606091505b50915091508115612ce057805115612cdb57808060200190516020811015612c8857600080fd5b5051612cdb576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b612d3c565b8051612d33576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b5050505050565b6008546001600160a01b03828116911614610d06576040805162461bcd60e51b815260206004820152601a60248201527f4368696c6445524332303a206f6e6c79206465706f7369746f72000000000000604482015290519081900360640190fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612e055760008555612e4b565b82601f10612e1e57805160ff1916838001178555612e4b565b82800160010185558215612e4b579182015b82811115612e4b578251825591602001919060010190612e30565b50612e57929150612e5b565b5090565b5b80821115612e575760008155600101612e5c56fea264697066735822122049ed424058a3077211d0319a6efee13b7806493e4c9a3a8e6fd909408a2a58ee64736f6c63430007060033000000000000000000000000000000000000000009b18ab5df7180b6b8000000000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2

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

000000000000000000000000000000000000000009b18ab5df7180b6b8000000000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2

-----Decoded View---------------
Arg [0] : supply (uint256): 3000000000000000000000000000
Arg [1] : childChainManager (address): 0xa6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa
Arg [2] : forwarderRegistry (address): 0x71bee13e92e64701b78f059801a70857e4683acd
Arg [3] : universalForwarder (address): 0x56133a31f4cd01ede8c6ee780071c021bd324ad2

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000009b18ab5df7180b6b8000000
Arg [1] : 000000000000000000000000a6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa
Arg [2] : 00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd
Arg [3] : 00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2


Deployed ByteCode Sourcemap

54143:2490:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54269:23;;;:::i;:::-;;;;;;;;;;;;;;;;48060:223;;;;;;;;;;;;;;;;-1:-1:-1;48060:223:0;-1:-1:-1;;;;;;48060:223:0;;:::i;:::-;;;;;;;;;;;;;;;;;;31460:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32765:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32765:169:0;;;;;;;;:::i;32255:102::-;;;:::i;34341:223::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34341:223:0;;;;;;;;;;;;;;;;;:::i;55030:128::-;;;;;;;;;;;;;;;;-1:-1:-1;55030:128:0;;:::i;:::-;;31756:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29690:361;;;:::i;33104:638::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33104:638:0;;;;;;;;:::i;32008:102::-;;;:::i;36500:1801::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36500:1801:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36500:1801:0;;-1:-1:-1;36500:1801:0;-1:-1:-1;36500:1801:0;:::i;55166:284::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55166:284:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55166:284:0;;-1:-1:-1;55166:284:0;-1:-1:-1;55166:284:0;:::i;:::-;;;;-1:-1:-1;;;;;;55166:284:0;;;;;;;;;;;;;;52228:195;;;;;;;;;;;;;;;;-1:-1:-1;52228:195:0;-1:-1:-1;;;;;52228:195:0;;:::i;32403:121::-;;;;;;;;;;;;;;;;-1:-1:-1;32403:121:0;-1:-1:-1;;;;;32403:121:0;;:::i;55458:789::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55458:789:0;;-1:-1:-1;55458:789:0;-1:-1:-1;55458:789:0;:::i;28795:50::-;;;;;;;;;;;;;;;;-1:-1:-1;28795:50:0;-1:-1:-1;;;;;28795:50:0;;:::i;34758:1646::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34758:1646:0;;-1:-1:-1;34758:1646:0;-1:-1:-1;34758:1646:0;:::i;6688:96::-;;;:::i;:::-;;;;-1:-1:-1;;;;;6688:96:0;;;;;;;;;;;;;;31605:98;;;:::i;33805:281::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33805:281:0;;;;;;;;:::i;34131:161::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34131:161:0;;;;;;;;:::i;39025:485::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39025:485:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39025:485:0;;-1:-1:-1;39025:485:0;-1:-1:-1;39025:485:0;:::i;9867:522::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9867:522:0;;-1:-1:-1;9867:522:0;-1:-1:-1;9867:522:0;:::i;47175:32::-;;;:::i;28638:42::-;;;:::i;54831:191::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54831:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54831:191:0;;-1:-1:-1;54831:191:0;-1:-1:-1;54831:191:0;:::i;39713:727::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39713:727:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32570:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32570:151:0;;;;;;;;;;:::i;54686:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54686:137:0;;-1:-1:-1;54686:137:0;;-1:-1:-1;;;;;54686:137:0:i;38487:450::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38487:450:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38487:450:0;;-1:-1:-1;38487:450:0;-1:-1:-1;38487:450:0;:::i;7031:201::-;;;;;;;;;;;;;;;;-1:-1:-1;7031:201:0;-1:-1:-1;;;;;7031:201:0;;:::i;54269:23::-;;;;:::o;48060:223::-;48167:4;48191:36;48215:11;48191:23;:36::i;:::-;:84;;;;48231:44;48263:11;48231:31;:44::i;:::-;48184:91;48060:223;-1:-1:-1;;48060:223:0:o;31460:94::-;31541:5;31534:12;;;;;;;-1:-1:-1;;31534:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31508:13;;31534:12;;31541:5;;31534:12;;31541:5;31534:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31460:94;;:::o;32765:169::-;32849:4;32866:38;32875:12;:10;:12::i;:::-;32889:7;32898:5;32866:8;:38::i;:::-;-1:-1:-1;32922:4:0;32765:169;;;;:::o;32255:102::-;32337:12;;32255:102;:::o;34341:223::-;34473:4;34490:44;34504:12;:10;:12::i;:::-;34518:4;34524:2;34528:5;34490:13;:44::i;:::-;-1:-1:-1;34552:4:0;34341:223;;;;;:::o;55030:128::-;55099:8;:18;;;;;;55128:22;55111:6;55128:14;:22::i;:::-;55030:128;:::o;31756:94::-;31833:9;31756:94;:::o;29690:361::-;29748:7;29829:9;29955:17;29944:28;;:99;;30036:5;29995:48;;;;;;;;;;;;-1:-1:-1;;29995:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;30021:7;;29995:48;;30036:5;;29995:48;;30036:5;29995:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;:48::i;:::-;29944:99;;;29975:17;29944:99;29937:106;;;29690:361;:::o;33104:638::-;33203:4;-1:-1:-1;;;;;33228:21:0;;33220:61;;;;;-1:-1:-1;;;33220:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33292:13;33308:12;:10;:12::i;:::-;-1:-1:-1;;;;;33352:18:0;;;33331;33352;;;:11;:18;;;;;;;;:27;;;;;;;;;;33292:28;;-1:-1:-1;33394:15:0;;33390:269;;33449:23;;;33495:25;;;33487:63;;;;;-1:-1:-1;;;33487:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33565:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:42;;;33595:12;-1:-1:-1;33390:269:0;33690:7;-1:-1:-1;;;;;33674:36:0;33683:5;-1:-1:-1;;;;;33674:36:0;;33699:10;33674:36;;;;;;;;;;;;;;;;;;-1:-1:-1;33730:4:0;;33104:638;-1:-1:-1;;;;33104:638:0:o;32008:102::-;32093:9;32086:16;;;;;;;;-1:-1:-1;;32086:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32060:13;;32086:16;;32093:9;;32086:16;;32093:9;32086:16;;;;;;;;;;;;;;;;;;;;;;;;36500:1801;36668:4;36702:10;36738:23;;;36730:62;;;;;-1:-1:-1;;;36730:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36823:15:0;;36805;36823;;;:9;:15;;;;;;;36805;;36921:810;36942:6;36937:1;:11;36921:810;;36970:10;36983;;36994:1;36983:13;;;;;;;;;;;;;-1:-1:-1;;;;;36983:13:0;36970:26;;37033:1;-1:-1:-1;;;;;37019:16:0;:2;-1:-1:-1;;;;;37019:16:0;;;37011:51;;;;;-1:-1:-1;;;37011:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37079:13;37095:6;;37102:1;37095:9;;;;;;;;;;;;;37079:25;;37125:5;37134:1;37125:10;37121:552;;37180:18;;;37225:26;;;37217:61;;;;;-1:-1:-1;;;37217:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37310:13;37297:26;;37354:2;-1:-1:-1;;;;;37346:10:0;:4;-1:-1:-1;;;;;37346:10:0;;37342:316;;-1:-1:-1;;;;;37381:13:0;;;;;;:9;:13;;;;;:22;;;;;;37342:316;;;37469:7;37460:5;:16;;37452:56;;;;;-1:-1:-1;;;37452:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37531:31;;;;37342:316;37121:552;;37709:2;-1:-1:-1;;;;;37694:25:0;37703:4;-1:-1:-1;;;;;37694:25:0;;37713:5;37694:25;;;;;;;;;;;;;;;;;;-1:-1:-1;;36950:3:0;;36921:810;;;-1:-1:-1;37747:15:0;;;;;:55;;;37780:22;37766:10;:36;;37747:55;37743:384;;;37840:20;;;37883;;;37875:60;;;;;-1:-1:-1;;;37875:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38006:15:0;;;;;;:9;:15;;;;;38024:35;;;38006:53;;37743:384;38139:14;38156:12;:10;:12::i;:::-;38139:29;;38191:6;-1:-1:-1;;;;;38183:14:0;:4;-1:-1:-1;;;;;38183:14:0;;38179:91;;38214:44;38233:4;38239:6;38247:10;38214:18;:44::i;:::-;-1:-1:-1;38289:4:0;;36500:1801;-1:-1:-1;;;;;;;;;;36500:1801:0:o;55166:284::-;55355:8;:18;;;;;;55336:6;55391:51;55413:8;55423:4;55367:6;55437:4;;55391:21;:51::i;:::-;55384:58;55166:284;-1:-1:-1;;;;;;55166:284:0:o;52228:195::-;52315:4;52352:19;-1:-1:-1;;;;;52339:32:0;:9;-1:-1:-1;;;;;52339:32:0;;:76;;;;52396:18;-1:-1:-1;;;;;52375:40:0;:9;-1:-1:-1;;;;;52375:40:0;;52332:83;;52228:195;;;:::o;32403:121::-;-1:-1:-1;;;;;32498:18:0;32471:7;32498:18;;;:9;:18;;;;;;;32403:121::o;55458:789::-;55636:31;55654:12;:10;:12::i;:::-;55636:17;:31::i;:::-;55695:8;55729:23;;;:51;;;;-1:-1:-1;55756:24:0;;;55729:51;55721:90;;;;;-1:-1:-1;;;55721:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55827:9;55822:418;55847:6;55842:1;:11;55822:418;;55875:13;55891:6;;55898:1;55891:9;;;;;;;;;;;;;-1:-1:-1;;;;;55891:9:0;55875:25;;55915:14;55932:7;;55940:1;55932:10;;;;;;;;;;;;;55915:27;;55978:4;-1:-1:-1;;;;;55961:22:0;:5;-1:-1:-1;;;;;55961:22:0;;55957:200;;;56053:8;;56044:4;56004:19;56026:24;;;:9;:24;;;;;;:35;56088:21;;;;56080:61;;;;;-1:-1:-1;;;56080:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55957:200;;56171:57;56208:8;;56217:1;56208:11;;;;;;;;;;;;;-1:-1:-1;;;;;56208:11:0;56221:6;56185:5;-1:-1:-1;;;;;56171:36:0;;;:57;;;;;:::i;:::-;-1:-1:-1;;55855:3:0;;55822:418;;;;55458:789;;;;;;;:::o;28795:50::-;;;;;;;;;;;;;:::o;34758:1646::-;34874:4;34908:10;34944:23;;;34936:62;;;;;-1:-1:-1;;;34936:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35009:14;35026:12;:10;:12::i;:::-;-1:-1:-1;;;;;35067:17:0;;35049:15;35067:17;;;:9;:17;;;;;;35009:29;;-1:-1:-1;35049:15:0;;35167:810;35188:6;35183:1;:11;35167:810;;35216:10;35229;;35240:1;35229:13;;;;;;;;;;;;;-1:-1:-1;;;;;35229:13:0;35216:26;;35279:1;-1:-1:-1;;;;;35265:16:0;:2;-1:-1:-1;;;;;35265:16:0;;;35257:51;;;;;-1:-1:-1;;;35257:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35325:13;35341:6;;35348:1;35341:9;;;;;;;;;;;;;35325:25;;35369:5;35378:1;35369:10;35365:554;;35424:18;;;35469:26;;;35461:61;;;;;-1:-1:-1;;;35461:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35554:13;35541:26;;35600:2;-1:-1:-1;;;;;35590:12:0;:6;-1:-1:-1;;;;;35590:12:0;;35586:318;;-1:-1:-1;;;;;35627:13:0;;;;;;:9;:13;;;;;:22;;;;;;35586:318;;;35715:7;35706:5;:16;;35698:56;;;;;-1:-1:-1;;;35698:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35777:31;;;;35586:318;35365:554;;35955:2;-1:-1:-1;;;;;35938:27:0;35947:6;-1:-1:-1;;;;;35938:27:0;;35959:5;35938:27;;;;;;;;;;;;;;;;;;-1:-1:-1;;35196:3:0;;35167:810;;;-1:-1:-1;35993:15:0;;;;;:55;;;36026:22;36012:10;:36;;35993:55;35989:386;;;36086:20;;;36129;;;36121:60;;;;;-1:-1:-1;;;36121:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36252:17:0;;;;;;:9;:17;;;;;36272:35;;;36252:55;;35989:386;-1:-1:-1;36392:4:0;;34758:1646;-1:-1:-1;;;;;;;;;34758:1646:0:o;6688:96::-;6743:7;6770:6;-1:-1:-1;;;;;6770:6:0;6688:96;:::o;31605:98::-;31688:7;31681:14;;;;;;;;-1:-1:-1;;31681:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31655:13;;31681:14;;31688:7;;31681:14;;31688:7;31681:14;;;;;;;;;;;;;;;;;;;;;;;;33805:281;33909:4;-1:-1:-1;;;;;33934:21:0;;33926:61;;;;;-1:-1:-1;;;33926:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33998:58;34017:12;:10;:12::i;:::-;34031:7;34040:15;33998:18;:58::i;34131:161::-;34211:4;34228:34;34238:12;:10;:12::i;:::-;34252:2;34256:5;34228:9;:34::i;39025:485::-;39192:4;39209:14;39226:12;:10;:12::i;:::-;39209:29;;39249:39;39263:6;39271:4;39277:2;39281:6;39249:13;:39::i;:::-;39303:15;:2;-1:-1:-1;;;;;39303:13:0;;:15::i;:::-;39299:182;;;-1:-1:-1;;;39343:98:0;;;39358:2;-1:-1:-1;;;;;39343:34:0;;39378:6;39386:4;39392:6;39400:4;;39343:62;;;;;;;;;;;;;-1:-1:-1;;;;;39343:62:0;;;;;;-1:-1:-1;;;;;39343:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39343:62:0;-1:-1:-1;;;;;;39343:98:0;;39335:134;;;;;-1:-1:-1;;;39335:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39498:4:0;;39025:485;-1:-1:-1;;;;;;39025:485:0:o;9867:522::-;10041:31;10059:12;:10;:12::i;10041:31::-;10100:8;10134:26;;;:55;;;;-1:-1:-1;10164:25:0;;;10134:55;10126:94;;;;;-1:-1:-1;;;10126:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10236:9;10231:151;10256:6;10251:1;:11;10231:151;;10303:9;;10313:1;10303:12;;;;;;;;;;;;;-1:-1:-1;;;;;10303:12:0;-1:-1:-1;;;;;10284:45:0;;10338:4;10345:8;;10354:1;10345:11;;;;;;;;;;;;;-1:-1:-1;;;;;10345:11:0;10358:8;;10367:1;10358:11;;;;;;;;;;;;;10284:86;;;;;;;;;;;;;-1:-1:-1;;;;;10284:86:0;;;;;;-1:-1:-1;;;;;10284:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10264:3;;;;;10231:151;;47175:32;;;-1:-1:-1;;;;;47175:32:0;;:::o;28638:42::-;;;:::o;54831:191::-;54948:11;;54937:34;;;;;;;;;;-1:-1:-1;54925:8:0;:46;;54937:34;;54925:46;;;;;54982:32;54996:4;55002:11;;54982:13;:32::i;:::-;54831:191;;;:::o;39713:727::-;-1:-1:-1;;;;;39940:19:0;;39932:57;;;;;-1:-1:-1;;;39932:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40027:8;40008:15;:27;;40000:61;;;;;-1:-1:-1;;;40000:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40154:13:0;;;40072:18;40154:13;;;:6;:13;;;;;;;;:15;;;;;;;40103:77;;28563:66;40103:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40093:88;;;;;;;;40246:18;:16;:18::i;:::-;40266:10;40217:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40207:71;;;;;;40192:86;;40289:14;40306:24;40316:4;40322:1;40325;40328;40306:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40289:41;;40359:5;-1:-1:-1;;;;;40349:15:0;:6;-1:-1:-1;;;;;40349:15:0;;40341:49;;;;;-1:-1:-1;;;40341:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40401:31;40410:5;40417:7;40426:5;40401:8;:31::i;:::-;39713:727;;;;;;;;;;:::o;32570:151::-;-1:-1:-1;;;;;32686:18:0;;;32659:7;32686:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32570:151::o;54686:137::-;54752:31;54770:12;:10;:12::i;54752:31::-;54794:21;;;;:9;;:21;;;;;:::i;:::-;;54686:137;:::o;38487:450::-;38627:4;38644:14;38661:12;:10;:12::i;:::-;38644:29;;38684;38694:6;38702:2;38706:6;38684:9;:29::i;:::-;38728:15;:2;-1:-1:-1;;;;;38728:13:0;;:15::i;:::-;38724:184;;;-1:-1:-1;;;38768:100:0;;;38783:2;-1:-1:-1;;;;;38768:34:0;;38803:6;38811;38819;38827:4;;38768:64;;;;;;;;;;;;;-1:-1:-1;;;;;38768:64:0;;;;;;-1:-1:-1;;;;;38768:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38768:64:0;-1:-1:-1;;;;;;38768:100:0;;38760:136;;;;;-1:-1:-1;;;38760:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38925:4:0;;38487:450;-1:-1:-1;;;;;38487:450:0:o;7031:201::-;7111:31;7129:12;:10;:12::i;7111:31::-;7153:6;:17;;;;-1:-1:-1;;;;;7153:17:0;;;;;;;;;7186:38;;7153:17;;7207:6;;;7186:38;;7153:6;7186:38;7031:201;:::o;30686:620::-;30771:4;-1:-1:-1;;;;;;30808:40:0;;30823:25;30808:40;;:96;;-1:-1:-1;;;;;;;30865:39:0;;30880:24;30865:39;30808:96;:160;;;-1:-1:-1;;;;;;;30921:47:0;;30936:32;30921:47;30808:160;:224;;;-1:-1:-1;;;;;;;30985:47:0;;31000:32;30985:47;30808:224;:289;;;-1:-1:-1;;;;;;;31049:48:0;;31064:33;31049:48;30808:289;:359;;;-1:-1:-1;;;;;;;31114:53:0;;31129:38;31114:53;30808:359;:428;;;-1:-1:-1;;;;;;;31184:52:0;;31199:37;31184:52;30808:428;:490;;;-1:-1:-1;;;;;;;;31253:45:0;31268:30;31253:45;;30686:620::o;46468:208::-;46553:4;-1:-1:-1;;;;;;46577:40:0;;46592:25;46577:40;;:91;;-1:-1:-1;;;;;;;;46621:47:0;-1:-1:-1;;;46621:47:0;;46468:208::o;56255:185::-;56360:15;56395:37;:35;:37::i;:::-;56388:44;;56255:185;:::o;40558:281::-;-1:-1:-1;;;;;40685:21:0;;40677:61;;;;;-1:-1:-1;;;40677:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40749:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;40800:31;;;;;;;;;;;;;;;;;40558:281;;;:::o;42132:273::-;42275:26;42285:4;42291:2;42295:5;42275:9;:26::i;:::-;42324:6;-1:-1:-1;;;;;42316:14:0;:4;-1:-1:-1;;;;;42316:14:0;;42312:86;;42347:39;42366:4;42372:6;42380:5;42347:18;:39::i;:::-;42132:273;;;;:::o;49178:201::-;49238:14;49255:12;:10;:12::i;:::-;49238:29;;49278:52;49292:6;49300;49316:4;49323:6;49278:13;:52::i;:::-;49346:25;;;-1:-1:-1;;;;;49346:25:0;;;;;;;;;;;;;;;;;;;;;;;49178:201;;:::o;30059:474::-;30372:16;;;;;;;30221:289;;;30254:95;30221:289;;;;;;;;;;;30411:14;30221:289;;;;;;;;;;;30486:4;30221:289;;;;;;;;;;;;;;;;;;;;;;;;;30193:332;;;;;;30059:474::o;40847:697::-;-1:-1:-1;;;;;41007:18:0;;;40986;41007;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;41051:31:0;;;;;:55;;-1:-1:-1;41086:20:0;;;41051:55;41047:438;;;41266:28;;;41317:25;;;41309:67;;;;;-1:-1:-1;;;41309:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41391:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:42;;;41421:12;-1:-1:-1;41047:438:0;41516:7;-1:-1:-1;;;;;41500:36:0;41509:5;-1:-1:-1;;;;;41500:36:0;;41525:10;41500:36;;;;;;;;;;;;;;;;;;40847:697;;;;:::o;50044:343::-;50222:6;50273:4;50249:12;:10;:12::i;:::-;-1:-1:-1;;;;;50249:29:0;;50241:66;;;;;-1:-1:-1;;;50241:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50323:23;;;-1:-1:-1;;;;;50323:23:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;50044:343:0;;;;;;;:::o;7363:138::-;7454:4;-1:-1:-1;;;;;7454:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7454:12:0;-1:-1:-1;;;;;7443:23:0;;;;;;7435:58;;;;;-1:-1:-1;;;7435:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1919:229;2081:58;;;-1:-1:-1;;;;;2081:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2104:23;2081:58;;;2046:94;;2074:5;;2046:27;:94::i;41552:572::-;-1:-1:-1;;;;;41682:16:0;;41674:51;;;;;-1:-1:-1;;;41674:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41742:10;;41738:336;;-1:-1:-1;;;;;41787:15:0;;41769;41787;;;:9;:15;;;;;;41838;;;41876:20;;;41868:60;;;;;-1:-1:-1;;;41868:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41955:2;-1:-1:-1;;;;;41947:10:0;:4;-1:-1:-1;;;;;41947:10:0;;41943:120;;-1:-1:-1;;;;;41978:15:0;;;;;;;:9;:15;;;;;;:28;;;42025:13;;;;;;:22;;;;;;41943:120;41738:336;;;42106:2;-1:-1:-1;;;;;42091:25:0;42100:4;-1:-1:-1;;;;;42091:25:0;;42110:5;42091:25;;;;;;;;;;;;;;;;;;41552:572;;;:::o;1106:387::-;1429:20;1477:8;;;1106:387::o;48634:248::-;48728:35;48750:12;:10;:12::i;:::-;48728:21;:35::i;:::-;48774:14;48802:11;;48791:34;;;;;;;;;;-1:-1:-1;48791:34:0;;-1:-1:-1;48836:38:0;48854:4;48861;48791:34;48836:9;:38::i;52431:922::-;52484:15;52540:10;52484:15;52586:27;:25;:27::i;:::-;52561:52;;52649:18;-1:-1:-1;;;;;52628:40:0;:9;-1:-1:-1;;;;;52628:40:0;;:76;;;;52685:19;-1:-1:-1;;;;;52672:32:0;:9;-1:-1:-1;;;;;52672:32:0;;52628:76;52624:169;;;52775:6;-1:-1:-1;52768:13:0;;-1:-1:-1;52768:13:0;52624:169;-1:-1:-1;;;;;53197:22:0;;53210:9;53197:22;;;;:78;;;53223:18;-1:-1:-1;;;;;53223:33:0;;53257:6;53265:9;53223:52;;;;;;;;;;;;;-1:-1:-1;;;;;53223:52:0;;;;;;-1:-1:-1;;;;;53223:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53223:52:0;53197:78;53193:124;;;53299:6;-1:-1:-1;53292:13:0;;-1:-1:-1;53292:13:0;53193:124;-1:-1:-1;53336:9:0;-1:-1:-1;52431:922:0;:::o;2675:892::-;2801:5;2826:19;-1:-1:-1;;;;;2826:17:0;;;:19::i;:::-;2818:58;;;;;-1:-1:-1;;;2818:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2950:12;2964:17;2985:6;-1:-1:-1;;;;;2985:11:0;2997:8;2985:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2949:57;;;;3021:7;3017:543;;;3049:11;;:16;3045:124;;3105:4;3094:24;;;;;;;;;;;;;;;-1:-1:-1;3094:24:0;3086:67;;;;;-1:-1:-1;;;3086:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3017:543;;;3260:11;;3256:97;;3297:40;;;-1:-1:-1;;;3297:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3256:97;3484:4;3478:11;3529:4;3522;3518:2;3514:13;3507:27;3447:102;2675:892;;;;;:::o;47444:148::-;47536:17;;-1:-1:-1;;;;;47525:28:0;;;47536:17;;47525:28;47517:67;;;;;-1:-1:-1;;;47517:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;50562:526;51045:23;51049:14;51045:23;51032:37;51028:2;51024:46;;50999:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://49ed424058a3077211d0319a6efee13b7806493e4c9a3a8e6fd909408a2a58ee
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.