Contract 0x6ebc0DAeD4Fa51D70b191646EFE28C8Bb5e9A5c8

Contract Overview

Balance:
0 Ether
Txn Hash Method
Block
From
To
Value
0x3bc66555c1ae8956e1ea562ccb80199fb89dac388da28349630aa85ae60a81430x60806040194493642020-07-06 20:04:36316 days 37 mins ago0x3c2c508e43ffab19a7e3a3bdbfe31a02970675c4 IN  Contract Creation0 Ether0.1045920420
[ Download CSV Export 
Latest 16 internal transactions
Parent Txn Hash Block From To Value
0xa34e2b8c4b5fe65119f4ffd5c84369429fda98f135b031baad140ce3d4a5a783194594512020-07-07 10:06:12315 days 10 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0xa34e2b8c4b5fe65119f4ffd5c84369429fda98f135b031baad140ce3d4a5a783194594512020-07-07 10:06:12315 days 10 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0xa34e2b8c4b5fe65119f4ffd5c84369429fda98f135b031baad140ce3d4a5a783194594512020-07-07 10:06:12315 days 10 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0xa34e2b8c4b5fe65119f4ffd5c84369429fda98f135b031baad140ce3d4a5a783194594512020-07-07 10:06:12315 days 10 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x4cfc4c5840db1b837c5aa69fd63fca31592fdc376a8da492fb4c18a3d84957ac194588872020-07-07 9:19:12315 days 11 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x71a6dc36579c0923ed9ff33078fea0a49a3c3d10f9147f09fe2ec5d10b979317194588722020-07-07 9:17:56315 days 11 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x4f1a4db326d9a6b6c5149e7227fe9cebe59f629adcd18e25fc79631d33835d9e194588552020-07-07 9:16:32315 days 11 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x4f1a4db326d9a6b6c5149e7227fe9cebe59f629adcd18e25fc79631d33835d9e194588552020-07-07 9:16:32315 days 11 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x4f1a4db326d9a6b6c5149e7227fe9cebe59f629adcd18e25fc79631d33835d9e194588552020-07-07 9:16:32315 days 11 hrs ago 0x586a1f3fae69677b59b2eb50b940967969bbec1a 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0xc702766acb1c595323d7b3fb60288d55c334e892eecc666c87ed6cc037dea96e194588432020-07-07 9:15:32315 days 11 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0xc702766acb1c595323d7b3fb60288d55c334e892eecc666c87ed6cc037dea96e194588432020-07-07 9:15:32315 days 11 hrs ago 0x1d918512bf1cd99a277f889321081828d6aadaa3 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0xc702766acb1c595323d7b3fb60288d55c334e892eecc666c87ed6cc037dea96e194588432020-07-07 9:15:32315 days 11 hrs ago 0x586a1f3fae69677b59b2eb50b940967969bbec1a 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x1a21f212c5298c9dbfd50897fde2b9f0a4df43760904fc3271eb1dba6165f040194588352020-07-07 9:14:52315 days 11 hrs ago 0x586a1f3fae69677b59b2eb50b940967969bbec1a 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x1a21f212c5298c9dbfd50897fde2b9f0a4df43760904fc3271eb1dba6165f040194588352020-07-07 9:14:52315 days 11 hrs ago 0x586a1f3fae69677b59b2eb50b940967969bbec1a 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x1a21f212c5298c9dbfd50897fde2b9f0a4df43760904fc3271eb1dba6165f040194588352020-07-07 9:14:52315 days 11 hrs ago 0x586a1f3fae69677b59b2eb50b940967969bbec1a 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
0x1a21f212c5298c9dbfd50897fde2b9f0a4df43760904fc3271eb1dba6165f040194588352020-07-07 9:14:52315 days 11 hrs ago 0x586a1f3fae69677b59b2eb50b940967969bbec1a 0x6ebc0daed4fa51d70b191646efe28c8bb5e9a5c80 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Assets

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-07-06
*/

pragma solidity ^0.6.0;

/**
    @author The Calystral Team
    @title The ERC1155CalystralMixedFungibleMintable' Interface
*/
interface IERC1155CalystralMixedFungibleMintable {
    /**
        @dev MUST emit when a release timestamp is set or updated.
        The `typeId` argument MUST be the id of a type.
        The `timestamp` argument MUST be the timestamp of the release in seconds.
    */
    event OnReleaseTimestamp(uint256 indexed typeId, uint256 timestamp);

    /**
        @notice Updates the metadata base URI.
        @dev Updates the `_metadataBaseURI`.
        @param uri The metadata base URI
    */
    function updateMetadataBaseURI(string calldata uri) external;

    /**
        @notice Creates a non-fungible type.
        @dev Creates a non-fungible type. This function only creates the type and is not used for minting.
        The type also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param maxSupply        The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
        @return                 The `typeId`
    */
    function createNonFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        returns (uint256);

    /**
        @notice Creates a fungible type.
        @dev Creates a fungible type. This function only creates the type and is not used for minting.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param maxSupply        The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @param releaseTimestamp The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
        @return                 The `typeId`
    */
    function createFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        returns (uint256);

    /**
        @notice Mints a non-fungible type.
        @dev Mints a non-fungible type.
        Reverts if type id is not existing.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param typeId   The type which should be minted
        @param toArr    An array of receivers
    */
    function mintNonFungible(uint256 typeId, address[] calldata toArr) external;

    /**
        @notice Mints a fungible type.
        @dev Mints a fungible type.
        Reverts if array lengths are unequal.
        Reverts if type id is not existing.
        Reverts if out of stock.
        Emits the `TransferSingle` event.
        @param typeId   The type which should be minted
        @param toArr    An array of receivers
    */
    function mintFungible(
        uint256 typeId,
        address[] calldata toArr,
        uint256[] calldata quantitiesArr
    ) external;

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner or approved operator of the owner.
        Reverts if `_to` is the zero address.
        Reverts if balance of holder for token `_id` is lower than the `_value` sent.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param r            The r value of the signature
        @param s            The s value of the signature
        @param v            The v value of the signature
        @param signer       The signing account. This SHOULD be the owner of the asset or an approved operator of the owner.
        @param _to          Target address
        @param _id          ID of the token type
        @param _value       Transfer amount
        @param _data        Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSafeTransferFrom(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        Uses Meta Transactions - transactions are signed by the owner or operator of the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner or approved operator of the owner.
        Reverts if `_to` is the zero address.
        Reverts if length of `_ids` is not the same as length of `_values`.
        Reverts if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param r            The r value of the signature
        @param s            The s value of the signature
        @param v            The v value of the signature
        @param signer       The signing account. This SHOULD be the owner of the asset or an approved operator of the owner.
        @param _to          Target address
        @param _ids         IDs of each token type (order and length must match _values array)
        @param _values      Transfer amounts per token type (order and length must match _ids array)
        @param _data        Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSafeBatchTransferFrom(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Burns fungible and/or non-fungible tokens.
        @dev Sends FTs and/or NFTs to 0x0 address.
        Uses Meta Transactions - transactions are signed by the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner.
        Emits the `TransferBatch` event where the `to` argument is the 0x0 address.
        @param r The r value of the signature
        @param s The s value of the signature
        @param v The v value of the signature
        @param signer The signing account. This SHOULD be the owner of the asset
        @param ids An array of token Ids which should be burned
        @param values An array of amounts which should be burned. The order matches the order in the ids array
        @param nonce Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaBatchBurn(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        uint256[] calldata ids,
        uint256[] calldata values,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        Uses Meta Transactions - transactions are signed by the owner but are executed by anybody.
        Reverts if the signature is invalid.
        Reverts if array lengths are unequal.
        Reverts if the transaction expired.
        Reverts if the transaction was executed already.
        Reverts if the signer is not the asset owner.
        @param r            The r value of the signature
        @param s            The s value of the signature
        @param v            The v value of the signature
        @param signer       The signing account. This SHOULD be the owner of the asset
        @param _operator    Address to add to the set of authorized operators
        @param _approved    True if the operator is approved, false to revoke approval
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
    */
    function metaSetApprovalForAll(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        address _operator,
        bool _approved,
        uint256 nonce,
        uint256 maxTimestamp
    ) external;

    /**
        @notice Sets a release timestamp.
        @dev Sets a release timestamp.
        Reverts if `timestamp` == 0.
        Reverts if the `typeId` is released already.
        @param typeId       The type which should be set or updated
        @param timestamp    The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
    */
    function setReleaseTimestamp(uint256 typeId, uint256 timestamp) external;

    /**
        @notice Get the release timestamp of a type.
        @dev Get the release timestamp of a type.
        @return The release timestamp of a type.
    */
    function getReleaseTimestamp(uint256 typeId)
        external
        view
        returns (uint256);

    /**
        @notice Get all existing type Ids.
        @dev Get all existing type Ids.
        @return An array of all existing type Ids.
    */
    function getTypeIds() external view returns (uint256[] memory);

    /**
        @notice Get a specific type Id.
        @dev Get a specific type Id.
        Reverts if `typeNonce` is 0 or if it does not exist.
        @param  typeNonce The type nonce for which the id is requested
        @return A specific type Id.
    */
    function getTypeId(uint256 typeNonce) external view returns (uint256);

    /**
        @notice Get all non-fungible assets for a specific user.
        @dev Get all non-fungible assets for a specific user.
        @param  owner The address of the requested user
        @return An array of Ids that are owned by the user
    */
    function getNonFungibleAssets(address owner)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Get all fungible assets for a specific user.
        @dev Get all fungible assets for a specific user.
        @param  owner The address of the requested user
        @return An array of Ids that are owned by the user
                An array for the amount owned of each Id
    */
    function getFungibleAssets(address owner)
        external
        view
        returns (uint256[] memory, uint256[] memory);

    /**
        @notice Get the type nonce.
        @dev Get the type nonce.
        @return The type nonce.
    */
    function getTypeNonce() external view returns (uint256);

    /**
        @notice The amount of tokens that have been minted of a specific type.
        @dev    The amount of tokens that have been minted of a specific type.
                Reverts if the given typeId does not exist.
        @param  typeId The requested type
        @return The minted amount
    */
    function getMintedSupply(uint256 typeId) external view returns (uint256);

    /**
        @notice The amount of tokens that can be minted of a specific type.
        @dev    The amount of tokens that can be minted of a specific type.
                Reverts if the given typeId does not exist.
        @param  typeId The requested type
        @return The maximum mintable amount
    */
    function getMaxSupply(uint256 typeId) external view returns (uint256);

    /**
        @notice Get the burn nonce of a specific user.
        @dev    Get the burn nonce of a specific user / signer.
        @param  signer The requested signer
        @return The burn nonce of a specific user
    */
    function getMetaNonce(address signer) external view returns (uint256);
}

/**
    Note: The ERC-165 identifier for this interface is 0x0e89341c.
*/
interface IERC1155Metadata_URI {
    /**
        @notice A distinct Uniform Resource Identifier (URI) for a given token.
        @dev URIs are defined in RFC 3986.
        The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".        
        @return URI string
    */
    function uri(uint256 _id) external view returns (string memory);
}

/*
Begin solidity-cborutils
https://github.com/smartcontractkit/solidity-cborutils

MIT License

Copyright (c) 2018 SmartContract ChainLink, Ltd.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

library Strings {
    function strConcat(string memory _a, string memory _b)
        internal
        pure
        returns (string memory _concatenatedString)
    {
        return strConcat(_a, _b, "", "", "");
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c
    ) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c,
        string memory _d
    ) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c,
        string memory _d,
        string memory _e
    ) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(
            _ba.length + _bb.length + _bc.length + _bd.length + _be.length
        );
        bytes memory babcde = bytes(abcde);
        uint256 k = 0;
        uint256 i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }

    function uint2str(uint256 _i)
        internal
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len - 1;
        while (_i != 0) {
            bstr[k--] = bytes1(uint8(48 + (_i % 10)));
            _i /= 10;
        }
        return string(bstr);
    }
}

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSACalystral {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 s,
        uint8 v
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range
        // for r in (280): 0 < r < secp256k1n
        // for s in (281): 0 < s < secp256k1n ÷ 2 + 1,
        // for v in (282): v ∈ {27, 28}.
        // Most signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (
            uint256(r) >=
            0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
        ) {
            revert("ECDSA: invalid signature 'r' value");
        }
        if (
            uint256(s) >
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
        ) {
            revert("ECDSA: invalid signature 's' value");
        }

        if (v != 27 && v != 28) {
            revert("ECDSA: invalid signature 'v' value");
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * replicates the behavior of the
     * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
     * JSON-RPC method.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }
}

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

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        override
        view
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * Utility library of inline functions on addresses
 */
library Address {
    /**
     * Returns whether the target address is a contract
     * @dev This function will return false if invoked during the constructor of a contract,
     * as the code is not actually created until after the constructor finishes.
     * @param account address of the account to check
     * @return whether the target address is a contract
     */
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // XXX Currently there is no better way to check if there is a contract in an address
        // than to check the size of the code at that address.
        // See https://ethereum.stackexchange.com/a/14016/36603
        // for more details about how this works.
        // TODO Check this again before the Serenity release, because all addresses will be
        // contracts then.
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

/**
    Note: Simple contract to use as base for const vals
*/
contract CommonConstants {
    bytes4 internal constant ERC1155_ACCEPTED = 0xf23a6e61; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant ERC1155_BATCH_ACCEPTED = 0xbc197c81; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
}

/**
    Note: The ERC-165 identifier for this interface is 0x4e2312e0.
*/
interface ERC1155TokenReceiver {
    /**
        @notice Handle the receipt of a single ERC1155 token type.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated.
        This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61) if it accepts the transfer.
        This function MUST revert if it rejects the transfer.
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _id        The ID of the token being transferred
        @param _value     The amount of tokens being transferred
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    */
    function onERC1155Received(
        address _operator,
        address _from,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external returns (bytes4);

    /**
        @notice Handle the receipt of multiple ERC1155 token types.
        @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated.
        This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81) if it accepts the transfer(s).
        This function MUST revert if it rejects the transfer(s).
        Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
        @param _operator  The address which initiated the batch transfer (i.e. msg.sender)
        @param _from      The address which previously owned the token
        @param _ids       An array containing ids of each token being transferred (order and length must match _values array)
        @param _values    An array containing amounts of each token being transferred (order and length must match _ids array)
        @param _data      Additional data with no specified format
        @return           `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    */
    function onERC1155BatchReceived(
        address _operator,
        address _from,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external returns (bytes4);
}

/**
    @title ERC-1155 Multi Token Standard
    @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md
    Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    /* is ERC165 */
    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_id` argument MUST be the token type being transferred.
        The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferSingle(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256 _id,
        uint256 _value
    );

    /**
        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see "Safe Transfer Rules" section of the standard).
        The `_operator` argument MUST be msg.sender.
        The `_from` argument MUST be the address of the holder whose balance is decreased.
        The `_to` argument MUST be the address of the recipient whose balance is increased.
        The `_ids` argument MUST be the list of tokens being transferred.
        The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.
        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).
        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).
    */
    event TransferBatch(
        address indexed _operator,
        address indexed _from,
        address indexed _to,
        uint256[] _ids,
        uint256[] _values
    );

    /**
        @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled).
    */
    event ApprovalForAll(
        address indexed _owner,
        address indexed _operator,
        bool _approved
    );

    /**
        @dev MUST emit when the URI is updated for a token ID.
        URIs are defined in RFC 3986.
        The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
    */
    event URI(string _value, uint256 indexed _id);

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
        MUST revert on any other error.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _id      ID of the token type
        @param _value   Transfer amount
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external;

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if length of `_ids` is not the same as length of `_values`.
        MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST revert on any other error.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _ids     IDs of each token type (order and length must match _values array)
        @param _values  Transfer amounts per token type (order and length must match _ids array)
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
    */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external;

    /**
        @notice Get the balance of an account's Tokens.
        @param _owner  The address of the token holder
        @param _id     ID of the Token
        @return        The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id)
        external
        view
        returns (uint256);

    /**
        @notice Get the balance of multiple account/token pairs
        @param _owners The addresses of the token holders
        @param _ids    ID of the Tokens
        @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        view
        returns (uint256[] memory);

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        @param _operator  Address to add to the set of authorized operators
        @param _approved  True if the operator is approved, false to revoke approval
    */
    function setApprovalForAll(address _operator, bool _approved) external;

    /**
        @notice Queries the approval status of an operator for a given owner.
        @param _owner     The owner of the Tokens
        @param _operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */
    function isApprovedForAll(address _owner, address _operator)
        external
        view
        returns (bool);
}

// A sample implementation of core ERC1155 function.
contract ERC1155 is IERC1155, ERC165, CommonConstants {
    using SafeMath for uint256;
    using Address for address;

    // id => (owner => balance)
    mapping(uint256 => mapping(address => uint256)) internal balances;

    // owner => (operator => approved)
    mapping(address => mapping(address => bool)) internal operatorApproval;

    /////////////////////////////////////////// ERC1155 //////////////////////////////////////////////

    constructor() public {
        _registerInterface(type(IERC1155).interfaceId); // 0xd9b67a26
    }

    /**
        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.
        MUST revert on any other error.
        MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard).
        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _id      ID of the token type
        @param _value   Transfer amount
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`
    */
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external virtual override {
        require(_to != address(0x0), "_to must be non-zero.");
        require(
            _from == msg.sender || operatorApproval[_from][msg.sender] == true,
            "Need operator approval for 3rd party transfers."
        );

        // SafeMath will throw with insuficient funds _from
        // or if _id is not valid (balance will be 0)
        balances[_id][_from] = balances[_id][_from].sub(_value);
        balances[_id][_to] = _value.add(balances[_id][_to]);

        // MUST emit event
        emit TransferSingle(msg.sender, _from, _to, _id, _value);

        // Now that the balance is updated and the event was emitted,
        // call onERC1155Received if the destination is a contract.
        if (_to.isContract()) {
            _doSafeTransferAcceptanceCheck(
                msg.sender,
                _from,
                _to,
                _id,
                _value,
                _data
            );
        }
    }

    /**
        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).
        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard).
        MUST revert if `_to` is the zero address.
        MUST revert if length of `_ids` is not the same as length of `_values`.
        MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.
        MUST revert on any other error.
        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard).
        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).
        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard).
        @param _from    Source address
        @param _to      Target address
        @param _ids     IDs of each token type (order and length must match _values array)
        @param _values  Transfer amounts per token type (order and length must match _ids array)
        @param _data    Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`
    */
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external virtual override {
        // MUST Throw on errors
        require(_to != address(0x0), "destination address must be non-zero.");
        require(
            _ids.length == _values.length,
            "_ids and _values array lenght must match."
        );
        require(
            _from == msg.sender || operatorApproval[_from][msg.sender] == true,
            "Need operator approval for 3rd party transfers."
        );

        for (uint256 i = 0; i < _ids.length; ++i) {
            uint256 id = _ids[i];
            uint256 value = _values[i];

            // SafeMath will throw with insuficient funds _from
            // or if _id is not valid (balance will be 0)
            balances[id][_from] = balances[id][_from].sub(value);
            balances[id][_to] = value.add(balances[id][_to]);
        }

        // Note: instead of the below batch versions of event and acceptance check you MAY have emitted a TransferSingle
        // event and a subsequent call to _doSafeTransferAcceptanceCheck in above loop for each balance change instead.
        // Or emitted a TransferSingle event for each in the loop and then the single _doSafeBatchTransferAcceptanceCheck below.
        // However it is implemented the balance changes and events MUST match when a check (i.e. calling an external contract) is done.

        // MUST emit event
        emit TransferBatch(msg.sender, _from, _to, _ids, _values);

        // Now that the balances are updated and the events are emitted,
        // call onERC1155BatchReceived if the destination is a contract.
        if (_to.isContract()) {
            _doSafeBatchTransferAcceptanceCheck(
                msg.sender,
                _from,
                _to,
                _ids,
                _values,
                _data
            );
        }
    }

    /**
        @notice Get the balance of an account's Tokens.
        @param _owner  The address of the token holder
        @param _id     ID of the Token
        @return        The _owner's balance of the Token type requested
     */
    function balanceOf(address _owner, uint256 _id)
        external
        virtual
        override
        view
        returns (uint256)
    {
        // The balance of any account can be calculated from the Transfer events history.
        // However, since we need to keep the balances to validate transfer request,
        // there is no extra cost to also privide a querry function.
        return balances[_id][_owner];
    }

    /**
        @notice Get the balance of multiple account/token pairs
        @param _owners The addresses of the token holders
        @param _ids    ID of the Tokens
        @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
     */
    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        virtual
        override
        view
        returns (uint256[] memory)
    {
        require(_owners.length == _ids.length);

        uint256[] memory balances_ = new uint256[](_owners.length);

        for (uint256 i = 0; i < _owners.length; ++i) {
            balances_[i] = balances[_ids[i]][_owners[i]];
        }

        return balances_;
    }

    /**
        @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens.
        @dev MUST emit the ApprovalForAll event on success.
        @param _operator  Address to add to the set of authorized operators
        @param _approved  True if the operator is approved, false to revoke approval
    */
    function setApprovalForAll(address _operator, bool _approved)
        external
        override
    {
        operatorApproval[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /**
        @notice Queries the approval status of an operator for a given owner.
        @param _owner     The owner of the Tokens
        @param _operator  Address of authorized operator
        @return           True if the operator is approved, false if not
    */
    function isApprovedForAll(address _owner, address _operator)
        external
        override
        view
        returns (bool)
    {
        return operatorApproval[_owner][_operator];
    }

    /////////////////////////////////////////// Internal //////////////////////////////////////////////

    function _doSafeTransferAcceptanceCheck(
        address _operator,
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes memory _data
    ) internal {
        // If this was a hybrid standards solution you would have to check ERC165(_to).supportsInterface(0x4e2312e0) here but as this is a pure implementation of an ERC-1155 token set as recommended by
        // the standard, it is not necessary. The below should revert in all failure cases i.e. _to isn't a receiver, or it is and either returns an unknown value or it reverts in the call to indicate non-acceptance.

        // Note: if the below reverts in the onERC1155Received function of the _to address you will have an undefined revert reason returned rather than the one in the require test.
        // If you want predictable revert reasons consider using low level _to.call() style instead so the revert does not bubble up and you can revert yourself on the ERC1155_ACCEPTED test.
        require(
            ERC1155TokenReceiver(_to).onERC1155Received(
                _operator,
                _from,
                _id,
                _value,
                _data
            ) == ERC1155_ACCEPTED,
            "contract returned an unknown value from onERC1155Received"
        );
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address _operator,
        address _from,
        address _to,
        uint256[] memory _ids,
        uint256[] memory _values,
        bytes memory _data
    ) internal {
        // If this was a hybrid standards solution you would have to check ERC165(_to).supportsInterface(0x4e2312e0) here but as this is a pure implementation of an ERC-1155 token set as recommended by
        // the standard, it is not necessary. The below should revert in all failure cases i.e. _to isn't a receiver, or it is and either returns an unknown value or it reverts in the call to indicate non-acceptance.

        // Note: if the below reverts in the onERC1155BatchReceived function of the _to address you will have an undefined revert reason returned rather than the one in the require test.
        // If you want predictable revert reasons consider using low level _to.call() style instead so the revert does not bubble up and you can revert yourself on the ERC1155_BATCH_ACCEPTED test.
        require(
            ERC1155TokenReceiver(_to).onERC1155BatchReceived(
                _operator,
                _from,
                _ids,
                _values,
                _data
            ) == ERC1155_BATCH_ACCEPTED,
            "contract returned an unknown value from onERC1155BatchReceived"
        );
    }
}

/**
    @dev Extension to ERC1155 for Mixed Fungible and Non-Fungible Items support
    The main benefit is sharing of common type information, just like you do when
    creating a fungible id.
*/
contract ERC1155MixedFungible is ERC1155 {
    // Use a split bit implementation.
    // Store the type in the upper 128 bits..
    uint256 constant TYPE_MASK = uint256(uint128(~0)) << 128;

    // ..and the non-fungible index in the lower 128
    uint256 constant NF_INDEX_MASK = uint128(~0);

    // The top bit is a flag to tell if this is a NFI.
    uint256 constant TYPE_NF_BIT = 1 << 255;

    mapping(uint256 => address) nfOwners;

    // Only to make code clearer. Should not be functions
    function isNonFungible(uint256 _id) public pure returns (bool) {
        return _id & TYPE_NF_BIT == TYPE_NF_BIT;
    }

    function isFungible(uint256 _id) public pure returns (bool) {
        return _id & TYPE_NF_BIT == 0;
    }

    function getNonFungibleIndex(uint256 _id) public pure returns (uint256) {
        return _id & NF_INDEX_MASK;
    }

    function getNonFungibleBaseType(uint256 _id) public pure returns (uint256) {
        return _id & TYPE_MASK;
    }

    function isNonFungibleBaseType(uint256 _id) public pure returns (bool) {
        // A base type has the NF bit but does not have an index.
        return (_id & TYPE_NF_BIT == TYPE_NF_BIT) && (_id & NF_INDEX_MASK == 0);
    }

    function isNonFungibleItem(uint256 _id) public pure returns (bool) {
        // A base type has the NF bit but does has an index.
        return (_id & TYPE_NF_BIT == TYPE_NF_BIT) && (_id & NF_INDEX_MASK != 0);
    }

    function ownerOf(uint256 _id) public view returns (address) {
        return nfOwners[_id];
    }

    // override
    function safeTransferFrom(
        address _from,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data
    ) external override {
        require(_to != address(0x0), "cannot send to zero address");
        require(
            _from == msg.sender || operatorApproval[_from][msg.sender] == true,
            "Need operator approval for 3rd party transfers."
        );

        if (isNonFungible(_id)) {
            require(nfOwners[_id] == _from);
            nfOwners[_id] = _to;
            // You could keep balance of NF type in base type id like so:
            // uint256 baseType = getNonFungibleBaseType(_id);
            // balances[baseType][_from] = balances[baseType][_from].sub(_value);
            // balances[baseType][_to]   = balances[baseType][_to].add(_value);
        } else {
            balances[_id][_from] = balances[_id][_from].sub(_value);
            balances[_id][_to] = balances[_id][_to].add(_value);
        }

        emit TransferSingle(msg.sender, _from, _to, _id, _value);

        if (_to.isContract()) {
            _doSafeTransferAcceptanceCheck(
                msg.sender,
                _from,
                _to,
                _id,
                _value,
                _data
            );
        }
    }

    // override
    function safeBatchTransferFrom(
        address _from,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data
    ) external override {
        require(_to != address(0x0), "cannot send to zero address");
        require(_ids.length == _values.length, "Array length must match");

        // Only supporting a global operator approval allows us to do only 1 check and not to touch storage to handle allowances.
        require(
            _from == msg.sender || operatorApproval[_from][msg.sender] == true,
            "Need operator approval for 3rd party transfers."
        );

        for (uint256 i = 0; i < _ids.length; ++i) {
            // Cache value to local variable to reduce read costs.
            uint256 id = _ids[i];
            uint256 value = _values[i];

            if (isNonFungible(id)) {
                require(nfOwners[id] == _from);
                nfOwners[id] = _to;
            } else {
                balances[id][_from] = balances[id][_from].sub(value);
                balances[id][_to] = value.add(balances[id][_to]);
            }
        }

        emit TransferBatch(msg.sender, _from, _to, _ids, _values);

        if (_to.isContract()) {
            _doSafeBatchTransferAcceptanceCheck(
                msg.sender,
                _from,
                _to,
                _ids,
                _values,
                _data
            );
        }
    }

    function balanceOf(address _owner, uint256 _id)
        external
        override
        view
        returns (uint256)
    {
        if (isNonFungibleItem(_id)) return nfOwners[_id] == _owner ? 1 : 0;
        return balances[_id][_owner];
    }

    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)
        external
        override
        view
        returns (uint256[] memory)
    {
        require(_owners.length == _ids.length);

        uint256[] memory balances_ = new uint256[](_owners.length);

        for (uint256 i = 0; i < _owners.length; ++i) {
            uint256 id = _ids[i];
            if (isNonFungibleItem(id)) {
                balances_[i] = nfOwners[id] == _owners[i] ? 1 : 0;
            } else {
                balances_[i] = balances[id][_owners[i]];
            }
        }

        return balances_;
    }
}

/**
    @author The Calystral Team
    @title A parent contract which can be used to keep track of a current contract state
*/
contract ContractState {
    /// @dev Get the current contract state enum.
    State private _currentState;
    /**
        @dev Get the current contract state enum.
        First activation == 1.
    */
    uint256 private _activatedCounter;
    /**
        @dev Get the current contract state enum.
        First inactivation == 1.
    */
    uint256 private _inactivatedCounter;
    /// @dev Includes all three possible contract states.
    enum State {CREATED, INACTIVE, ACTIVE}

    modifier isCurrentState(State _state) {
        _isCurrentState(_state);
        _;
    }

    modifier isCurrentStates(State _state1, State _state2) {
        _isCurrentStates(_state1, _state2);
        _;
    }

    modifier isAnyState() {
        _;
    }

    /**
        @notice Get the current contract state.
        @dev Get the current contract state enum.
        @return The current contract state
    */
    function getCurrentState() public view returns (State) {
        return _currentState;
    }

    /**
        @notice Get the current activated counter.
        @dev Get the current activated counter.
        @return The current activated counter.
    */
    function getActivatedCounter() public view returns (uint256) {
        return _activatedCounter;
    }

    /**
        @notice Get the current inactivated counter.
        @dev Get the current inactivated counter.
        @return The current inactivated counter.
    */
    function getInactivatedCounter() public view returns (uint256) {
        return _inactivatedCounter;
    }

    /**
        @dev Checks if the contract is in the correct state for execution.
        MUST revert if the `_currentState` does not match with the required `_state`.
    */
    function _isCurrentState(State _state) internal view {
        require(
            _currentState == _state,
            "The function call is not possible in the current contract state."
        );
    }

    /**
        @dev Checks if the contract is in one of the correct states for execution.
        MUST revert if the `_currentState` does not match with one of the required states `_state1`, `_state2`.
    */
    function _isCurrentStates(State _state1, State _state2) internal view {
        require(
            _currentState == _state1 || _currentState == _state2,
            "The function call is not possible in the current contract state."
        );
    }

    /**
        @dev Modifies the contract state from State.CREATED or State.ACTIVE into State.INACTIVE.
        Increments the `_inactivatedCounter`.
    */
    function _transitionINACTIVE()
        internal
        isCurrentStates(State.CREATED, State.ACTIVE)
    {
        _currentState = State.INACTIVE;
        _inactivatedCounter++;
        _inactivated(_inactivatedCounter);
    }

    /**
        @dev Modifies the contract state from State.INACTIVE into State.ACTIVE.
        Increments the `_activatedCounter`.
    */
    function _transitionACTIVE() internal isCurrentState(State.INACTIVE) {
        _currentState = State.ACTIVE;
        _activatedCounter++;
        _activated(_activatedCounter);
    }

    /**
        @dev Executes when the contract is set into State.ACTIVE.
        The child contract has to override this function to make use of it.
        The `activatedCouted` parameter is used to execute this function at a specific time only once.
        @param activatedCounter The `activatedCouted` for which the function should be executed once.
    */
    function _activated(uint256 activatedCounter)
        internal
        virtual
        isCurrentState(State.ACTIVE)
    {}

    /**
        @dev Executes when the contract is set into State.INACTIVE.
        The child contract has to override this function to make use of it.
        The `inactivatedCouted` parameter is used to execute this function at a specific time only once.
        @param inactivatedCounter The `inactivatedCouted` for which the function should be executed once.
    */
    function _inactivated(uint256 inactivatedCounter)
        internal
        virtual
        isCurrentState(State.INACTIVE)
    {}
}

/**
    @author The Calystral Team
    @title The Registry's Interface
*/
interface IRegistry {
    /**
        @notice Updates an incoming contract address for relevant contracts or itself. 
        @dev Updates an incoming contract address for relevant contracts or itself.
        Sets itself INACTIVE if it was updated by the registry.
        Sets itself ACTIVE if it was registered by the registry.
        @param contractAddress  The address of the contract update
        @param id               The id of the contract update
    */
    function updateContractAddress(address contractAddress, uint256 id)
        external;

    /**
        @notice Get the contract address of a specific id.
        @dev Get the contract address of a specific id.
        @param id   The contract id
        @return     The contract address of a specific id
    */
    function getContractAddress(uint256 id) external view returns (address);

    /**
        @notice Get if a specific id is relevant for this contract.
        @dev Get if a specific id is relevant for this contract.
        @param id   The contract id
        @return     If the id is relevant for this contract
    */
    function isIdRelevant(uint256 id) external view returns (bool);

    /**
        @notice Get the list of relevant contract ids.
        @dev Get the list of relevant contract ids.
        @return The list of relevant contract ids.
    */
    function getRelevantList() external view returns (uint16[] memory);

    /**
        @notice Get this contract's registry id.
        @dev Get this contract's `_registryId`.
        @return Get this contract's registry id.
    */
    function getRegistryId() external view returns (uint256);
}

/**
    @author The Calystral Team
    @title A parent contract which can be used to integrate with a global contract registry
*/
contract Registry is IRegistry, ContractState, ERC165 {
    /// @dev id => contract address
    mapping(uint256 => address) private _idToContractAddress;
    /// @dev id => a bool showing if it is relevant for updates etc.
    mapping(uint256 => bool) private _idToIsRelevant;
    /**
        @dev This list includes all Ids of contracts that are relevant for this contract listening on address updates in the future.
        This should be immutable but immutable variables cannot have a non-value type.
    */
    uint16[] private _relevantList;
    /**
        @dev The id of this contract.
        Id 0 does not exist but is just reserved.
        Whenever a contract is INACTIVE its id is set to 0.
    */
    uint256 private _registryId;

    modifier isAuthorizedRegistryManager() {
        _isAuthorizedRegistryManager();
        _;
    }

    modifier isAuthorizedAny() {
        _;
    }

    /**
        @notice Initialized and creates the contract including the address of the RegistryManager and a list of relevant contract ids. 
        @dev Creates the contract with an initialized `registryManagerAddress` and `relevantList`.
        Registers this interface for ERC-165.
        MUST revert if the `relevantList` does not include id 1 at index 0.
        @param registryManagerAddress   Address of the RegistryManager contract
        @param relevantList             Array of ids for contracts that are relevant for execution and are tracked for updates
    */
    constructor(address registryManagerAddress, uint16[] memory relevantList)
        public
    {
        require(
            relevantList[0] == 1,
            "The registry manager is required to create a registry type contract."
        );

        _idToContractAddress[1] = registryManagerAddress;
        _relevantList = relevantList;
        for (uint256 i = 0; i < relevantList.length; i++) {
            _idToIsRelevant[relevantList[i]] = true;
        }

        _registerInterface(type(IRegistry).interfaceId); // 0x7bbb2267
    }

    /**
        @notice Updates an incoming contract address for relevant contracts or itself. 
        @dev Updates an incoming contract address for relevant contracts or itself.
        Sets itself INACTIVE if it was updated by the registry.
        Sets itself ACTIVE if it was registered by the registry.
        @param contractAddress  The address of the contract update
        @param id               The id of the contract update
    */
    function updateContractAddress(address contractAddress, uint256 id)
        external
        override
        isCurrentStates(State.ACTIVE, State.INACTIVE)
        isAuthorizedRegistryManager()
    {
        // only execute if it's an relevant contract or this contract
        if (
            _idToIsRelevant[id] == true ||
            contractAddress == address(this) ||
            id == _registryId
        ) {
            // if this contract was updated, set INACTIVE
            if (id == _registryId) {
                _registryId = 0;
                _transitionINACTIVE();
            } else {
                // if this contract got registered, set ACTIVE
                if (contractAddress == address(this)) {
                    _registryId = id;
                    _transitionACTIVE();
                }
                _idToContractAddress[id] = contractAddress;
            }
        }
    }

    /**
        @notice Get the contract address of a specific id.
        @dev Get the contract address of a specific id.
        @param id   The contract id
        @return     The contract address of a specific id
    */
    function getContractAddress(uint256 id)
        public
        override
        view
        returns (address)
    {
        return _idToContractAddress[id];
    }

    /**
        @notice Get if a specific id is relevant for this contract.
        @dev Get if a specific id is relevant for this contract.
        @param id   The contract id
        @return     If the id is relevant for this contract
    */
    function isIdRelevant(uint256 id) public override view returns (bool) {
        return _idToIsRelevant[id];
    }

    /**
        @notice Get the list of relevant contract ids.
        @dev Get the list of relevant contract ids.
        @return The list of relevant contract ids.
    */
    function getRelevantList() public override view returns (uint16[] memory) {
        return _relevantList;
    }

    /**
        @notice Get this contract's registry id.
        @dev Get this contract's `_registryId`.
        @return Get this contract's registry id.
    */
    function getRegistryId() public override view returns (uint256) {
        return _registryId;
    }

    /**
        @dev Checks if the msg.sender is the RegistryManager.
        Reverts if msg.sender is not the RegistryManager.
    */
    function _isAuthorizedRegistryManager() internal view {
        require(
            msg.sender == _idToContractAddress[1],
            "Unauthorized call. Thanks for supporting the network with your ETH."
        );
    }
}

/**
    @author The Calystral Team
    @title A contract for the creation and minting of FTs and NFTS
    @dev Mintable form of ERC1155
*/
contract ERC1155CalystralMixedFungibleMintable is
    IERC1155CalystralMixedFungibleMintable,
    IERC1155Metadata_URI,
    ERC1155MixedFungible,
    Registry
{
    using Strings for string;

    /// @dev type id => minted supply
    mapping(uint256 => uint256) private _typeToMintedSupply;
    /// @dev type id => max supply
    mapping(uint256 => uint256) private _typeToMaxSupply;

    /// @dev type id => release timestamp
    mapping(uint256 => uint256) private _tokenTypeToReleaseTimestamp;
    /// @dev type nonce => type id
    mapping(uint256 => uint256) private _typeNonceToTypeId;

    /// @dev signer => burn nonce
    mapping(address => uint256) private _signerToMetaNonce;

    /// @dev A counter which is used to iterate over all existing type Ids. There is no type for _typeNonce 0.
    uint256 private _typeNonce;
    /// @dev Points to the base url of an api to receive meta data.
    string private _metadataBaseURI;

    /// @dev The maximum allowed supply for FTs and NFTs, half of uint256 is reserved for type and half for the index.
    uint256 private constant MAX_TYPE_SUPPLY = 2**128;

    modifier isAuthorizedAssetManager() {
        _isAuthorizedAssetManager();
        _;
    }

    modifier isValidTypeId(uint256 typeId) {
        _isValidTypeId(typeId);
        _;
    }

    /**
        @notice Initialized and creates the contract including the address of the RegistryManager and a list of relevant contract ids. 
        @dev Creates the contract with an initialized `registryManagerAddress` and `relevantList`.
        Registers this interface for ERC-165.
        Implements the Registry: Reverts if the `relevantList` does not include id 1 at index 0.
        @param registryManagerAddress   Address of the RegistryManager contract
        @param relevantList             Array of ids for contracts that are relevant for execution and are tracked for updates
    */
    constructor(address registryManagerAddress, uint16[] memory relevantList)
        public
        Registry(registryManagerAddress, relevantList)
        ERC1155()
    {
        _registerInterface(type(IERC1155Metadata_URI).interfaceId); // 0x0e89341c
    }

    function updateMetadataBaseURI(string calldata uri)
        external
        override
        isAnyState()
        isAuthorizedAssetManager()
    {
        _metadataBaseURI = uri;
    }

    function createNonFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        uint256 result = _create(true, maxSupply);
        _setReleaseTimestamp(result, releaseTimestamp);
        return result;
    }

    function createFungibleType(uint256 maxSupply, uint256 releaseTimestamp)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        uint256 result = _create(false, maxSupply);
        _setReleaseTimestamp(result, releaseTimestamp);
        return result;
    }

    function mintNonFungible(uint256 typeId, address[] calldata toArr)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidTypeId(typeId)
    {
        require(
            isNonFungible(typeId),
            "This typeId is not a non fungible type."
        );

        // Index are 1-based.
        uint256 index = _typeToMintedSupply[typeId] + 1;
        _typeToMintedSupply[typeId] += toArr.length;

        for (uint256 i = 0; i < toArr.length; ++i) {
            address to = toArr[i];
            uint256 id = typeId | (index + i);

            nfOwners[id] = to;

            emit TransferSingle(msg.sender, address(0x0), to, id, 1);

            if (to.isContract()) {
                _doSafeTransferAcceptanceCheck(
                    msg.sender,
                    msg.sender,
                    to,
                    id,
                    1,
                    ""
                );
            }
        }
        require(
            _typeToMintedSupply[typeId] <= _typeToMaxSupply[typeId],
            "Out of stock."
        );
    }

    function mintFungible(
        uint256 typeId,
        address[] calldata toArr,
        uint256[] calldata quantitiesArr
    )
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidTypeId(typeId)
    {
        require(isFungible(typeId), "This typeId is not a fungible type.");
        require(
            toArr.length == quantitiesArr.length,
            "Array length must match."
        );

        for (uint256 i = 0; i < toArr.length; ++i) {
            address to = toArr[i];
            uint256 quantity = quantitiesArr[i];

            // Grant the items to the caller
            balances[typeId][to] += quantity;
            _typeToMintedSupply[typeId] += quantity;

            // the 0x0 source address implies a mint
            // It will also provide the circulating supply info.
            emit TransferSingle(msg.sender, address(0x0), to, typeId, quantity);

            if (to.isContract()) {
                _doSafeTransferAcceptanceCheck(
                    msg.sender,
                    msg.sender,
                    to,
                    typeId,
                    quantity,
                    ""
                );
            }
        }
        require(
            _typeToMintedSupply[typeId] <= _typeToMaxSupply[typeId],
            "Out of stock."
        );
    }

    function metaSafeTransferFrom(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external virtual override isAnyState() isAuthorizedAny() {
        // Meta Transaction
        bytes32 dataHash = _getSafeTransferFromDataHash(
            signer,
            _to,
            _id,
            _value,
            _data,
            nonce,
            maxTimestamp
        );
        address signaturePublicKey = ECDSACalystral.recover(
            ECDSACalystral.toEthSignedMessageHash(dataHash),
            r,
            s,
            v
        );

        require(
            signer == signaturePublicKey ||
                operatorApproval[signer][signaturePublicKey] == true,
            "Need operator approval for 3rd party transfers."
        );
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );

        _signerToMetaNonce[signer]++;

        // Function Logic
        require(_to != address(0x0), "cannot send to zero address");

        if (isNonFungible(_id)) {
            require(nfOwners[_id] == signer);
            nfOwners[_id] = _to;
            // You could keep balance of NF type in base type id like so:
            // uint256 baseType = getNonFungibleBaseType(_id);
            // balances[baseType][signer] = balances[baseType][signer].sub(_value);
            // balances[baseType][_to]   = balances[baseType][_to].add(_value);
        } else {
            balances[_id][signer] = balances[_id][signer].sub(_value);
            balances[_id][_to] = balances[_id][_to].add(_value);
        }

        emit TransferSingle(msg.sender, signer, _to, _id, _value);

        if (_to.isContract()) {
            _doSafeTransferAcceptanceCheck(
                msg.sender,
                signer,
                _to,
                _id,
                _value,
                _data
            );
        }
    }

    function metaSafeBatchTransferFrom(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        address _to,
        uint256[] calldata _ids,
        uint256[] calldata _values,
        bytes calldata _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) external virtual override isAnyState() isAuthorizedAny() {
        // Meta Transaction
        address signaturePublicKey = ECDSACalystral.recover(
            ECDSACalystral.toEthSignedMessageHash(
                _getSafeBatchTransferFromDataHash(
                    signer,
                    _to,
                    _ids,
                    _values,
                    _data,
                    nonce,
                    maxTimestamp
                )
            ),
            r,
            s,
            v
        );

        require(
            signer == signaturePublicKey ||
                operatorApproval[signer][signaturePublicKey] == true,
            "Need operator approval for 3rd party transfers."
        );
        require(_ids.length == _values.length, "Array length must match.");
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );

        _signerToMetaNonce[signer]++;

        // Function Logic
        require(_to != address(0x0), "cannot send to zero address");
        require(_ids.length == _values.length, "Array length must match");

        for (uint256 i = 0; i < _ids.length; ++i) {
            if (isNonFungible(_ids[i])) {
                require(nfOwners[_ids[i]] == signer);
                nfOwners[_ids[i]] = _to;
            } else {
                balances[_ids[i]][signer] = balances[_ids[i]][signer].sub(
                    _values[i]
                );
                balances[_ids[i]][_to] = _values[i].add(balances[_ids[i]][_to]);
            }
        }

        emit TransferBatch(msg.sender, signer, _to, _ids, _values);

        if (_to.isContract()) {
            _doSafeBatchTransferAcceptanceCheck(
                msg.sender,
                signer,
                _to,
                _ids,
                _values,
                _data
            );
        }
    }

    function metaBatchBurn(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        uint256[] calldata ids,
        uint256[] calldata values,
        uint256 nonce,
        uint256 maxTimestamp
    ) external override isAnyState() isAuthorizedAssetManager() {
        // Meta Transaction
        bytes32 dataHash = _getBurnDataHash(ids, values, nonce, maxTimestamp);

        require(
            (
                ECDSACalystral.recover(
                    ECDSACalystral.toEthSignedMessageHash(dataHash),
                    r,
                    s,
                    v
                )
            ) == signer,
            "Invalid signature."
        );
        require(ids.length == values.length, "Array length must match.");
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );

        _signerToMetaNonce[signer]++;

        // Function Logic
        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];

            if (isNonFungible(id)) {
                require(nfOwners[id] == signer, "You are not the owner.");
                nfOwners[id] = address(0x0);
            } else {
                uint256 value = values[i];
                balances[id][signer] = balances[id][signer].sub(value);
            }
        }

        emit TransferBatch(msg.sender, signer, address(0x0), ids, values);
    }

    function metaSetApprovalForAll(
        bytes32 r,
        bytes32 s,
        uint8 v,
        address signer,
        address _operator,
        bool _approved,
        uint256 nonce,
        uint256 maxTimestamp
    ) external override isAnyState() isAuthorizedAny() {
        // Meta Transaction
        bytes32 dataHash = _getSetApprovalForAllHash(
            _operator,
            _approved,
            nonce,
            maxTimestamp
        );
        address signaturePublicKey = ECDSACalystral.recover(
            ECDSACalystral.toEthSignedMessageHash(dataHash),
            r,
            s,
            v
        );

        require(signaturePublicKey == signer, "Invalid signature.");
        require(
            block.timestamp < maxTimestamp,
            "This transaction is not valid anymore."
        );
        require(
            _signerToMetaNonce[signer] == nonce,
            "This transaction was executed already."
        );

        _signerToMetaNonce[signer]++;

        // Function Logic
        operatorApproval[signaturePublicKey][_operator] = _approved;
        emit ApprovalForAll(signaturePublicKey, _operator, _approved);
    }

    function setReleaseTimestamp(uint256 typeId, uint256 timestamp)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidTypeId(typeId)
    {
        _setReleaseTimestamp(typeId, timestamp);
    }

    function uri(uint256 _id) public override view returns (string memory) {
        return Strings.strConcat(_metadataBaseURI, Strings.uint2str(_id));
    }

    function getReleaseTimestamp(uint256 typeId)
        public
        override
        view
        isValidTypeId(typeId)
        returns (uint256)
    {
        return _tokenTypeToReleaseTimestamp[typeId];
    }

    function getTypeIds() public override view returns (uint256[] memory) {
        uint256[] memory resultIds = new uint256[](_typeNonce);
        for (uint256 i = 0; i < _typeNonce; i++) {
            resultIds[i] = getTypeId(i + 1);
        }
        return resultIds;
    }

    function getTypeId(uint256 typeNonce)
        public
        override
        view
        returns (uint256)
    {
        require(
            typeNonce <= _typeNonce && typeNonce != 0,
            "TypeNonce does not exist."
        );
        return _typeNonceToTypeId[typeNonce];
    }

    function getNonFungibleAssets(address owner)
        public
        override
        view
        returns (uint256[] memory)
    {
        uint256 counter;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = (i << 128) | TYPE_NF_BIT;
            if (_typeToMaxSupply[typeId] != 0) {
                for (uint256 j = 1; j <= _typeToMintedSupply[typeId]; j++) {
                    uint256 id = typeId | j;
                    if (nfOwners[id] == owner) {
                        counter++;
                    }
                }
            }
        }

        uint256[] memory result = new uint256[](counter);
        counter = 0;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = (i << 128) | TYPE_NF_BIT;
            if (_typeToMaxSupply[typeId] != 0) {
                for (uint256 j = 1; j <= _typeToMintedSupply[typeId]; j++) {
                    uint256 id = typeId | j;
                    if (nfOwners[id] == owner) {
                        result[counter] = id;
                        counter++;
                    }
                }
            }
        }
        return result;
    }

    function getFungibleAssets(address owner)
        public
        override
        view
        returns (uint256[] memory, uint256[] memory)
    {
        uint256 counter;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = i << 128;
            if (_typeToMaxSupply[typeId] != 0) {
                if (balances[typeId][owner] > 0) {
                    counter++;
                }
            }
        }

        uint256[] memory resultIds = new uint256[](counter);
        uint256[] memory resultAmounts = new uint256[](counter);
        counter = 0;
        for (uint256 i = 1; i <= _typeNonce; i++) {
            uint256 typeId = i << 128;
            if (_typeToMaxSupply[typeId] != 0) {
                if (balances[typeId][owner] > 0) {
                    resultIds[counter] = typeId;
                    resultAmounts[counter] = balances[typeId][owner];
                    counter++;
                }
            }
        }
        return (resultIds, resultAmounts);
    }

    function getTypeNonce() public override view returns (uint256) {
        return _typeNonce;
    }

    function getMintedSupply(uint256 typeId)
        public
        override
        view
        isValidTypeId(typeId)
        returns (uint256)
    {
        return _typeToMintedSupply[typeId];
    }

    function getMaxSupply(uint256 typeId)
        public
        override
        view
        isValidTypeId(typeId)
        returns (uint256)
    {
        return _typeToMaxSupply[typeId];
    }

    function getMetaNonce(address signer)
        public
        override
        view
        returns (uint256)
    {
        return _signerToMetaNonce[signer];
    }

    /**
        @dev Checks if the AssetManager (from the Registry) is the msg.sender.
        Reverts if the msg.sender is not the correct AssetManager registered in the Registry.
    */
    function _isAuthorizedAssetManager() internal view {
        require(
            getContractAddress(4) == msg.sender,
            "Unauthorized call. Thanks for supporting the network with your ETH."
        );
    }

    /**
        @dev Checks if a given `typeId` exists.
        Reverts if given `typeId` does not exist.
        @param typeId The typeId which should be checked
    */
    function _isValidTypeId(uint256 typeId) internal view {
        require(_typeToMaxSupply[typeId] != 0, "TypeId does not exist.");
    }

    /**
        @dev Creates fungible and non-fungible types. This function only creates the type and is not used for minting.
        NFT types also has a maxSupply since there can be multiple tokens of the same type, e.g. 100x 'Pikachu'.
        Reverts if the `maxSupply` is 0 or exceeds the `MAX_TYPE_SUPPLY`.
        @param isNF         Flag if the creation should be a non-fungible, false for fungible tokens
        @param maxSupply    The maximum amount that can be created of this type, unlimited SHOULD be 2**128 (uint128) as the max. MUST NOT be set to 0
        @return             The `typeId`
    */
    function _create(bool isNF, uint256 maxSupply) private returns (uint256) {
        require(
            maxSupply != 0 && maxSupply <= MAX_TYPE_SUPPLY,
            "Minimum 1 and maximum 2**128 tokens of one type can exist."
        );

        // Store the type in the upper 128 bits
        uint256 typeId = (++_typeNonce << 128);

        // Set a flag if this is an NFI.
        if (isNF) typeId = typeId | TYPE_NF_BIT;

        _typeToMaxSupply[typeId] = maxSupply;
        _typeNonceToTypeId[_typeNonce] = typeId;

        // emit a Transfer event with Create semantic to help with discovery.
        emit TransferSingle(msg.sender, address(0x0), address(0x0), typeId, 0);

        return typeId;
    }

    /**
        @dev Sets a release timestamp.
        Reverts if `timestamp` == 0.
        Reverts if the `typeId` is released already.
        @param typeId       The type which should be set or updated
        @param timestamp    The timestamp for the release time, SHOULD be set to 1337 for releasing it right away. MUST NOT be set to 0
    */
    function _setReleaseTimestamp(uint256 typeId, uint256 timestamp) private {
        require(
            timestamp != 0,
            "A 0 timestamp is not allowed. For immediate release choose 1337."
        );
        require(
            _tokenTypeToReleaseTimestamp[typeId] == 0 ||
                _tokenTypeToReleaseTimestamp[typeId] > block.timestamp,
            "This token is released already."
        );
        _tokenTypeToReleaseTimestamp[typeId] = timestamp;

        emit OnReleaseTimestamp(typeId, timestamp);
    }

    /**
        @dev Get the data hash required for the meta transaction comparison of burn executions.
        @param ids          An array of token Ids which should be burned
        @param values       An array of amounts which should be burned. The order matches the order in the ids array
        @param nonce        Each sent meta transaction includes a nonce to prevent that a signed transaction is executed multiple times
        @param maxTimestamp The maximum point in time before the meta transaction expired, thus becoming invalid
        @return             The keccak256 hash of the data input
    */
    function _getBurnDataHash(
        uint256[] memory ids,
        uint256[] memory values,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(ids, values, nonce, maxTimestamp));
    }

    function _getSafeTransferFromDataHash(
        address signer,
        address _to,
        uint256 _id,
        uint256 _value,
        bytes memory _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    signer,
                    _to,
                    _id,
                    _value,
                    _data,
                    nonce,
                    maxTimestamp
                )
            );
    }

    function _getSafeBatchTransferFromDataHash(
        address signer,
        address _to,
        uint256[] memory _ids,
        uint256[] memory _values,
        bytes memory _data,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    signer,
                    _to,
                    _ids,
                    _values,
                    _data,
                    nonce,
                    maxTimestamp
                )
            );
    }

    function _getSetApprovalForAllHash(
        address _operator,
        bool _approved,
        uint256 nonce,
        uint256 maxTimestamp
    ) private pure returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(_operator, _approved, nonce, maxTimestamp)
            );
    }
}

/**
    @author The Calystral Team
    @title The Assets' Interface
*/
interface IAssets {
    /**
        @dev MUST emit when any property type is created.
        The `propertyId` argument MUST be the id of a property.
        The `name` argument MUST be the name of this specific id.
        The `propertyType` argument MUST be the property type.
    */
    event OnCreateProperty(
        uint256 propertyId,
        string name,
        PropertyType indexed propertyType
    );
    /**
        @dev MUST emit when an int type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateIntProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        int256 value
    );
    /**
        @dev MUST emit when an string type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateStringProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        string value
    );
    /**
        @dev MUST emit when an address type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateAddressProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        address value
    );
    /**
        @dev MUST emit when an byte type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateByteProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        bytes32 value
    );
    /**
        @dev MUST emit when an int array type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateIntArrayProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        int256[] value
    );
    /**
        @dev MUST emit when an address array type property is updated.
        The `tokenId` argument MUST be the id of the token of which the property is updated.
        The `propertyId` argument MUST be the property id which is updated.
        The `value` argument MUST be the value to which the token's property is updated.
    */
    event OnUpdateAddressArrayProperty(
        uint256 indexed tokenId,
        uint256 indexed propertyId,
        address[] value
    );

    /// @dev Enum representing all existing property types that can be used.
    enum PropertyType {INT, STRING, ADDRESS, BYTE, INTARRAY, ADDRESSARRAY}

    /**
        @notice Creates a property of type int.
        @dev Creates a property of type int.
        @param name The name for this property
        @return     The property id
    */
    function createIntProperty(string calldata name) external returns (uint256);

    /**
        @notice Creates a property of type string.
        @dev Creates a property of type string.
        @param name The name for this property
        @return     The property id
    */
    function createStringProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type address.
        @dev Creates a property of type address.
        @param name The name for this property
        @return     The property id
    */
    function createAddressProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type byte.
        @dev Creates a property of type byte.
        @param name The name for this property
        @return     The property id
    */
    function createByteProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type int array.
        @dev Creates a property of type int array.
        @param name The name for this property
        @return     The property id
    */
    function createIntArrayProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Creates a property of type address array.
        @dev Creates a property of type address array.
        @param name The name for this property
        @return     The property id
    */
    function createAddressArrayProperty(string calldata name)
        external
        returns (uint256);

    /**
        @notice Updates an existing int property for the passed value.
        @dev Updates an existing int property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateIntProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256 value
    ) external;

    /**
        @notice Updates an existing string property for the passed value.
        @dev Updates an existing string property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateStringProperty(
        uint256 tokenId,
        uint256 propertyId,
        string calldata value
    ) external;

    /**
        @notice Updates an existing address property for the passed value.
        @dev Updates an existing address property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateAddressProperty(
        uint256 tokenId,
        uint256 propertyId,
        address value
    ) external;

    /**
        @notice Updates an existing byte property for the passed value.
        @dev Updates an existing byte property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateByteProperty(
        uint256 tokenId,
        uint256 propertyId,
        bytes32 value
    ) external;

    /**
        @notice Updates an existing int array property for the passed value.
        @dev Updates an existing int array property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateIntArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256[] calldata value
    ) external;

    /**
        @notice Updates an existing address array property for the passed value.
        @dev Updates an existing address array property for the passed `value`.
        @param tokenId      The id of the token of which the property is updated
        @param propertyId   The property id which is updated
        @param value        The value to which the token's property is updated
    */
    function updateAddressArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        address[] calldata value
    ) external;

    /**
        @notice Get the property type of a property.
        @dev Get the property type of a property.
        @return The property type
    */
    function getPropertyType(uint256 propertyId)
        external
        view
        returns (PropertyType);

    /**
        @notice Get the count of available properties.
        @dev Get the count of available properties.
        @return The property count
    */
    function getPropertyCounter() external view returns (uint256);
}

/**
    @author The Calystral Team
    @title A contract to manage all kind of assets (NFTs, FTs, and their arbitrary Properties)
    @dev Implements:
    IAssets
    IERC165
    IERC1155
    IERC1155Metadata_URI
    IERC1155CalystralMixedFungibleMintable
    ERC165
    ERC1155
    ERC1155MixedFungible
    ERC1155CalystralMixedFungibleMintable
    Registry
    ContractState
    CommonConstants    
*/
contract Assets is IAssets, ERC1155CalystralMixedFungibleMintable {
    /// @dev property id => property type
    mapping(uint256 => PropertyType) private _propertyIdToPropertyType;

    /// @dev A counter used to create the propertyId where propertyId 0 is not existing / reserved.
    uint256 propertyCounter;

    modifier isValidToken(uint256 tokenId) {
        _isValidToken(tokenId);
        _;
    }

    modifier isValidProperty(uint256 propertyId) {
        _isValidProperty(propertyId);
        _;
    }

    modifier isPropertyType(uint256 propertyId, PropertyType propertyType) {
        _isPropertyType(propertyId, propertyType);
        _;
    }

    /**
        @notice Initialized and creates the contract including the address of the RegistryManager and a list of relevant contract ids. 
        @dev Creates the contract with an initialized `registryManagerAddress` and `relevantList`.
        Sets the contract's state into INACTIVE.
        Implements the Registry: Reverts if the `relevantList` does not include id 1 at index 0.
        @param registryManagerAddress   Address of the RegistryManager contract
        @param relevantList             Array of ids for contracts that are relevant for execution and are tracked for updates
    */
    constructor(address registryManagerAddress, uint16[] memory relevantList)
        public
        ERC1155CalystralMixedFungibleMintable(
            registryManagerAddress,
            relevantList
        )
    {
        _transitionINACTIVE();
    }

    function createIntProperty(string calldata name)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.INT);
    }

    function createStringProperty(string calldata name)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.STRING);
    }

    function createAddressProperty(string calldata name)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.ADDRESS);
    }

    function createByteProperty(string calldata name)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.BYTE);
    }

    function createIntArrayProperty(string calldata name)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.INTARRAY);
    }

    function createAddressArrayProperty(string calldata name)
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        returns (uint256)
    {
        return _createProperty(name, PropertyType.ADDRESSARRAY);
    }

    function updateIntProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256 value
    )
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.INT)
    {
        emit OnUpdateIntProperty(tokenId, propertyId, value);
    }

    function updateStringProperty(
        uint256 tokenId,
        uint256 propertyId,
        string calldata value
    )
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.STRING)
    {
        emit OnUpdateStringProperty(tokenId, propertyId, value);
    }

    function updateAddressProperty(
        uint256 tokenId,
        uint256 propertyId,
        address value
    )
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.ADDRESS)
    {
        emit OnUpdateAddressProperty(tokenId, propertyId, value);
    }

    function updateByteProperty(
        uint256 tokenId,
        uint256 propertyId,
        bytes32 value
    )
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.BYTE)
    {
        emit OnUpdateByteProperty(tokenId, propertyId, value);
    }

    function updateIntArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        int256[] calldata value
    )
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.INTARRAY)
    {
        emit OnUpdateIntArrayProperty(tokenId, propertyId, value);
    }

    function updateAddressArrayProperty(
        uint256 tokenId,
        uint256 propertyId,
        address[] calldata value
    )
        external
        override
        isCurrentState(State.ACTIVE)
        isAuthorizedAssetManager()
        isValidToken(tokenId)
        isValidProperty(propertyId)
        isPropertyType(propertyId, PropertyType.ADDRESSARRAY)
    {
        emit OnUpdateAddressArrayProperty(tokenId, propertyId, value);
    }

    function getPropertyType(uint256 propertyId)
        public
        override
        view
        isValidProperty(propertyId)
        returns (PropertyType)
    {
        return _propertyIdToPropertyType[propertyId];
    }

    function getPropertyCounter() public override view returns (uint256) {
        return propertyCounter;
    }

    /**
        @dev Checks if the `tokenId` exists:
        NFs are checked via `nfOwners` mapping.
        NFTs are checked via `getMaxSupply` function.
        @param tokenId  The tokenId which should be checked
    */
    function _isValidToken(uint256 tokenId) internal view {
        if (isNonFungible(tokenId)) {
            require(
                nfOwners[tokenId] != address(0x0),
                "TokenId does not exist."
            );
        } else {
            require(getMaxSupply(tokenId) != 0, "TokenId does not exist.");
        }
    }

    /**
        @dev Checks if the `propertyId` exists.
        @param propertyId  The propertyId which should be checked
    */
    function _isValidProperty(uint256 propertyId) internal view {
        require(
            propertyId <= propertyCounter && propertyId != 0,
            "Invalid property requested."
        );
    }

    /**
        @dev Checks if a given `propertyId` matches the given `propertyType`.
        @param propertyId   The propertyId which should be checked
        @param propertyType The PropertyType which should be checked against
    */
    function _isPropertyType(uint256 propertyId, PropertyType propertyType)
        internal
        view
    {
        require(
            _propertyIdToPropertyType[propertyId] == propertyType,
            "The given property id does not match the property type."
        );
    }

    /**
        @dev Creates a new property.
        @param name         The name of the property
        @param propertyType The PropertyType of the property
        @return             The propertyId of the property
    */
    function _createProperty(string memory name, PropertyType propertyType)
        private
        returns (uint256)
    {
        propertyCounter++; // propertyCounter starts with 1 for the first attribute
        _propertyIdToPropertyType[propertyCounter] = propertyType;

        emit OnCreateProperty(propertyCounter, name, propertyType);

        return propertyCounter;
    }
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"registryManagerAddress","type":"address"},{"internalType":"uint16[]","name":"relevantList","type":"uint16[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"enum IAssets.PropertyType","name":"propertyType","type":"uint8"}],"name":"OnCreateProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"typeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OnReleaseTimestamp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"value","type":"address[]"}],"name":"OnUpdateAddressArrayProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"address","name":"value","type":"address"}],"name":"OnUpdateAddressProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"OnUpdateByteProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"int256[]","name":"value","type":"int256[]"}],"name":"OnUpdateIntArrayProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"value","type":"int256"}],"name":"OnUpdateIntProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"propertyId","type":"uint256"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"OnUpdateStringProperty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createAddressArrayProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createAddressProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createByteProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"releaseTimestamp","type":"uint256"}],"name":"createFungibleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createIntArrayProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createIntProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"releaseTimestamp","type":"uint256"}],"name":"createNonFungibleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"createStringProperty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActivatedCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentState","outputs":[{"internalType":"enum ContractState.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getFungibleAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInactivatedCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"getMetaNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getMintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getNonFungibleAssets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNonFungibleBaseType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getNonFungibleIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPropertyCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"propertyId","type":"uint256"}],"name":"getPropertyType","outputs":[{"internalType":"enum IAssets.PropertyType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistryId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"getReleaseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRelevantList","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeNonce","type":"uint256"}],"name":"getTypeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTypeIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTypeNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isIdRelevant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungibleBaseType","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isNonFungibleItem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaBatchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSafeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"maxTimestamp","type":"uint256"}],"name":"metaSetApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"toArr","type":"address[]"},{"internalType":"uint256[]","name":"quantitiesArr","type":"uint256[]"}],"name":"mintFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"address[]","name":"toArr","type":"address[]"}],"name":"mintNonFungible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setReleaseTimestamp","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"address[]","name":"value","type":"address[]"}],"name":"updateAddressArrayProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"address","name":"value","type":"address"}],"name":"updateAddressProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"updateByteProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"updateContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"int256[]","name":"value","type":"int256[]"}],"name":"updateIntArrayProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"int256","name":"value","type":"int256"}],"name":"updateIntProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateMetadataBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"propertyId","type":"uint256"},{"internalType":"string","name":"value","type":"string"}],"name":"updateStringProperty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162005e2c38038062005e2c833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82518660208202830111640100000000821117156200009357600080fd5b82525081516020918201928201910280838360005b83811015620000c2578181015183820152602001620000a8565b5050505090500160405250505081818181620000eb6301ffc9a760e01b6200026960201b60201c565b62000106636cdb3d1360e11b6001600160e01b036200026916565b806000815181106200011457fe5b602002602001015161ffff16600114620001605760405162461bcd60e51b815260040180806020018281038252604481526020018062005de86044913960600191505060405180910390fd5b6001600052600760209081527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b82880546001600160a01b0319166001600160a01b0385161790558151620001ba91600991908401906200042c565b5060005b81518110156200021157600160086000848481518110620001db57fe5b60209081029190910181015161ffff168252810191909152604001600020805460ff1916911515919091179055600101620001be565b506200022d637bbb226760e01b6001600160e01b036200026916565b506200024b90506303a24d0760e21b6001600160e01b036200026916565b506200026190506001600160e01b03620002ee16565b505062000501565b6001600160e01b03198082161415620002c9576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152600360205260409020805460ff19166001179055565b600060026200030782826001600160e01b036200033116565b6000805460ff1916600190811790915560028054909101908190556200032d90620003b6565b5050565b8160028111156200033e57fe5b60005460ff1660028111156200035057fe5b14806200037957508060028111156200036557fe5b60005460ff1660028111156200037757fe5b145b6200032d5760405162461bcd60e51b815260040180806020018281038252604081526020018062005da86040913960400191505060405180910390fd5b60016200032d816001600160e01b03620003cc16565b806002811115620003d957fe5b60005460ff166002811115620003eb57fe5b14620004295760405162461bcd60e51b815260040180806020018281038252604081526020018062005da86040913960400191505060405180910390fd5b50565b82805482825590600052602060002090600f01601090048101928215620004ca5791602002820160005b838211156200049857835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000456565b8015620004c85782816101000a81549061ffff021916905560020160208160010104928301926001030262000498565b505b50620004d8929150620004dc565b5090565b620004fe91905b80821115620004d857805461ffff19168155600101620004e3565b90565b61589780620005116000396000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c80636c27479d116101d3578063a2d3458111610104578063ca4708ee116100a2578063e985e9c51161007c578063e985e9c51461138f578063f242432a146113bd578063f941908814611450578063fb479d9b146114c557610377565b8063ca4708ee1461120f578063da95c69714611289578063e44591f01461137257610377565b8063adebf6f2116100de578063adebf6f214611023578063aefa7d9814611040578063ba8183f81461105d578063c55ebe69146111a157610377565b8063a2d3458114610f32578063a6203b6314610f8c578063ab7b9a3114610fa957610377565b8063829dc5f0116101715780639b6b5b661161014b5780639b6b5b6614610ea45780639cca1c6414610ec15780639f0ab7da14610ede578063a22cb46514610f0457610377565b8063829dc5f014610db4578063839f238714610e225780638b3188ce14610e2a57610377565b80637269a327116101ad5780637269a32714610bb357806378b2722114610bd057806378c9adad14610c955780637f138cbe14610d0357610377565b80636c27479d14610b205780636d13956b14610b8e5780636f969c2d14610b9657610377565b806339bd89c2116102ad5780635e81b9581161024b5780636712f55f116102255780636712f55f14610ab15780636907aa5714610ade5780636af51c5e14610b105780636b7dfd7214610b1857610377565b80635e81b95814610a535780635ff66eb714610a705780636352211e14610a7857610377565b80634a71aa0a116102875780634a71aa0a146108d95780634e1273f4146109025780635a64715514610a105780635e495d7414610a3657610377565b806339bd89c2146108405780633dfbc24714610848578063491078f4146108b657610377565b806319ef07881161031a5780632ccd2c84116102f45780632ccd2c84146106a75780632eb2c2d6146106ca5780632f817bf8146107f1578063378aa7011461081457610377565b806319ef07881461055d578063282a84da146105cb57806329e04b511461068a57610377565b8063084e6adf11610356578063084e6adf1461047b57806308f51a84146104985780630e89341c146104c357806315ee4ee31461055557610377565b8062fdd58e1461037c57806301ffc9a7146103ba57806305a85c2c1461040d575b600080fd5b6103a86004803603604081101561039257600080fd5b506001600160a01b0381351690602001356114f1565b60408051918252519081900360200190f35b6103f9600480360360208110156103d057600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016611561565b604080519115158252519081900360200190f35b6103a86004803603602081101561042357600080fd5b810190602081018135600160201b81111561043d57600080fd5b82018360208201111561044f57600080fd5b803590602001918460018302840111600160201b8311171561047057600080fd5b50909250905061159c565b6103a86004803603602081101561049157600080fd5b50356115fb565b6104c1600480360360608110156104ae57600080fd5b508035906020810135906040013561161b565b005b6104e0600480360360208110156104d957600080fd5b5035611690565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561051a578181015183820152602001610502565b50505050905090810190601f1680156105475780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103a8611732565b6103a86004803603602081101561057357600080fd5b810190602081018135600160201b81111561058d57600080fd5b82018360208201111561059f57600080fd5b803590602001918460018302840111600160201b831117156105c057600080fd5b509092509050611739565b6105f1600480360360208110156105e157600080fd5b50356001600160a01b0316611790565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561063557818101518382015260200161061d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561067457818101518382015260200161065c565b5050505090500194505050505060405180910390f35b6103f9600480360360208110156106a057600080fd5b5035611940565b6104c1600480360360408110156106bd57600080fd5b5080359060200135611955565b6104c1600480360360a08110156106e057600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561071357600080fd5b82018360208201111561072557600080fd5b803590602001918460208302840111600160201b8311171561074657600080fd5b919390929091602081019035600160201b81111561076357600080fd5b82018360208201111561077557600080fd5b803590602001918460208302840111600160201b8311171561079657600080fd5b919390929091602081019035600160201b8111156107b357600080fd5b8201836020820111156107c557600080fd5b803590602001918460018302840111600160201b831117156107e657600080fd5b509092509050611982565b6103a86004803603604081101561080757600080fd5b5080359060200135611dac565b61081c611dda565b6040518082600281111561082c57fe5b60ff16815260200191505060405180910390f35b6103a8611de3565b6103a86004803603602081101561085e57600080fd5b810190602081018135600160201b81111561087857600080fd5b82018360208201111561088a57600080fd5b803590602001918460018302840111600160201b831117156108ab57600080fd5b509092509050611de9565b6103a8600480360360408110156108cc57600080fd5b5080359060200135611e40565b6104c1600480360360608110156108ef57600080fd5b5080359060208101359060400135611e62565b6109c06004803603604081101561091857600080fd5b810190602081018135600160201b81111561093257600080fd5b82018360208201111561094457600080fd5b803590602001918460208302840111600160201b8311171561096557600080fd5b919390929091602081019035600160201b81111561098257600080fd5b82018360208201111561099457600080fd5b803590602001918460208302840111600160201b831117156109b557600080fd5b509092509050611ed7565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156109fc5781810151838201526020016109e4565b505050509050019250505060405180910390f35b6103a860048036036020811015610a2657600080fd5b50356001600160a01b0316612039565b6103a860048036036020811015610a4c57600080fd5b5035612054565b6103f960048036036020811015610a6957600080fd5b5035612074565b6109c061209e565b610a9560048036036020811015610a8e57600080fd5b5035612125565b604080516001600160a01b039092168252519081900360200190f35b610ace60048036036020811015610ac757600080fd5b5035612140565b6040518082600581111561082c57fe5b6104c160048036036060811015610af457600080fd5b50803590602081013590604001356001600160a01b0316612163565b6103a86121e1565b6103a86121e7565b6103a860048036036020811015610b3657600080fd5b810190602081018135600160201b811115610b5057600080fd5b820183602082011115610b6257600080fd5b803590602001918460018302840111600160201b83111715610b8357600080fd5b5090925090506121ed565b6109c0612244565b6103a860048036036020811015610bac57600080fd5b50356122c4565b6103f960048036036020811015610bc957600080fd5b50356122e9565b6104c160048036036060811015610be657600080fd5b81359190810190604081016020820135600160201b811115610c0757600080fd5b820183602082011115610c1957600080fd5b803590602001918460208302840111600160201b83111715610c3a57600080fd5b919390929091602081019035600160201b811115610c5757600080fd5b820183602082011115610c6957600080fd5b803590602001918460208302840111600160201b83111715610c8a57600080fd5b509092509050612312565b6104c160048036036020811015610cab57600080fd5b810190602081018135600160201b811115610cc557600080fd5b820183602082011115610cd757600080fd5b803590602001918460018302840111600160201b83111715610cf857600080fd5b509092509050612582565b6104c16004803603610140811015610d1a57600080fd5b81359160208101359160ff604083013516916001600160a01b03606082013581169260808301359091169160a08101359160c08201359190810190610100810160e0820135600160201b811115610d7057600080fd5b820183602082011115610d8257600080fd5b803590602001918460018302840111600160201b83111715610da357600080fd5b91935091508035906020013561259b565b6103a860048036036020811015610dca57600080fd5b810190602081018135600160201b811115610de457600080fd5b820183602082011115610df657600080fd5b803590602001918460018302840111600160201b83111715610e1757600080fd5b509092509050612998565b6103a86129ec565b6104c160048036036060811015610e4057600080fd5b813591602081013591810190606081016040820135600160201b811115610e6657600080fd5b820183602082011115610e7857600080fd5b803590602001918460208302840111600160201b83111715610e9957600080fd5b5090925090506129f2565b6103a860048036036020811015610eba57600080fd5b5035612a96565b6103a860048036036020811015610ed757600080fd5b5035612b0d565b6109c060048036036020811015610ef457600080fd5b50356001600160a01b0316612b22565b6104c160048036036040811015610f1a57600080fd5b506001600160a01b0381351690602001351515612c97565b6104c16004803603610100811015610f4957600080fd5b5080359060208101359060ff604082013516906001600160a01b03606082013581169160808101359091169060a081013515159060c08101359060e00135612d05565b6103a860048036036020811015610fa257600080fd5b5035612eb1565b6104c160048036036060811015610fbf57600080fd5b813591602081013591810190606081016040820135600160201b811115610fe557600080fd5b820183602082011115610ff757600080fd5b803590602001918460208302840111600160201b8311171561101857600080fd5b509092509050612ed1565b6103f96004803603602081101561103957600080fd5b5035612f75565b610a956004803603602081101561105657600080fd5b5035612f7f565b6104c1600480360361014081101561107457600080fd5b81359160208101359160ff604083013516916001600160a01b0360608201358116926080830135909116919081019060c0810160a0820135600160201b8111156110bd57600080fd5b8201836020820111156110cf57600080fd5b803590602001918460208302840111600160201b831117156110f057600080fd5b919390929091602081019035600160201b81111561110d57600080fd5b82018360208201111561111f57600080fd5b803590602001918460208302840111600160201b8311171561114057600080fd5b919390929091602081019035600160201b81111561115d57600080fd5b82018360208201111561116f57600080fd5b803590602001918460018302840111600160201b8311171561119057600080fd5b919350915080359060200135612f9a565b6103a8600480360360208110156111b757600080fd5b810190602081018135600160201b8111156111d157600080fd5b8201836020820111156111e357600080fd5b803590602001918460018302840111600160201b8311171561120457600080fd5b509092509050613678565b6104c16004803603606081101561122557600080fd5b813591602081013591810190606081016040820135600160201b81111561124b57600080fd5b82018360208201111561125d57600080fd5b803590602001918460018302840111600160201b8311171561127e57600080fd5b5090925090506136cf565b6104c160048036036101008110156112a057600080fd5b81359160208101359160ff604083013516916001600160a01b036060820135169181019060a081016080820135600160201b8111156112de57600080fd5b8201836020820111156112f057600080fd5b803590602001918460208302840111600160201b8311171561131157600080fd5b919390929091602081019035600160201b81111561132e57600080fd5b82018360208201111561134057600080fd5b803590602001918460208302840111600160201b8311171561136157600080fd5b919350915080359060200135613770565b6103f96004803603602081101561138857600080fd5b5035613b9c565b6103f9600480360360408110156113a557600080fd5b506001600160a01b0381358116916020013516613ba8565b6104c1600480360360a08110156113d357600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561141257600080fd5b82018360208201111561142457600080fd5b803590602001918460018302840111600160201b8311171561144557600080fd5b509092509050613bd6565b6104c16004803603604081101561146657600080fd5b81359190810190604081016020820135600160201b81111561148757600080fd5b82018360208201111561149957600080fd5b803590602001918460208302840111600160201b831117156114ba57600080fd5b509092509050613e66565b6104c1600480360360408110156114db57600080fd5b506001600160a01b038135169060200135614032565b60006114fc82612074565b15611536576000828152600660205260409020546001600160a01b0384811691161461152957600061152c565b60015b60ff16905061155b565b5060008181526004602090815260408083206001600160a01b03861684529091529020545b92915050565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526003602052604090205460ff165b919050565b600060026115a9816140f9565b6115b1614155565b6115f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600392506141a7915050565b949350505050565b60008161160781614297565b50506000908152600b602052604090205490565b6002611626816140f9565b61162e614155565b83611638816142f7565b83611642816143cd565b84600061164f828261442f565b60408051878152905188918a917f5eaea1ab442fc547ed0ca77214f10950027909260a85911e2b428c3c0f8cf4679181900360200190a35050505050505050565b6011805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815260609361155b939192909183018282801561171f5780601f106116f45761010080835404028352916020019161171f565b820191906000526020600020905b81548152906001019060200180831161170257829003601f168201915b505050505061172d84614498565b61458c565b6010545b90565b60006002611746816140f9565b61174e614155565b6115f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600292506141a7915050565b606080600060015b60105481116117f257608081901b6000818152600c6020526040902054156117e95760008181526004602090815260408083206001600160a01b038a168452909152902054156117e9576001909201915b50600101611798565b5060608167ffffffffffffffff8111801561180c57600080fd5b50604051908082528060200260200182016040528015611836578160200160208202803683370190505b50905060608267ffffffffffffffff8111801561185257600080fd5b5060405190808252806020026020018201604052801561187c578160200160208202803683370190505b5060009350905060015b601054811161193457608081901b6000818152600c60205260409020541561192b5760008181526004602090815260408083206001600160a01b038c1684529091529020541561192b57808486815181106118dd57fe5b60209081029190910181019190915260008281526004825260408082206001600160a01b038c1683529092522054835184908790811061191957fe5b60209081029190910101526001909401935b50600101611886565b50909350915050915091565b60009081526008602052604090205460ff1690565b6002611960816140f9565b611968614155565b8261197281614297565b61197c84846145cf565b50505050565b6001600160a01b0387166119dd576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f20616464726573730000000000604482015290519081900360640190fd5b848314611a31576040805162461bcd60e51b815260206004820152601760248201527f4172726179206c656e677468206d757374206d61746368000000000000000000604482015290519081900360640190fd5b6001600160a01b038816331480611a7057506001600160a01b038816600090815260056020908152604080832033845290915290205460ff1615156001145b611aab5760405162461bcd60e51b815260040180806020018281038252602f8152602001806156e0602f913960400191505060405180910390fd5b60005b85811015611c35576000878783818110611ac457fe5b9050602002013590506000868684818110611adb57fe5b905060200201359050611aed82613b9c565b15611b51576000828152600660205260409020546001600160a01b038c8116911614611b1857600080fd5b6000828152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038c16179055611c2b565b60008281526004602090815260408083206001600160a01b038f168452909152902054611b84908263ffffffff6146cf16565b6004600084815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550611c076004600084815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020548261471190919063ffffffff16565b60008381526004602090815260408083206001600160a01b038f1684529091529020555b5050600101611aae565b50866001600160a01b0316886001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb898989896040518080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039850909650505050505050a4611cf9876001600160a01b031661476b565b15611da257611da233898989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b91829185019084908082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061477192505050565b5050505050505050565b60006002611db9816140f9565b611dc1614155565b6000611dce60018661498a565b90506115f381856145cf565b60005460ff1690565b60025490565b60006002611df6816140f9565b611dfe614155565b6115f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600492506141a7915050565b60006002611e4d816140f9565b611e55614155565b6000611dce60008661498a565b6002611e6d816140f9565b611e75614155565b83611e7f816142f7565b83611e89816143cd565b846003611e96828261442f565b60408051878152905188918a917f43227f67dc2dfb884342caef2f9c7a09a99b9f02ab2c524b6e1cf8bc854a6d669181900360200190a35050505050505050565b6060838214611ee557600080fd5b60608467ffffffffffffffff81118015611efe57600080fd5b50604051908082528060200260200182016040528015611f28578160200160208202803683370190505b50905060005b8581101561202f576000858583818110611f4457fe5b905060200201359050611f5681612074565b15611fc157878783818110611f6757fe5b600084815260066020908152604090912054910292909201356001600160a01b039081169216919091149050611f9e576000611fa1565b60015b60ff16838381518110611fb057fe5b602002602001018181525050612026565b600081815260046020526040812090898985818110611fdc57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205483838151811061201957fe5b6020026020010181815250505b50600101611f2e565b5095945050505050565b6001600160a01b03166000908152600f602052604090205490565b60008161206081614297565b50506000908152600c602052604090205490565b6000600160ff1b80831614801561155b5750506fffffffffffffffffffffffffffffffff16151590565b60608060105467ffffffffffffffff811180156120ba57600080fd5b506040519080825280602002602001820160405280156120e4578160200160208202803683370190505b50905060005b60105481101561211f5761210081600101612a96565b82828151811061210c57fe5b60209081029190910101526001016120ea565b50905090565b6000908152600660205260409020546001600160a01b031690565b60008161214c816143cd565b505060009081526012602052604090205460ff1690565b600261216e816140f9565b612176614155565b83612180816142f7565b8361218a816143cd565b846002612197828261442f565b604080516001600160a01b0388168152905188918a917fe6fddd529ce511f88c7ea518e8bcd74716a89345a44ceb7a02a63c6319500c1e9181900360200190a35050505050505050565b600a5490565b60135490565b600060026121fa816140f9565b612202614155565b6115f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506141a7915050565b606060098054806020026020016040519081016040528092919081815260200182805480156122ba57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116122815790505b5050505050905090565b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b6000600160ff1b80831614801561155b5750506fffffffffffffffffffffffffffffffff161590565b600261231d816140f9565b612325614155565b8561232f81614297565b61233887612f75565b6123735760405162461bcd60e51b81526004018080602001828103825260238152602001806158066023913960400191505060405180910390fd5b8483146123c7576040805162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e0000000000000000604482015290519081900360640190fd5b60005b8581101561250a5760008787838181106123e057fe5b905060200201356001600160a01b03169050600086868481811061240057fe5b90506020020135905080600460008c81526020019081526020016000206000846001600160a01b03166001600160a01b031681526020019081526020016000206000828254019250508190555080600b60008c815260200190815260200160002060008282540192505081905550816001600160a01b031660006001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628d85604051808381526020018281526020019250505060405180910390a46124de826001600160a01b031661476b565b15612500576125003333848d8560405180602001604052806000815250614a66565b50506001016123ca565b506000878152600c6020908152604080832054600b909252909120541115612579576040805162461bcd60e51b815260206004820152600d60248201527f4f7574206f662073746f636b2e00000000000000000000000000000000000000604482015290519081900360640190fd5b50505050505050565b61258a614155565b612596601183836154f3565b505050565b60006125e48989898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a9150614c039050565b905060006125fc6125f483614cce565b8e8e8e614d1f565b9050806001600160a01b03168a6001600160a01b0316148061264857506001600160a01b03808b1660009081526005602090815260408083209385168352929052205460ff1615156001145b6126835760405162461bcd60e51b815260040180806020018281038252602f8152602001806156e0602f913960400191505060405180910390fd5b8242106126c15760405162461bcd60e51b815260040180806020018281038252602681526020018061558c6026913960400191505060405180910390fd5b6001600160a01b038a166000908152600f602052604090205484146127175760405162461bcd60e51b81526004018080602001828103825260268152602001806157a96026913960400191505060405180910390fd5b6001600160a01b03808b166000908152600f6020526040902080546001019055891661278a576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f20616464726573730000000000604482015290519081900360640190fd5b61279388613b9c565b156127f7576000888152600660205260409020546001600160a01b038b81169116146127be57600080fd5b6000888152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038b161790556128d1565b60008881526004602090815260408083206001600160a01b038e16845290915290205461282a908863ffffffff6146cf16565b600460008a815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055506128ad87600460008b815260200190815260200160002060008c6001600160a01b03166001600160a01b031681526020019081526020016000205461471190919063ffffffff16565b60008981526004602090815260408083206001600160a01b038e1684529091529020555b886001600160a01b03168a6001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b604051808381526020018281526020019250505060405180910390a4612940896001600160a01b031661476b565b1561298957612989338b8b8b8b8b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250614a6692505050565b50505050505050505050505050565b600060026129a5816140f9565b6129ad614155565b6115f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525092506141a7915050565b60015490565b60026129fd816140f9565b612a05614155565b84612a0f816142f7565b84612a19816143cd565b856005612a26828261442f565b87897fb698dab408fb6e2c5e168a33c150bc87854d0e8eb37bcab3883691019f85b708898960405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a3505050505050505050565b60006010548211158015612aa957508115155b612afa576040805162461bcd60e51b815260206004820152601960248201527f547970654e6f6e636520646f6573206e6f742065786973742e00000000000000604482015290519081900360640190fd5b506000908152600e602052604090205490565b6fffffffffffffffffffffffffffffffff1690565b6060600060015b6010548111612ba957608081901b600160ff1b176000818152600c602052604090205415612ba05760015b6000828152600b60205260409020548111612b9e578082176000818152600660205260409020546001600160a01b0388811691161415612b95576001909401935b50600101612b54565b505b50600101612b29565b5060608167ffffffffffffffff81118015612bc357600080fd5b50604051908082528060200260200182016040528015612bed578160200160208202803683370190505b5060009250905060015b6010548111612c8f57608081901b600160ff1b176000818152600c602052604090205415612c865760015b6000828152600b60205260409020548111612c84578082176000818152600660205260409020546001600160a01b0389811691161415612c7b5780858781518110612c6957fe5b60209081029190910101526001909501945b50600101612c22565b505b50600101612bf7565b509392505050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6000612d1385858585614efb565b90506000612d2b612d2383614cce565b8b8b8b614d1f565b9050866001600160a01b0316816001600160a01b031614612d93576040805162461bcd60e51b815260206004820152601260248201527f496e76616c6964207369676e61747572652e0000000000000000000000000000604482015290519081900360640190fd5b824210612dd15760405162461bcd60e51b815260040180806020018281038252602681526020018061558c6026913960400191505060405180910390fd5b6001600160a01b0387166000908152600f60205260409020548414612e275760405162461bcd60e51b81526004018080602001828103825260268152602001806157a96026913960400191505060405180910390fd5b6001600160a01b038781166000908152600f602090815260408083208054600101905584841680845260058352818420948b1680855294835292819020805460ff19168a1515908117909155815190815290517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a350505050505050505050565b600081612ebd81614297565b50506000908152600d602052604090205490565b6002612edc816140f9565b612ee4614155565b84612eee816142f7565b84612ef8816143cd565b856004612f05828261442f565b87897fbbd005d6024e5cd44017cf21a00d7fa1aaf59e19edb7fc5bb1f04629a8fee408898960405180806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f19169092018290039550909350505050a3505050505050505050565b600160ff1b161590565b6000908152600760205260409020546001600160a01b031690565b600061307861307061306b8d8d8d8d80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c9150614f659050565b614cce565b8f8f8f614d1f565b9050806001600160a01b03168b6001600160a01b031614806130c457506001600160a01b03808c1660009081526005602090815260408083209385168352929052205460ff1615156001145b6130ff5760405162461bcd60e51b815260040180806020018281038252602f8152602001806156e0602f913960400191505060405180910390fd5b878614613153576040805162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e0000000000000000604482015290519081900360640190fd5b8142106131915760405162461bcd60e51b815260040180806020018281038252602681526020018061558c6026913960400191505060405180910390fd5b6001600160a01b038b166000908152600f602052604090205483146131e75760405162461bcd60e51b81526004018080602001828103825260268152602001806157a96026913960400191505060405180910390fd5b6001600160a01b03808c166000908152600f60205260409020805460010190558a1661325a576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f20616464726573730000000000604482015290519081900360640190fd5b8786146132ae576040805162461bcd60e51b815260206004820152601760248201527f4172726179206c656e677468206d757374206d61746368000000000000000000604482015290519081900360640190fd5b60005b888110156134ea576132d48a8a838181106132c857fe5b90506020020135613b9c565b1561336f578b6001600160a01b0316600660008c8c858181106132f357fe5b60209081029290920135835250810191909152604001600020546001600160a01b03161461332057600080fd5b8a600660008c8c8581811061333157fe5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506134e2565b6133dc88888381811061337e57fe5b90506020020135600460008d8d8681811061339557fe5b90506020020135815260200190815260200160002060008f6001600160a01b03166001600160a01b03168152602001908152602001600020546146cf90919063ffffffff16565b600460008c8c858181106133ec57fe5b90506020020135815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002081905550613495600460008c8c8581811061343b57fe5b90506020020135815260200190815260200160002060008d6001600160a01b03166001600160a01b031681526020019081526020016000205489898481811061348057fe5b9050602002013561471190919063ffffffff16565b600460008c8c858181106134a557fe5b90506020020135815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6001016132b1565b50896001600160a01b03168b6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c8c8c6040518080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039850909650505050505050a46135ae8a6001600160a01b031661476b565b1561366857613668338c8c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061477192505050565b5050505050505050505050505050565b60006002613685816140f9565b61368d614155565b6115f384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600592506141a7915050565b60026136da816140f9565b6136e2614155565b846136ec816142f7565b846136f6816143cd565b856001613703828261442f565b87897fe27ba0a6870802af6a1f5b15e632c86c1a8c9441586cb5ac1b785527fa3a02d2898960405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a3505050505050505050565b613778614155565b60006137eb87878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a9250899182918501908490808284376000920191909152508892508791506150359050565b9050876001600160a01b031661380b61380383614cce565b8d8d8d614d1f565b6001600160a01b031614613866576040805162461bcd60e51b815260206004820152601260248201527f496e76616c6964207369676e61747572652e0000000000000000000000000000604482015290519081900360640190fd5b8584146138ba576040805162461bcd60e51b815260206004820152601860248201527f4172726179206c656e677468206d757374206d617463682e0000000000000000604482015290519081900360640190fd5b8142106138f85760405162461bcd60e51b815260040180806020018281038252602681526020018061558c6026913960400191505060405180910390fd5b6001600160a01b0388166000908152600f6020526040902054831461394e5760405162461bcd60e51b81526004018080602001828103825260268152602001806157a96026913960400191505060405180910390fd5b6001600160a01b0388166000908152600f60205260408120805460010190555b86811015613adc57600088888381811061398457fe5b90506020020135905061399681613b9c565b15613a37576000818152600660205260409020546001600160a01b038b8116911614613a09576040805162461bcd60e51b815260206004820152601660248201527f596f7520617265206e6f7420746865206f776e65722e00000000000000000000604482015290519081900360640190fd5b6000818152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19169055613ad3565b6000878784818110613a4557fe5b905060200201359050613a97816004600085815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020546146cf90919063ffffffff16565b6004600084815260200190815260200160002060008d6001600160a01b03166001600160a01b0316815260200190815260200160002081905550505b5060010161396e565b5060006001600160a01b0316886001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a8a8a6040518080602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f19169092018290039850909650505050505050a45050505050505050505050565b600160ff1b9081161490565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001600160a01b038516613c31576040805162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742073656e6420746f207a65726f20616464726573730000000000604482015290519081900360640190fd5b6001600160a01b038616331480613c7057506001600160a01b038616600090815260056020908152604080832033845290915290205460ff1615156001145b613cab5760405162461bcd60e51b815260040180806020018281038252602f8152602001806156e0602f913960400191505060405180910390fd5b613cb484613b9c565b15613d18576000848152600660205260409020546001600160a01b03878116911614613cdf57600080fd5b6000848152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038716179055613da6565b60008481526004602090815260408083206001600160a01b038a168452909152902054613d4b908463ffffffff6146cf16565b60008581526004602090815260408083206001600160a01b038b81168552925280832093909355871681522054613d829084614711565b60008581526004602090815260408083206001600160a01b038a1684529091529020555b846001600160a01b0316866001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4613e15856001600160a01b031661476b565b15613e5e57613e5e338787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250614a6692505050565b505050505050565b6002613e71816140f9565b613e79614155565b83613e8381614297565b613e8c85613b9c565b613ec75760405162461bcd60e51b81526004018080602001828103825260278152602001806155b26027913960400191505060405180910390fd5b6000858152600b602052604081208054858101909155600101905b84811015613fc3576000868683818110613ef857fe5b8486018b176000818152600660209081526040808320805495830297909701356001600160a01b031673ffffffffffffffffffffffffffffffffffffffff199095168517909655855183815260019181019190915285519396509194869450909233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292908290030190a4613f96826001600160a01b031661476b565b15613fb957613fb933338484600160405180602001604052806000815250614a66565b5050600101613ee2565b506000868152600c6020908152604080832054600b909252909120541115613e5e576040805162461bcd60e51b815260206004820152600d60248201527f4f7574206f662073746f636b2e00000000000000000000000000000000000000604482015290519081900360640190fd5b6002600161404082826150d4565b614048615152565b60008381526008602052604090205460ff1615156001148061407257506001600160a01b03841630145b8061407e5750600a5483145b1561197c57600a5483141561409f576000600a5561409a6151c4565b61197c565b6001600160a01b0384163014156140bd57600a8390556140bd6151f6565b600083815260076020526040902080546001600160a01b03861673ffffffffffffffffffffffffffffffffffffffff1990911617905550505050565b80600281111561410557fe5b60005460ff16600281111561411657fe5b146141525760405162461bcd60e51b81526004018080602001828103825260408152602001806156a06040913960400191505060405180910390fd5b50565b336141606004612f7f565b6001600160a01b0316146141a55760405162461bcd60e51b815260040180806020018281038252604381526020018061561d6043913960600191505060405180910390fd5b565b6013805460019081019182905560009182526012602052604082208054849260ff19909116908360058111156141d957fe5b02179055508160058111156141ea57fe5b7fd5773e0c12c5a7e1b711e66c7b9f3fe7c25cb73e0fdd332614a0a35bed00801b601354856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561425257818101518382015260200161423a565b50505050905090810190601f16801561427f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060135492915050565b6000818152600c6020526040902054614152576040805162461bcd60e51b815260206004820152601660248201527f54797065496420646f6573206e6f742065786973742e00000000000000000000604482015290519081900360640190fd5b61430081613b9c565b15614373576000818152600660205260409020546001600160a01b031661436e576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e496420646f6573206e6f742065786973742e000000000000000000604482015290519081900360640190fd5b614152565b61437c81612054565b614152576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e496420646f6573206e6f742065786973742e000000000000000000604482015290519081900360640190fd5b60135481111580156143de57508015155b614152576040805162461bcd60e51b815260206004820152601b60248201527f496e76616c69642070726f7065727479207265717565737465642e0000000000604482015290519081900360640190fd5b80600581111561443b57fe5b60008381526012602052604090205460ff16600581111561445857fe5b146144945760405162461bcd60e51b81526004018080602001828103825260378152602001806157cf6037913960400191505060405180910390fd5b5050565b6060816144d9575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152611597565b8160005b81156144f157600101600a820491506144dd565b60608167ffffffffffffffff8111801561450a57600080fd5b506040519080825280601f01601f191660200182016040528015614535576020820181803683370190505b50905060001982015b851561458357600a860660300160f81b8282806001900393508151811061456157fe5b60200101906001600160f81b031916908160001a905350600a8604955061453e565b50949350505050565b60606145c88383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250615221565b9392505050565b8061460b5760405162461bcd60e51b81526004018080602001828103825260408152602001806156606040913960400191505060405180910390fd5b6000828152600d6020526040902054158061463357506000828152600d602052604090205442105b614684576040805162461bcd60e51b815260206004820152601f60248201527f5468697320746f6b656e2069732072656c656173656420616c72656164792e00604482015290519081900360640190fd5b6000828152600d60209081526040918290208390558151838152915184927fbb3d1cf2b9311031fc607cdae1b14e022317b838640f988d4ec0d7cf4e81c61092908290030190a25050565b60006145c883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250615446565b6000828201838110156145c8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916846001600160a01b031663bc197c8188888787876040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561483357818101518382015260200161481b565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561487257818101518382015260200161485a565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156148ae578181015183820152602001614896565b50505050905090810190601f1680156148db5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561490057600080fd5b505af1158015614914573d6000803e3d6000fd5b505050506040513d602081101561492a57600080fd5b50517fffffffff000000000000000000000000000000000000000000000000000000001614613e5e5760405162461bcd60e51b815260040180806020018281038252603e815260200180615731603e913960400191505060405180910390fd5b600081158015906149ac57507001000000000000000000000000000000008211155b6149e75760405162461bcd60e51b815260040180806020018281038252603a81526020018061576f603a913960400191505060405180910390fd5b601080546001019081905560801b8315614a0257600160ff1b175b6000818152600c602090815260408083208690556010548352600e825280832084905580518481529182018390528051839233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292918290030190a49392505050565b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916846001600160a01b031663f23a6e6188888787876040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614b29578181015183820152602001614b11565b50505050905090810190601f168015614b565780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015614b7957600080fd5b505af1158015614b8d573d6000803e3d6000fd5b505050506040513d6020811015614ba357600080fd5b50517fffffffff000000000000000000000000000000000000000000000000000000001614613e5e5760405162461bcd60e51b81526004018080602001828103825260398152602001806158296039913960400191505060405180910390fd5b60008787878787878760405160200180886001600160a01b03166001600160a01b031660601b8152601401876001600160a01b03166001600160a01b031660601b815260140186815260200185815260200184805190602001908083835b60208310614c805780518252601f199092019160209182019101614c61565b51815160209384036101000a600019018019909216911617905292019485525083810192909252506040805180840383018152928101905281519101209d9c50505050505050505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60007ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641418410614d7f5760405162461bcd60e51b81526004018080602001828103825260228152602001806155d96022913960400191505060405180910390fd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115614dde5760405162461bcd60e51b81526004018080602001828103825260228152602001806155fb6022913960400191505060405180910390fd5b8160ff16601b14158015614df657508160ff16601c14155b15614e325760405162461bcd60e51b815260040180806020018281038252602281526020018061570f6022913960400191505060405180910390fd5b604080516000808252602080830180855289905260ff86168385015260608301889052608083018790529251909260019260a080820193601f1981019281900390910190855afa158015614e8a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614ef2576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6040805160609590951b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208087019190915293151560f81b603486015260358501929092526055808501919091528151808503909101815260759093019052815191012090565b60008787878787878760405160200180886001600160a01b03166001600160a01b031660601b8152601401876001600160a01b03166001600160a01b031660601b8152601401868051906020019060200280838360005b83811015614fd4578181015183820152602001614fbc565b50505050905001858051906020019060200280838360005b83811015615004578181015183820152602001614fec565b50505050905001848051906020019080838360208310614c805780518252601f199092019160209182019101614c61565b60008484848460405160200180858051906020019060200280838360005b8381101561506b578181015183820152602001615053565b50505050905001848051906020019060200280838360005b8381101561509b578181015183820152602001615083565b50505050905001838152602001828152602001945050505050604051602081830303815290604052805190602001209050949350505050565b8160028111156150e057fe5b60005460ff1660028111156150f157fe5b1480615117575080600281111561510457fe5b60005460ff16600281111561511557fe5b145b6144945760405162461bcd60e51b81526004018080602001828103825260408152602001806156a06040913960400191505060405180910390fd5b600160005260076020527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828546001600160a01b031633146141a55760405162461bcd60e51b815260040180806020018281038252604381526020018061561d6043913960600191505060405180910390fd5b600060026151d282826150d4565b6000805460ff191660019081179091556002805490910190819055614494906154dd565b6001615201816140f9565b6000805460ff1916600217905560018054810190819055614152906154e8565b805182518451865188516060948a948a948a948a948a948a94919092019092019091010167ffffffffffffffff8111801561525b57600080fd5b506040519080825280601f01601f191660200182016040528015615286576020820181803683370190505b509050806000805b88518110156152df578881815181106152a357fe5b602001015160f81c60f81b8383806001019450815181106152c057fe5b60200101906001600160f81b031916908160001a90535060010161528e565b5060005b8751811015615334578781815181106152f857fe5b602001015160f81c60f81b83838060010194508151811061531557fe5b60200101906001600160f81b031916908160001a9053506001016152e3565b5060005b86518110156153895786818151811061534d57fe5b602001015160f81c60f81b83838060010194508151811061536a57fe5b60200101906001600160f81b031916908160001a905350600101615338565b5060005b85518110156153de578581815181106153a257fe5b602001015160f81c60f81b8383806001019450815181106153bf57fe5b60200101906001600160f81b031916908160001a90535060010161538d565b5060005b8451811015615433578481815181106153f757fe5b602001015160f81c60f81b83838060010194508151811061541457fe5b60200101906001600160f81b031916908160001a9053506001016153e2565b50909d9c50505050505050505050505050565b600081848411156154d55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561549a578181015183820152602001615482565b50505050905090810190601f1680156154c75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001614494816140f9565b6002614494816140f9565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106155345782800160ff19823516178555615561565b82800160010185558215615561579182015b82811115615561578235825591602001919060010190615546565b5061556d929150615571565b5090565b61173691905b8082111561556d576000815560010161557756fe54686973207472616e73616374696f6e206973206e6f742076616c696420616e796d6f72652e5468697320747970654964206973206e6f742061206e6f6e2066756e6769626c6520747970652e45434453413a20696e76616c6964207369676e6174757265202772272076616c756545434453413a20696e76616c6964207369676e6174757265202773272076616c7565556e617574686f72697a65642063616c6c2e205468616e6b7320666f7220737570706f7274696e6720746865206e6574776f726b207769746820796f7572204554482e4120302074696d657374616d70206973206e6f7420616c6c6f7765642e20466f7220696d6d6564696174652072656c656173652063686f6f736520313333372e5468652066756e6374696f6e2063616c6c206973206e6f7420706f737369626c6520696e207468652063757272656e7420636f6e74726163742073746174652e4e656564206f70657261746f7220617070726f76616c20666f7220337264207061727479207472616e73666572732e45434453413a20696e76616c6964207369676e6174757265202776272076616c7565636f6e74726163742072657475726e656420616e20756e6b6e6f776e2076616c75652066726f6d206f6e45524331313535426174636852656365697665644d696e696d756d203120616e64206d6178696d756d20322a2a31323820746f6b656e73206f66206f6e6520747970652063616e2065786973742e54686973207472616e73616374696f6e2077617320657865637574656420616c72656164792e54686520676976656e2070726f706572747920696420646f6573206e6f74206d61746368207468652070726f706572747920747970652e5468697320747970654964206973206e6f7420612066756e6769626c6520747970652e636f6e74726163742072657475726e656420616e20756e6b6e6f776e2076616c75652066726f6d206f6e455243313135355265636569766564a26469706673582212205249e58337c82edd85cf38e053225c650de1b92f8f4c0c9b7d53e6eb64bab53464736f6c634300060700335468652066756e6374696f6e2063616c6c206973206e6f7420706f737369626c6520696e207468652063757272656e7420636f6e74726163742073746174652e546865207265676973747279206d616e6167657220697320726571756972656420746f206372656174652061207265676973747279207479706520636f6e74726163742e000000000000000000000000586a1f3fae69677b59b2eb50b940967969bbec1a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004

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

000000000000000000000000586a1f3fae69677b59b2eb50b940967969bbec1a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004

-----Decoded View---------------
Arg [0] : registryManagerAddress (address): 0x586a1f3fae69677b59b2eb50b940967969bbec1a
Arg [1] : relevantList (uint16[]): 1,4

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000586a1f3fae69677b59b2eb50b940967969bbec1a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004


Deployed ByteCode Sourcemap

104089:8294:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;104089:8294:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;59112:254:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;59112:254:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23935:183;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23935:183:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;106458:258;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;106458:258:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;106458:258:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;106458:258:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;106458:258:0;;-1:-1:-1;106458:258:0;-1:-1:-1;106458:258:0;:::i;88563:205::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;88563:205:0;;:::i;107280:420::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;107280:420:0;;;;;;;;;;;;:::i;:::-;;85216:155;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85216:155:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;85216:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88456:99;;;:::i;106186:264::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;106186:264:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;106186:264:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;106186:264:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;106186:264:0;;-1:-1:-1;106186:264:0;-1:-1:-1;106186:264:0;:::i;87404:1044::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;87404:1044:0;-1:-1:-1;;;;;87404:1044:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;87404:1044:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;87404:1044:0;;;;;;;;;;;;;;;;;;;70417:115;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;70417:115:0;;:::i;84940:268::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;84940:268:0;;;;;;;:::i;57599:1505::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;57599:1505:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;57599:1505:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;57599:1505:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;57599:1505:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;57599:1505:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;57599:1505:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;57599:1505:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;57599:1505:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;57599:1505:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;57599:1505:0;;-1:-1:-1;57599:1505:0;-1:-1:-1;57599:1505:0;:::i;74055:359::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;74055:359:0;;;;;;;:::i;61089:94::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61641:108;;;:::i;106724:266::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;106724:266:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;106724:266:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;106724:266:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;106724:266:0;;-1:-1:-1;106724:266:0;-1:-1:-1;106724:266:0;:::i;74422:357::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;74422:357:0;;;;;;;:::i;108595:424::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;108595:424:0;;;;;;;;;;;;:::i;59374:634::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;59374:634:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;59374:634:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;59374:634:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;59374:634:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;59374:634:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;59374:634:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;59374:634:0;;-1:-1:-1;59374:634:0;-1:-1:-1;59374:634:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;59374:634:0;;;;;;;;;;;;;;;;;88983:170;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;88983:170:0;-1:-1:-1;;;;;88983:170:0;;:::i;88776:199::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;88776:199:0;;:::i;55890:219::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55890:219:0;;:::i;85605:279::-;;;:::i;56117:99::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;56117:99:0;;:::i;:::-;;;;-1:-1:-1;;;;;56117:99:0;;;;;;;;;;;;;;109948:230;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;109948:230:0;;:::i;:::-;;;;;;;;;;;;108154:433;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;108154:433:0;;;;;;;;;;;-1:-1:-1;;;;;108154:433:0;;:::i;71005:101::-;;;:::i;110186:110::-;;;:::i;105916:262::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;105916:262:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;105916:262:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;105916:262:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;105916:262:0;;-1:-1:-1;105916:262:0;-1:-1:-1;105916:262:0;:::i;70718:113::-;;;:::i;55530:116::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55530:116:0;;:::i;55654:228::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55654:228:0;;:::i;75955:1416::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;75955:1416:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;75955:1416:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;75955:1416:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;75955:1416:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;75955:1416:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;75955:1416:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;75955:1416:0;;-1:-1:-1;75955:1416:0;-1:-1:-1;75955:1416:0;:::i;73855:192::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;73855:192:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;73855:192:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;73855:192:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;73855:192:0;;-1:-1:-1;73855:192:0;-1:-1:-1;73855:192:0;:::i;77379:2293::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;77379:2293:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;77379:2293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;77379:2293:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;77379:2293:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;77379:2293:0;;-1:-1:-1;77379:2293:0;-1:-1:-1;77379:2293:0;;;;;;;:::i;105652:256::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;105652:256:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;105652:256:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;105652:256:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;105652:256:0;;-1:-1:-1;105652:256:0;-1:-1:-1;105652:256:0;:::i;61357:104::-;;;:::i;109481:459::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;109481:459:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;109481:459:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;109481:459:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;109481:459:0;;-1:-1:-1;109481:459:0;-1:-1:-1;109481:459:0;:::i;85892:300::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85892:300:0;;:::i;55405:117::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55405:117:0;;:::i;86200:1196::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;86200:1196:0;-1:-1:-1;;;;;86200:1196:0;;:::i;50872:237::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;50872:237:0;;;;;;;;;;:::i;83726:1206::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;83726:1206:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;83726:1206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;85379:218::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85379:218:0;;:::i;109027:446::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;109027:446:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;109027:446:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;109027:446:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;109027:446:0;;-1:-1:-1;109027:446:0;-1:-1:-1;109027:446:0;:::i;55289:108::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55289:108:0;;:::i;69989:170::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;69989:170:0;;:::i;79680:2411::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;79680:2411:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;79680:2411:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;79680:2411:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;79680:2411:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;79680:2411:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;79680:2411:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;79680:2411:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;79680:2411:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;79680:2411:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;79680:2411:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;79680:2411:0;;-1:-1:-1;79680:2411:0;-1:-1:-1;79680:2411:0;;;;;;;:::i;106998:274::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;106998:274:0;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;106998:274:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;106998:274:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;106998:274:0;;-1:-1:-1;106998:274:0;-1:-1:-1;106998:274:0;:::i;107708:438::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;107708:438:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;107708:438:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;107708:438:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;107708:438:0;;-1:-1:-1;107708:438:0;-1:-1:-1;107708:438:0;:::i;82099:1619::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;82099:1619:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;82099:1619:0;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;82099:1619:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;82099:1619:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;82099:1619:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;82099:1619:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;82099:1619:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;82099:1619:0;;-1:-1:-1;82099:1619:0;-1:-1:-1;82099:1619:0;;;;;;;:::i;55160:121::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;55160:121:0;;:::i;51396:201::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;51396:201:0;;;;;;;;;;:::i;56241:1333::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;56241:1333:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;56241:1333:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;56241:1333:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;56241:1333:0;;-1:-1:-1;56241:1333:0;-1:-1:-1;56241:1333:0;:::i;74787:1160::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;74787:1160:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;74787:1160:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;74787:1160:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;74787:1160:0;;-1:-1:-1;74787:1160:0;-1:-1:-1;74787:1160:0;:::i;68817:934::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;68817:934:0;;;;;;;;:::i;59112:254::-;59228:7;59257:22;59275:3;59257:17;:22::i;:::-;59253:66;;;59288:13;;;;:8;:13;;;;;;-1:-1:-1;;;;;59288:23:0;;;:13;;:23;:31;;59318:1;59288:31;;;59314:1;59288:31;59281:38;;;;;;59253:66;-1:-1:-1;59337:13:0;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;59337:21:0;;;;;;;;;;59112:254;;;;;:::o;23935:183::-;24077:33;;;24048:4;24077:33;;;:20;:33;;;;;;;;23935:183;;;;:::o;106458:258::-;106636:7;106568:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;106668:40:::2;106684:4;;106668:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;106690:17:0::2;::::0;-1:-1:-1;106668:15:0::2;::::0;-1:-1:-1;;106668:40:0:i:2;:::-;106661:47:::0;106458:258;-1:-1:-1;;;;106458:258:0:o;88563:205::-;88701:7;88675:6;72928:22;72943:6;72928:14;:22::i;:::-;-1:-1:-1;;88733:27:0::1;::::0;;;:19:::1;:27;::::0;;;;;;88563:205::o;107280:420::-;107452:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;107524:7:::2;104463:22;104477:7;104463:13;:22::i;:::-;107558:10:::3;104569:28;104586:10;104569:16;:28::i;:::-;107594:10:::4;107606:16;104707:41;104723:10;104735:12;104707:15;:41::i;:::-;107645:47:::5;::::0;;;;;;;107674:10;;107665:7;;107645:47:::5;::::0;;;;::::5;::::0;;::::5;104608:1:::4;;104496::::3;72861::::2;107280:420:::0;;;;:::o;85216:155::-;85323:16;85305:58;;;;;;;;;;;;;-1:-1:-1;;85305:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;85272:13;;85305:58;;;;85323:16;;85305:58;;85323:16;85305:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85341:21;85358:3;85341:16;:21::i;:::-;85305:17;:58::i;88456:99::-;88537:10;;88456:99;;:::o;106186:264::-;106367:7;106299:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;106399:43:::2;106415:4;;106399:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;106421:20:0::2;::::0;-1:-1:-1;106399:15:0::2;::::0;-1:-1:-1;;106399:43:0:i:2;87404:1044::-:0;87512:16;;87564:15;87607:1;87590:262;87615:10;;87610:1;:15;87590:262;;87669:3;87664:8;;;87647:14;87691:24;;;:16;:24;;;;;;:29;87687:154;;87771:1;87745:16;;;:8;:16;;;;;;;;-1:-1:-1;;;;;87745:23:0;;;;;;;;;;:27;87741:85;;87797:9;;;;;87741:85;-1:-1:-1;87627:3:0;;87590:262;;;;87864:26;87907:7;87893:22;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;87893:22:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;87893:22:0;;87864:51;;87926:30;87973:7;87959:22;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;87959:22:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;87959:22:0;-1:-1:-1;88002:1:0;;-1:-1:-1;87926:55:0;-1:-1:-1;88031:1:0;88014:383;88039:10;;88034:1;:15;88014:383;;88093:3;88088:8;;;88071:14;88115:24;;;:16;:24;;;;;;:29;88111:275;;88195:1;88169:16;;;:8;:16;;;;;;;;-1:-1:-1;;;;;88169:23:0;;;;;;;;;;:27;88165:206;;88242:6;88221:9;88231:7;88221:18;;;;;;;;;;;;;;;;;;:27;;;;88296:16;;;;:8;:16;;;;;;-1:-1:-1;;;;;88296:23:0;;;;;;;;;88271:22;;:13;;88285:7;;88271:22;;;;;;;;;;;;;;;:48;88342:9;;;;;88165:206;-1:-1:-1;88051:3:0;;88014:383;;;-1:-1:-1;88415:9:0;;-1:-1:-1;88426:13:0;-1:-1:-1;;87404:1044:0;;;:::o;70417:115::-;70481:4;70505:19;;;:15;:19;;;;;;;;;70417:115::o;84940:268::-;85064:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;85137:6:::2;72928:22;72943:6;72928:14;:22::i;:::-;85161:39:::3;85182:6;85190:9;85161:20;:39::i;:::-;72861:1:::2;84940:268:::0;;;:::o;57599:1505::-;-1:-1:-1;;;;;57822:19:0;;57814:59;;;;;-1:-1:-1;;;57814:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57892:29;;;57884:65;;;;;-1:-1:-1;;;57884:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58115:19:0;;58124:10;58115:19;;:66;;-1:-1:-1;;;;;;58138:23:0;;;;;;:16;:23;;;;;;;;58162:10;58138:35;;;;;;;;;;:43;;:35;:43;58115:66;58093:163;;;;-1:-1:-1;;;58093:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58274:9;58269:499;58289:15;;;58269:499;;;58394:10;58407:4;;58412:1;58407:7;;;;;;;;;;;;;58394:20;;58429:13;58445:7;;58453:1;58445:10;;;;;;;;;;;;;58429:26;;58476:17;58490:2;58476:13;:17::i;:::-;58472:285;;;58522:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;58522:21:0;;;:12;;:21;58514:30;;12:1:-1;9;2:12;58514:30:0;58563:12;;;;:8;:12;;;;;:18;;-1:-1:-1;;58563:18:0;-1:-1:-1;;;;;58563:18:0;;;;;58472:285;;;58644:12;;;;:8;:12;;;;;;;;-1:-1:-1;;;;;58644:19:0;;;;;;;;;;:30;;58668:5;58644:30;:23;:30;:::i;:::-;58622:8;:12;58631:2;58622:12;;;;;;;;;;;:19;58635:5;-1:-1:-1;;;;;58622:19:0;-1:-1:-1;;;;;58622:19:0;;;;;;;;;;;;:52;;;;58713:28;58723:8;:12;58732:2;58723:12;;;;;;;;;;;:17;58736:3;-1:-1:-1;;;;;58723:17:0;-1:-1:-1;;;;;58723:17:0;;;;;;;;;;;;;58713:5;:9;;:28;;;;:::i;:::-;58693:12;;;;:8;:12;;;;;;;;-1:-1:-1;;;;;58693:17:0;;;;;;;;;:48;58472:285;-1:-1:-1;;58306:3:0;;58269:499;;;;58818:3;-1:-1:-1;;;;;58785:52:0;58811:5;-1:-1:-1;;;;;58785:52:0;58799:10;-1:-1:-1;;;;;58785:52:0;;58823:4;;58829:7;;58785:52;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;137:4;117:14;-1:-1;;113:30;157:16;;;58785:52:0;;;;;;;;;;;;;-1:-1:-1;58785:52:0;;;;;;;1:33:-1;99:1;81:16;;;74:27;58785:52:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;58785:52:0;;;;-1:-1:-1;58785:52:0;;-1:-1:-1;;;;;;;58785:52:0;58854:16;:3;-1:-1:-1;;;;;58854:14:0;;:16::i;:::-;58850:247;;;58887:198;58941:10;58970:5;58994:3;59016:4;;58887:198;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;58887:198:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59039:7:0;;-1:-1:-1;59039:7:0;;;;58887:198;;;59039:7;;58887:198;59039:7;58887:198;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;58887:198:0;;;;137:4:-1;58887:198:0;;;;;;;;;;;;;;;;;;-1:-1:-1;59065:5:0;;-1:-1:-1;59065:5:0;;;;58887:198;;59065:5;;;;58887:198;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;58887:35:0;;-1:-1:-1;;;58887:198:0:i;:::-;57599:1505;;;;;;;;:::o;74055:359::-;74259:7;74191:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;74284:14:::2;74301:24;74309:4;74315:9;74301:7;:24::i;:::-;74284:41;;74336:46;74357:6;74365:16;74336:20;:46::i;61089:94::-:0;61137:5;61162:13;;;61089:94;:::o;61641:108::-;61722:19;;61641:108;:::o;106724:266::-;106906:7;106838:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;106938:44:::2;106954:4;;106938:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;106960:21:0::2;::::0;-1:-1:-1;106938:15:0::2;::::0;-1:-1:-1;;106938:44:0:i:2;74422:357::-:0;74623:7;74555:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;74648:14:::2;74665:25;74673:5;74680:9;74665:7;:25::i;108595:424::-:0;108769:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;108841:7:::2;104463:22;104477:7;104463:13;:22::i;:::-;108875:10:::3;104569:28;104586:10;104569:16;:28::i;:::-;108911:10:::4;108923:17;104707:41;104723:10;104735:12;104707:15;:41::i;:::-;108963:48:::5;::::0;;;;;;;108993:10;;108984:7;;108963:48:::5;::::0;;;;::::5;::::0;;::::5;104608:1:::4;;104496::::3;72861::::2;108595:424:::0;;;;:::o;59374:634::-;59519:16;59561:29;;;59553:38;;12:1:-1;9;2:12;59553:38:0;59604:26;59647:7;59633:29;;;2:2:-1;;;;27:1;24;17:12;2:2;59633:29:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;59633:29:0;-1:-1:-1;59604:58:0;-1:-1:-1;59680:9:0;59675:297;59695:18;;;59675:297;;;59735:10;59748:4;;59753:1;59748:7;;;;;;;;;;;;;59735:20;;59774:21;59792:2;59774:17;:21::i;:::-;59770:191;;;59847:7;;59855:1;59847:10;;;;;;;59831:12;;;;:8;59847:10;59831:12;;;;;;;;59847:10;;;;;;;-1:-1:-1;;;;;59847:10:0;;;59831:12;;:26;;;;;-1:-1:-1;59831:34:0;;59864:1;59831:34;;;59860:1;59831:34;59816:49;;:9;59826:1;59816:12;;;;;;;;;;;;;:49;;;;;59770:191;;;59921:12;;;;:8;:12;;;;;;59934:7;;59942:1;59934:10;;;;;;;;;;;;;-1:-1:-1;;;;;59934:10:0;-1:-1:-1;;;;;59921:24:0;-1:-1:-1;;;;;59921:24:0;;;;;;;;;;;;;59906:9;59916:1;59906:12;;;;;;;;;;;;;:39;;;;;59770:191;-1:-1:-1;59715:3:0;;59675:297;;;-1:-1:-1;59991:9:0;59374:634;-1:-1:-1;;;;;59374:634:0:o;88983:170::-;-1:-1:-1;;;;;89119:26:0;89087:7;89119:26;;;:18;:26;;;;;;;88983:170::o;88776:199::-;88911:7;88885:6;72928:22;72943:6;72928:14;:22::i;:::-;-1:-1:-1;;88943:24:0::1;::::0;;;:16:::1;:24;::::0;;;;;;88776:199::o;55890:219::-;55951:4;-1:-1:-1;;;55039:8:0;56038:3;:17;:32;56037:64;;;;-1:-1:-1;;56082:13:0;56076:19;:24;;;55890:219::o;85605:279::-;85657:16;85686:26;85729:10;;85715:25;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;85715:25:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;85715:25:0;-1:-1:-1;85686:54:0;-1:-1:-1;85756:9:0;85751:99;85775:10;;85771:1;:14;85751:99;;;85822:16;85832:1;85836;85832:5;85822:9;:16::i;:::-;85807:9;85817:1;85807:12;;;;;;;;;;;;;;;;;:31;85787:3;;85751:99;;;-1:-1:-1;85867:9:0;-1:-1:-1;85605:279:0;:::o;56117:99::-;56168:7;56195:13;;;:8;:13;;;;;;-1:-1:-1;;;;;56195:13:0;;56117:99::o;109948:230::-;110096:12;110066:10;104569:28;104586:10;104569:16;:28::i;:::-;-1:-1:-1;;110133:37:0::1;::::0;;;:25:::1;:37;::::0;;;;;::::1;;::::0;109948:230::o;108154:433::-;108331:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;108403:7:::2;104463:22;104477:7;104463:13;:22::i;:::-;108437:10:::3;104569:28;104586:10;104569:16;:28::i;:::-;108473:10:::4;108485:20;104707:41;104723:10;104735:12;104707:15;:41::i;:::-;108528:51:::5;::::0;;-1:-1:-1;;;;;108528:51:0;::::5;::::0;;;;108561:10;;108552:7;;108528:51:::5;::::0;;;;::::5;::::0;;::::5;104608:1:::4;;104496::::3;72861::::2;108154:433:::0;;;;:::o;71005:101::-;71087:11;;71005:101;:::o;110186:110::-;110273:15;;110186:110;:::o;105916:262::-;106096:7;106028:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;106128:42:::2;106144:4;;106128:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;106150:19:0::2;::::0;-1:-1:-1;106128:15:0::2;::::0;-1:-1:-1;;106128:42:0:i:2;70718:113::-:0;70775:15;70810:13;70803:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70718:113;:::o;55530:116::-;54809:27;55623:15;;55530:116::o;55654:228::-;55719:4;-1:-1:-1;;;55039:8:0;55811:3;:17;:32;55810:64;;;;-1:-1:-1;;55855:13:0;55849:19;:24;;55654:228::o;75955:1416::-;76147:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;76220:6:::2;72928:22;72943:6;72928:14;:22::i;:::-;76252:18:::3;76263:6;76252:10;:18::i;:::-;76244:66;;;;-1:-1:-1::0;;;76244:66:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76343:36:::0;;::::3;76321:110;;;::::0;;-1:-1:-1;;;76321:110:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;76449:9;76444:791;76464:16:::0;;::::3;76444:791;;;76502:10;76515:5;;76521:1;76515:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;76515:8:0::3;76502:21;;76538:16;76557:13;;76571:1;76557:16;;;;;;;;;;;;;76538:35;;76660:8;76636;:16;76645:6;76636:16;;;;;;;;;;;:20;76653:2;-1:-1:-1::0;;;;;76636:20:0::3;-1:-1:-1::0;;;;;76636:20:0::3;;;;;;;;;;;;;:32;;;;;;;;;;;76714:8;76683:19;:27;76703:6;76683:27;;;;;;;;;;;;:39;;;;;;;;;;;76905:2;-1:-1:-1::0;;;;;76864:62:0::3;76899:3;-1:-1:-1::0;;;;;76864:62:0::3;76879:10;-1:-1:-1::0;;;;;76864:62:0::3;;76909:6;76917:8;76864:62;;;;;;;;;;;;;;;;;;;;;;;;76947:15;:2;-1:-1:-1::0;;;;;76947:13:0::3;;:15::i;:::-;76943:281;;;76983:225;77036:10;77069;77102:2;77127:6;77156:8;76983:225;;;;;;;;;;;::::0;:30:::3;:225::i;:::-;-1:-1:-1::0;;76482:3:0::3;;76444:791;;;-1:-1:-1::0;77298:24:0::3;::::0;;;:16:::3;:24;::::0;;;;;;;;77267:19:::3;:27:::0;;;;;;;:55:::3;;77245:118;;;::::0;;-1:-1:-1;;;77245:118:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;72861:1:::2;75955:1416:::0;;;;;;:::o;73855:192::-;72823:27:::1;:25;:27::i;:::-;74017:22:::2;:16;74036:3:::0;;74017:22:::2;:::i;:::-;;73855:192:::0;;:::o;77379:2293::-;77751:16:::2;77770:184;77813:6;77834:3;77852;77870:6;77891:5;;77770:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;77911:5:0;;-1:-1:-1;77931:12:0;;-1:-1:-1;77770:28:0::2;::::0;-1:-1:-1;77770:184:0:i:2;:::-;77751:203;;77965:26;77994:143;78031:47;78069:8;78031:37;:47::i;:::-;78093:1;78109;78125;77994:22;:143::i;:::-;77965:172;;78182:18;-1:-1:-1::0;;;;;78172:28:0::2;:6;-1:-1:-1::0;;;;;78172:28:0::2;;:101;;;-1:-1:-1::0;;;;;;78221:24:0;;::::2;;::::0;;;:16:::2;:24;::::0;;;;;;;:44;;::::2;::::0;;;;;;;::::2;;:52;;:44:::0;:52:::2;78172:101;78150:198;;;;-1:-1:-1::0;;;78150:198:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78399:12;78381:15;:30;78359:118;;;;-1:-1:-1::0;;;78359:118:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;78510:26:0;::::2;;::::0;;;:18:::2;:26;::::0;;;;;:35;::::2;78488:123;;;;-1:-1:-1::0;;;78488:123:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;78624:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;:28;;::::2;;::::0;;78700:19;::::2;78692:59;;;::::0;;-1:-1:-1;;;78692:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;78768:18;78782:3;78768:13;:18::i;:::-;78764:578;;;78811:13;::::0;;;:8:::2;:13;::::0;;;;;-1:-1:-1;;;;;78811:23:0;;::::2;:13:::0;::::2;:23;78803:32;;12:1:-1;9::::0;2:12:::2;78803:32:0;78850:13;::::0;;;:8:::2;:13;::::0;;;;:19;;-1:-1:-1;;78850:19:0::2;-1:-1:-1::0;;;;;78850:19:0;::::2;;::::0;;78764:578:::2;;;79231:13;::::0;;;:8:::2;:13;::::0;;;;;;;-1:-1:-1;;;;;79231:21:0;::::2;::::0;;;;;;;;:33:::2;::::0;79257:6;79231:33:::2;:25;:33;:::i;:::-;79207:8;:13;79216:3;79207:13;;;;;;;;;;;:21;79221:6;-1:-1:-1::0;;;;;79207:21:0::2;-1:-1:-1::0;;;;;79207:21:0::2;;;;;;;;;;;;:57;;;;79300:30;79323:6;79300:8;:13;79309:3;79300:13;;;;;;;;;;;:18;79314:3;-1:-1:-1::0;;;;;79300:18:0::2;-1:-1:-1::0;;;;;79300:18:0::2;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;79279:13;::::0;;;:8:::2;:13;::::0;;;;;;;-1:-1:-1;;;;;79279:18:0;::::2;::::0;;;;;;;:51;78764:578:::2;79394:3;-1:-1:-1::0;;;;;79359:52:0::2;79386:6;-1:-1:-1::0;;;;;79359:52:0::2;79374:10;-1:-1:-1::0;;;;;79359:52:0::2;;79399:3;79404:6;79359:52;;;;;;;;;;;;;;;;;;;;;;;;79428:16;:3;-1:-1:-1::0;;;;;79428:14:0::2;;:16::i;:::-;79424:241;;;79461:192;79510:10;79539:6;79564:3;79586;79608:6;79633:5;;79461:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;79461:30:0::2;::::0;-1:-1:-1;;;79461:192:0:i:2;:::-;67200:1;;77379:2293:::0;;;;;;;;;;;:::o;105652:256::-;105829:7;105761:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;105861:39:::2;105877:4;;105861:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;-1:-1;99:1;-1:-1;105861:15:0::2;::::0;-1:-1:-1;;105861:39:0:i:2;61357:104::-:0;61436:17;;61357:104;:::o;109481:459::-;109674:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;109746:7:::2;104463:22;104477:7;104463:13;:22::i;:::-;109780:10:::3;104569:28;104586:10;104569:16;:28::i;:::-;109816:10:::4;109828:25;104707:41;104723:10;104735:12;104707:15;:41::i;:::-;109914:10:::5;109905:7;109876:56;109926:5;;109876:56;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::5;74:27:::0;109876:56:0::5;::::0;137:4:-1::5;117:14:::0;;::::5;-1:-1:::0;;113:30:::5;157:16:::0;;::::5;109876:56:0::0;;::::5;::::0;-1:-1:-1;109876:56:0;;-1:-1:-1;;;;109876:56:0::5;104608:1:::4;;104496::::3;72861::::2;109481:459:::0;;;;;:::o;85892:300::-;85996:7;86056:10;;86043:9;:23;;:41;;;;-1:-1:-1;86070:14:0;;;86043:41;86021:116;;;;;-1:-1:-1;;;86021:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;86155:29:0;;;;:18;:29;;;;;;;85892:300::o;55405:117::-;55501:13;55495:19;;55405:117::o;86200:1196::-;86311:16;86345:15;86388:1;86371:427;86396:10;;86391:1;:15;86371:427;;86451:3;86446:8;;;-1:-1:-1;;;86445:24:0;86428:14;86488:24;;;:16;:24;;;;;;:29;86484:303;;86555:1;86538:234;86563:27;;;;:19;:27;;;;;;86558:32;;86538:234;;86633:10;;;86620;86670:12;;;:8;:12;;;;;;-1:-1:-1;;;;;86670:21:0;;;:12;;:21;86666:87;;;86720:9;;;;;86666:87;-1:-1:-1;86592:3:0;;86538:234;;;;86484:303;-1:-1:-1;86408:3:0;;86371:427;;;;86810:23;86850:7;86836:22;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;86836:22:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;86836:22:0;-1:-1:-1;86879:1:0;;-1:-1:-1;86810:48:0;-1:-1:-1;86908:1:0;86891:474;86916:10;;86911:1;:15;86891:474;;86971:3;86966:8;;;-1:-1:-1;;;86965:24:0;86948:14;87008:24;;;:16;:24;;;;;;:29;87004:350;;87075:1;87058:281;87083:27;;;;:19;:27;;;;;;87078:32;;87058:281;;87153:10;;;87140;87190:12;;;:8;:12;;;;;;-1:-1:-1;;;;;87190:21:0;;;:12;;:21;87186:134;;;87258:2;87240:6;87247:7;87240:15;;;;;;;;;;;;;;;;;:20;87287:9;;;;;87186:134;-1:-1:-1;87112:3:0;;87058:281;;;;87004:350;-1:-1:-1;86928:3:0;;86891:474;;;-1:-1:-1;87382:6:0;86200:1196;-1:-1:-1;;;86200:1196:0:o;50872:237::-;51003:10;50986:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;50986:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;50986:51:0;;;;;;;;;;51053:48;;;;;;;50986:39;;51003:10;51053:48;;;;;;;;;;;50872:237;;:::o;83726:1206::-;84044:16:::2;84063:131;84103:9;84127;84151:5;84171:12;84063:25;:131::i;:::-;84044:150;;84205:26;84234:143;84271:47;84309:8;84271:37;:47::i;:::-;84333:1;84349;84365;84234:22;:143::i;:::-;84205:172;;84420:6;-1:-1:-1::0;;;;;84398:28:0::2;:18;-1:-1:-1::0;;;;;84398:28:0::2;;84390:59;;;::::0;;-1:-1:-1;;;84390:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;84500:12;84482:15;:30;84460:118;;;;-1:-1:-1::0;;;84460:118:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;84611:26:0;::::2;;::::0;;;:18:::2;:26;::::0;;;;;:35;::::2;84589:123;;;;-1:-1:-1::0;;;84589:123:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;84725:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;;;:28;;::::2;;::::0;;84793:36;;::::2;::::0;;;:16:::2;:36:::0;;;;;:47;;::::2;::::0;;;;;;;;;;:59;;-1:-1:-1;;84793:59:0::2;::::0;::::2;;::::0;;::::2;::::0;;;84868:56;;;;;;;::::2;::::0;;;;;;;;;::::2;67200:1;;83726:1206:::0;;;;;;;;:::o;85379:218::-;85521:7;85495:6;72928:22;72943:6;72928:14;:22::i;:::-;-1:-1:-1;;85553:36:0::1;::::0;;;:28:::1;:36;::::0;;;;;;85379:218::o;109027:446::-;109215:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;109287:7:::2;104463:22;104477:7;104463:13;:22::i;:::-;109321:10:::3;104569:28;104586:10;104569:16;:28::i;:::-;109357:10:::4;109369:21;104707:41;104723:10;104735:12;104707:15;:41::i;:::-;109447:10:::5;109438:7;109413:52;109459:5;;109413:52;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::5;74:27:::0;109413:52:0::5;::::0;137:4:-1::5;117:14:::0;;::::5;-1:-1:::0;;113:30:::5;157:16:::0;;::::5;109413:52:0::0;;::::5;::::0;-1:-1:-1;109413:52:0;;-1:-1:-1;;;;109413:52:0::5;104608:1:::4;;104496::::3;72861::::2;109027:446:::0;;;;;:::o;55289:108::-;-1:-1:-1;;;55367:17:0;:22;;55289:108::o;69989:170::-;70095:7;70127:24;;;:20;:24;;;;;;-1:-1:-1;;;;;70127:24:0;;69989:170::o;79680:2411::-;80081:26:::2;80110:422;80147:326;80203:255;80259:6;80288:3;80314:4;;80203:255;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;80203:255:0;;;;;;80341:7;;80203:255;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;80203:255:0;;;;;;80371:5;;80203:255;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;80399:5:0;;-1:-1:-1;80427:12:0;;-1:-1:-1;80203:33:0::2;::::0;-1:-1:-1;80203:255:0:i:2;:::-;80147:37;:326::i;:::-;80488:1;80504;80520;80110:22;:422::i;:::-;80081:451;;80577:18;-1:-1:-1::0;;;;;80567:28:0::2;:6;-1:-1:-1::0;;;;;80567:28:0::2;;:101;;;-1:-1:-1::0;;;;;;80616:24:0;;::::2;;::::0;;;:16:::2;:24;::::0;;;;;;;:44;;::::2;::::0;;;;;;;::::2;;:52;;:44:::0;:52:::2;80567:101;80545:198;;;;-1:-1:-1::0;;;80545:198:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80762:29:::0;;::::2;80754:66;;;::::0;;-1:-1:-1;;;80754:66:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;80871:12;80853:15;:30;80831:118;;;;-1:-1:-1::0;;;80831:118:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;80982:26:0;::::2;;::::0;;;:18:::2;:26;::::0;;;;;:35;::::2;80960:123;;;;-1:-1:-1::0;;;80960:123:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;81096:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;:28;;::::2;;::::0;;81172:19;::::2;81164:59;;;::::0;;-1:-1:-1;;;81164:59:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;81242:29:::0;;::::2;81234:65;;;::::0;;-1:-1:-1;;;81234:65:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;81317:9;81312:441;81332:15:::0;;::::2;81312:441;;;81373:22;81387:4;;81392:1;81387:7;;;;;;;;;;;;;81373:13;:22::i;:::-;81369:373;;;81445:6;-1:-1:-1::0;;;;;81424:27:0::2;:8;:17;81433:4;;81438:1;81433:7;;;;;;;;::::0;;::::2;::::0;;;::::2;;81424:17:::0;;-1:-1:-1;81424:17:0;::::2;::::0;;;;;;-1:-1:-1;81424:17:0;;-1:-1:-1;;;;;81424:17:0::2;:27;81416:36;;12:1:-1;9::::0;2:12:::2;81416:36:0;81491:3;81471:8;:17;81480:4;;81485:1;81480:7;;;;;;;;;;;;;81471:17;;;;;;;;;;;;:23;;;;;-1:-1:-1::0;;;;;81471:23:0::2;;;;;-1:-1:-1::0;;;;;81471:23:0::2;;;;;;81369:373;;;81563:81;81615:7;;81623:1;81615:10;;;;;;;;;;;;;81563:8;:17;81572:4;;81577:1;81572:7;;;;;;;;;;;;;81563:17;;;;;;;;;;;:25;81581:6;-1:-1:-1::0;;;;;81563:25:0::2;-1:-1:-1::0;;;;;81563:25:0::2;;;;;;;;;;;;;:29;;:81;;;;:::i;:::-;81535:8;:17;81544:4;;81549:1;81544:7;;;;;;;;;;;;;81535:17;;;;;;;;;;;:25;81553:6;-1:-1:-1::0;;;;;81535:25:0::2;-1:-1:-1::0;;;;;81535:25:0::2;;;;;;;;;;;;:109;;;;81688:38;81703:8;:17;81712:4;;81717:1;81712:7;;;;;;;;;;;;;81703:17;;;;;;;;;;;:22;81721:3;-1:-1:-1::0;;;;;81703:22:0::2;-1:-1:-1::0;;;;;81703:22:0::2;;;;;;;;;;;;;81688:7;;81696:1;81688:10;;;;;;;;;;;;;:14;;:38;;;;:::i;:::-;81663:8;:17;81672:4;;81677:1;81672:7;;;;;;;;;;;;;81663:17;;;;;;;;;;;:22;81681:3;-1:-1:-1::0;;;;;81663:22:0::2;-1:-1:-1::0;;;;;81663:22:0::2;;;;;;;;;;;;:63;;;;81369:373;81349:3;;81312:441;;;;81804:3;-1:-1:-1::0;;;;;81770:53:0::2;81796:6;-1:-1:-1::0;;;;;81770:53:0::2;81784:10;-1:-1:-1::0;;;;;81770:53:0::2;;81809:4;;81815:7;;81770:53;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::2;74:27:::0;137:4:::2;117:14;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;81770:53:0::0;;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;-1:-1:-1;81770:53:0;;;::::2;::::0;;;1:33:-1::2;99:1;81:16:::0;;::::2;74:27:::0;81770:53:0::2;::::0;137:4:-1::2;117:14:::0;;::::2;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;81770:53:0::0;;::::2;::::0;-1:-1:-1;81770:53:0;;-1:-1:-1;;;;;;;81770:53:0::2;81840:16;:3;-1:-1:-1::0;;;;;81840:14:0::2;;:16::i;:::-;81836:248;;;81873:199;81927:10;81956:6;81981:3;82003:4;;81873:199;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;81873:199:0;;;;;;82026:7;;81873:199;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;;81873:199:0::2;::::0;;::::2;137:4:-1;81873:199:0::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;;;;;;-1:-1:-1;82052:5:0;;-1:-1:-1;82052:5:0;;;;81873:199;::::2;82052:5:::0;;;;81873:199;1:33:-1::2;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;81873:35:0::2;::::0;-1:-1:-1;;;81873:199:0:i:2;:::-;67200:1;79680:2411:::0;;;;;;;;;;;;;:::o;106998:274::-;107184:7;107116:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;107216:48:::2;107232:4;;107216:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;107238:25:0::2;::::0;-1:-1:-1;107216:15:0::2;::::0;-1:-1:-1;;107216:48:0:i:2;107708:438::-:0;107892:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;107964:7:::2;104463:22;104477:7;104463:13;:22::i;:::-;107998:10:::3;104569:28;104586:10;104569:16;:28::i;:::-;108034:10:::4;108046:19;104707:41;104723:10;104735:12;104707:15;:41::i;:::-;108120:10:::5;108111:7;108088:50;108132:5;;108088:50;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::5;74:27:::0;108088:50:0::5;::::0;137:4:-1::5;117:14:::0;;::::5;-1:-1:::0;;113:30:::5;157:16:::0;;::::5;108088:50:0::0;;::::5;::::0;-1:-1:-1;108088:50:0;;-1:-1:-1;;;;108088:50:0::5;104608:1:::4;;104496::::3;72861::::2;107708:438:::0;;;;;:::o;82099:1619::-;72823:27:::1;:25;:27::i;:::-;82434:16:::2;82453:50;82470:3;;82453:50;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;;82453:50:0::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;-1:-1:-1;82475:6:0;;-1:-1:-1;82475:6:0;;;;82453:50;::::2;::::0;82475:6;;82453:50;82475:6;82453:50;1:33:-1::2;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;82483:5:0;;-1:-1:-1;82490:12:0;;-1:-1:-1;82453:16:0::2;::::0;-1:-1:-1;82453:50:0:i:2;:::-;82434:69;;82759:6;-1:-1:-1::0;;;;;82538:227:0::2;82557:183;82602:47;82640:8;82602:37;:47::i;:::-;82672:1;82696;82720;82557:22;:183::i;:::-;-1:-1:-1::0;;;;;82538:227:0::2;;82516:295;;;::::0;;-1:-1:-1;;;82516:295:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;82830:27:::0;;::::2;82822:64;;;::::0;;-1:-1:-1;;;82822:64:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;82937:12;82919:15;:30;82897:118;;;;-1:-1:-1::0;;;82897:118:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;83048:26:0;::::2;;::::0;;;:18:::2;:26;::::0;;;;;:35;::::2;83026:123;;;;-1:-1:-1::0;;;83026:123:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;83162:26:0;::::2;;::::0;;;:18:::2;:26;::::0;;;;:28;;::::2;;::::0;;83230:403:::2;83250:14:::0;;::::2;83230:403;;;83286:10;83299:3;;83303:1;83299:6;;;;;;;;;;;;;83286:19;;83326:17;83340:2;83326:13;:17::i;:::-;83322:300;;;83372:12;::::0;;;:8:::2;:12;::::0;;;;;-1:-1:-1;;;;;83372:22:0;;::::2;:12:::0;::::2;:22;83364:57;;;::::0;;-1:-1:-1;;;83364:57:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;83463:3;83440:12:::0;;;:8:::2;:12;::::0;;;;:27;;-1:-1:-1;;83440:27:0::2;::::0;;83322:300:::2;;;83508:13;83524:6;;83531:1;83524:9;;;;;;;;;;;;;83508:25;;83575:31;83600:5;83575:8;:12;83584:2;83575:12;;;;;;;;;;;:20;83588:6;-1:-1:-1::0;;;;;83575:20:0::2;-1:-1:-1::0;;;;;83575:20:0::2;;;;;;;;;;;;;:24;;:31;;;;:::i;:::-;83552:8;:12;83561:2;83552:12;;;;;;;;;;;:20;83565:6;-1:-1:-1::0;;;;;83552:20:0::2;-1:-1:-1::0;;;;;83552:20:0::2;;;;;;;;;;;;:54;;;;83322:300;;-1:-1:-1::0;83266:3:0::2;;83230:403;;;;83692:3;-1:-1:-1::0;;;;;83650:60:0::2;83676:6;-1:-1:-1::0;;;;;83650:60:0::2;83664:10;-1:-1:-1::0;;;;;83650:60:0::2;;83698:3;;83703:6;;83650:60;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::2;74:27:::0;137:4:::2;117:14;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;83650:60:0::0;;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;-1:-1:-1;83650:60:0;;;::::2;::::0;;;1:33:-1::2;99:1;81:16:::0;;::::2;74:27:::0;83650:60:0::2;::::0;137:4:-1::2;117:14:::0;;::::2;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;83650:60:0::0;;::::2;::::0;-1:-1:-1;83650:60:0;;-1:-1:-1;;;;;;;83650:60:0::2;72861:1;82099:1619:::0;;;;;;;;;;:::o;55160:121::-;-1:-1:-1;;;55241:17:0;;;:32;;55160:121::o;51396:201::-;-1:-1:-1;;;;;51554:24:0;;;51525:4;51554:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;51396:201::o;56241:1333::-;-1:-1:-1;;;;;56435:19:0;;56427:59;;;;;-1:-1:-1;;;56427:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56519:19:0;;56528:10;56519:19;;:66;;-1:-1:-1;;;;;;56542:23:0;;;;;;:16;:23;;;;;;;;56566:10;56542:35;;;;;;;;;;:43;;:35;:43;56519:66;56497:163;;;;-1:-1:-1;;;56497:163:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56677:18;56691:3;56677:13;:18::i;:::-;56673:573;;;56720:13;;;;:8;:13;;;;;;-1:-1:-1;;;;;56720:22:0;;;:13;;:22;56712:31;;12:1:-1;9;2:12;56712:31:0;56758:13;;;;:8;:13;;;;;:19;;-1:-1:-1;;56758:19:0;-1:-1:-1;;;;;56758:19:0;;;;;56673:573;;;57136:13;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;57136:20:0;;;;;;;;;;:32;;57161:6;57136:32;:24;:32;:::i;:::-;57113:13;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;57113:20:0;;;;;;;;;;:55;;;;57204:18;;;;;;:30;;57227:6;57204:22;:30::i;:::-;57183:13;;;;:8;:13;;;;;;;;-1:-1:-1;;;;;57183:18:0;;;;;;;;;:51;56673:573;57297:3;-1:-1:-1;;;;;57263:51:0;57290:5;-1:-1:-1;;;;;57263:51:0;57278:10;-1:-1:-1;;;;;57263:51:0;;57302:3;57307:6;57263:51;;;;;;;;;;;;;;;;;;;;;;;;57331:16;:3;-1:-1:-1;;;;;57331:14:0;;:16::i;:::-;57327:240;;;57364:191;57413:10;57442:5;57466:3;57488;57510:6;57535:5;;57364:191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;57364:30:0;;-1:-1:-1;;;57364:191:0:i;:::-;56241:1333;;;;;;:::o;74787:1160::-;74914:12;60699:23;60715:6;60699:15;:23::i;:::-;72823:27:::1;:25;:27::i;:::-;74987:6:::2;72928:22;72943:6;72928:14;:22::i;:::-;75033:21:::3;75047:6;75033:13;:21::i;:::-;75011:110;;;;-1:-1:-1::0;;;75011:110:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75165:13;75181:27:::0;;;:19:::3;:27;::::0;;;;;;75223:43;;::::3;::::0;;;75211:1:::3;75181:31;::::0;75279:532:::3;75299:16:::0;;::::3;75279:532;;;75337:10;75350:5;;75356:1;75350:8;;;;;;;75396:9:::0;;::::3;75386:20:::0;::::3;75373:10;75423:12:::0;;;:8:::3;75350;75423:12:::0;;;;;;;:17;;75350:8;;::::3;::::0;;;::::3;;-1:-1:-1::0;;;;;75350:8:0::3;-1:-1:-1::0;;75423:17:0;;::::3;::::0;::::3;::::0;;;75462:51;;;;;-1:-1:-1;75462:51:0;;::::3;::::0;;;;;;75350:8;;-1:-1:-1;75386:20:0;;75350:8;;-1:-1:-1;75373:10:0;;75477::::3;::::0;75462:51:::3;::::0;;;;;;;::::3;75534:15;:2;-1:-1:-1::0;;;;;75534:13:0::3;;:15::i;:::-;75530:270;;;75570:214;75623:10;75656;75689:2;75714;75739:1;75570:214;;;;;;;;;;;::::0;:30:::3;:214::i;:::-;-1:-1:-1::0;;75317:3:0::3;;75279:532;;;-1:-1:-1::0;75874:24:0::3;::::0;;;:16:::3;:24;::::0;;;;;;;;75843:19:::3;:27:::0;;;;;;;:55:::3;;75821:118;;;::::0;;-1:-1:-1;;;75821:118:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;68817:934:::0;68946:12;68960:14;60816:34;60833:7;60842;60816:16;:34::i;:::-;67104:30:::1;:28;:30::i;:::-;69120:19:::2;::::0;;;:15:::2;:19;::::0;;;;;::::2;;:27;;:19:::0;:27:::2;::::0;:76:::2;;-1:-1:-1::0;;;;;;69164:32:0;::::2;69191:4;69164:32;69120:76;:110;;;;69219:11;;69213:2;:17;69120:110;69102:642;;;69326:11;;69320:2;:17;69316:417;;;69372:1;69358:11;:15:::0;69392:21:::2;:19;:21::i;:::-;69316:417;;;-1:-1:-1::0;;;;;69522:32:0;::::2;69549:4;69522:32;69518:139;;;69579:11;:16:::0;;;69618:19:::2;:17;:19::i;:::-;69675:24;::::0;;;:20:::2;:24;::::0;;;;:42;;-1:-1:-1;;;;;69675:42:0;::::2;-1:-1:-1::0;;69675:42:0;;::::2;;::::0;;68817:934;;;;:::o;61937:209::-;62040:6;62023:23;;;;;;;;:13;;;;:23;;;;;;;;;62001:137;;;;-1:-1:-1;;;62001:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61937:209;:::o;89353:222::-;89462:10;89437:21;89456:1;89437:18;:21::i;:::-;-1:-1:-1;;;;;89437:35:0;;89415:152;;;;-1:-1:-1;;;89415:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89353:222::o;111992:388::-;112124:15;:17;;;;;;;;;;112099:7;112209:42;;;:25;:42;;;;;:57;;112254:12;;-1:-1:-1;;112209:57:0;;;;112254:12;112209:57;;;;;;;;;;;;;112324:12;112284:53;;;;;;;;;112301:15;;112318:4;112284:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;112284:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112357:15:0;;111992:388;;;;:::o;89758:137::-;89831:24;;;;:16;:24;;;;;;89823:64;;;;;-1:-1:-1;;;89823:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;110532:340;110601:22;110615:7;110601:13;:22::i;:::-;110597:268;;;110695:3;110666:17;;;:8;:17;;;;;;-1:-1:-1;;;;;110666:17:0;110640:118;;;;;-1:-1:-1;;;110640:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;110597:268;;;110799:21;110812:7;110799:12;:21::i;:::-;110791:62;;;;;-1:-1:-1;;;110791:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;111013:204;111120:15;;111106:10;:29;;:48;;;;-1:-1:-1;111139:15:0;;;111106:48;111084:125;;;;;-1:-1:-1;;;111084:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;111467:286;111650:12;111609:53;;;;;;;;:37;;;;:25;:37;;;;;;;;:53;;;;;;;;;111587:158;;;;-1:-1:-1;;;111587:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111467:286;;:::o;18251:530::-;18331:27;18380:7;18376:50;;-1:-1:-1;18404:10:0;;;;;;;;;;;;;;;;;;;18376:50;18448:2;18436:9;18483:69;18490:6;;18483:69;;18513:5;;18538:2;18533:7;;;;18483:69;;;18562:17;18592:3;18582:14;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18582:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;18582::0;87:42:-1;143:17;;-1:-1;18582:14:0;-1:-1:-1;18562:34:0;-1:-1:-1;;;18619:7:0;;18637:107;18644:7;;18637:107;;18704:2;18699;:7;18693:2;:14;18680:29;;18668:4;18673:3;;;;;;;18668:9;;;;;;;;;;;:41;-1:-1:-1;;;;;18668:41:0;;;;;;;;-1:-1:-1;18730:2:0;18724:8;;;;18637:107;;;-1:-1:-1;18768:4:0;18251:530;-1:-1:-1;;;;18251:530:0:o;16424:200::-;16529:33;16587:29;16597:2;16601;16587:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;16580:36;16424:200;-1:-1:-1;;;16424:200:0:o;91615:542::-;91721:14;91699:128;;;;-1:-1:-1;;;91699:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;91860:36;;;;:28;:36;;;;;;:41;;:116;;-1:-1:-1;91922:36:0;;;;:28;:36;;;;;;91961:15;-1:-1:-1;91860:116:0;91838:197;;;;;-1:-1:-1;;;91838:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;92046:36;;;;:28;:36;;;;;;;;;:48;;;92112:37;;;;;;;92075:6;;92112:37;;;;;;;;;91615:542;;:::o;26021:136::-;26079:7;26106:43;26110:1;26113;26106:43;;;;;;;;;;;;;;;;;:3;:43::i;25565:181::-;25623:7;25655:5;;;25679:6;;;;25671:46;;;;;-1:-1:-1;;;25671:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;30587:657;31180:20;31228:8;;;30587:657::o;53051:1385::-;31541:10;54316:22;;54124:214;;;54145:3;-1:-1:-1;;;;;54124:48:0;;54191:9;54219:5;54243:4;54266:7;54292:5;54124:188;;;;;;;;;;;;;-1:-1:-1;;;;;54124:188:0;-1:-1:-1;;;;;54124:188:0;;;;;;-1:-1:-1;;;;;54124:188:0;-1:-1:-1;;;;;54124:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54124:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54124:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54124:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54124:188:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54124:188:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;54124:188:0;:214;;;54102:326;;;;-1:-1:-1;;;54102:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90525:727;90589:7;90631:14;;;;;:46;;;72761:6;90649:9;:28;;90631:46;90609:154;;;;-1:-1:-1;;;90609:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90845:10;90843:12;;;;;;;;90859:3;90843:19;90918:39;;;;-1:-1:-1;;;90937:20:0;90918:39;90970:24;;;;:16;:24;;;;;;;;:36;;;91036:10;;91017:30;;:18;:30;;;;;:39;;;91153:65;;;;;;;;;;;;;90970:24;;91168:10;;91153:65;;;;;;;;;91238:6;90525:727;-1:-1:-1;;;90525:727:0:o;51712:1331::-;31393:10;52934:16;;52749:201;;;52770:3;-1:-1:-1;;;;;52749:43:0;;52811:9;52839:5;52863:3;52885:6;52910:5;52749:181;;;;;;;;;;;;;-1:-1:-1;;;;;52749:181:0;-1:-1:-1;;;;;52749:181:0;;;;;;-1:-1:-1;;;;;52749:181:0;-1:-1:-1;;;;;52749:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;52749:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52749:181:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52749:181:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;52749:181:0;:201;;;52727:308;;;;-1:-1:-1;;;52727:308:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93067:572;93312:7;93419:6;93448:3;93474;93500:6;93529:5;93557;93585:12;93380:236;;;;;;-1:-1:-1;;;;;93380:236:0;-1:-1:-1;;;;;93380:236:0;;;;;;;;-1:-1:-1;;;;;93380:236:0;-1:-1:-1;;;;;93380:236:0;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;93380:236:0;;;;;-1:-1:-1;93380:236:0;;;;;;;-1:-1:-1;93380:236:0;;;26:21:-1;;;22:32;;6:49;;93380:236:0;;;;;93352:279;;;;;;93067:572;-1:-1:-1;;;;;;;;;;;;;93067:572:0:o;21940:346::-;22205:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22205:58:0;;;;;;;22177:101;;;;;;21940:346::o;19824:1842::-;19952:7;20967:66;20940:93;;20922:194;;21060:44;;-1:-1:-1;;;21060:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20922:194;21170:66;21144:92;;21126:193;;;21263:44;;-1:-1:-1;;;21263:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21126:193;21335:1;:7;;21340:2;21335:7;;:18;;;;;21346:1;:7;;21351:2;21346:7;;21335:18;21331:95;;;21370:44;;-1:-1:-1;;;21370:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21331:95;21540:24;;;21523:14;21540:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21523:14;;21540:24;;;;;;;-1:-1:-1;;21540:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21540:24:0;;-1:-1:-1;;21540:24:0;;;-1:-1:-1;;;;;;;21583:20:0;;21575:57;;;;;-1:-1:-1;;;21575:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21652:6;19824:1842;-1:-1:-1;;;;;19824:1842:0:o;94254:322::-;94494:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;94494:59:0;;;;;;94466:102;;;;;;94254:322::o;93647:599::-;93917:7;94024:6;94053:3;94079:4;94106:7;94136:5;94164;94192:12;93985:238;;;;;;-1:-1:-1;;;;;93985:238:0;-1:-1:-1;;;;;93985:238:0;;;;;;;;-1:-1:-1;;;;;93985:238:0;-1:-1:-1;;;;;93985:238:0;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;93985:238:0;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;93985:238:0;;;;;;;;;;;;;;;;66:2:-1;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;92788:271:0;92963:7;93017:3;93022:6;93030:5;93037:12;93000:50;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;93000:50:0;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;93000:50:0;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;93000:50:0;;;92990:61;;;;;;92983:68;;92788:271;;;;;;:::o;62368:255::-;62488:7;62471:24;;;;;;;;:13;;;;:24;;;;;;;;;:52;;;;62516:7;62499:24;;;;;;;;:13;;;;:24;;;;;;;;;62471:52;62449:166;;;;-1:-1:-1;;;62449:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71253:227;71375:1;71354:23;;:20;:23;;;;-1:-1:-1;;;;;71354:23:0;71340:10;:37;71318:154;;;;-1:-1:-1;;;71318:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62793:233;62867:13;62882:12;60816:34;60833:7;60842;60816:16;:34::i;:::-;62912:13:::1;:30:::0;;-1:-1:-1;;62912:30:0::1;62928:14;62912:30:::0;;::::1;::::0;;;62953:19:::1;:21:::0;;;;::::1;::::0;;;;62985:33:::1;::::0;:12:::1;:33::i;63177:186::-:0;63230:14;60699:23;60715:6;60699:15;:23::i;:::-;63257:13:::1;:28:::0;;-1:-1:-1;;63257:28:0::1;63273:12;63257:28;::::0;;;63296:19;;;::::1;::::0;;;;63326:29:::1;::::0;:10:::1;:29::i;17115:1128::-:0;17639:10;;17626;;17613;;17600;;17587;;17299:33;;17370:2;;17409;;17448;;17487;;17526;;17299:33;;17587:23;;;;:36;;;:49;;;:62;17562:98;;;2:2:-1;;;;27:1;24;17:12;2:2;17562:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;17562:98:0;87:42:-1;143:17;;-1:-1;17562:98:0;-1:-1:-1;17540:120:0;-1:-1:-1;17540:120:0;17716:9;;17764:80;17780:3;:10;17776:1;:14;17764:80;;;17826:3;17830:1;17826:6;;;;;;;;;;;;;;;;17812;17819:3;;;;;;17812:11;;;;;;;;;;;:20;-1:-1:-1;;;;;17812:20:0;;;;;;;;-1:-1:-1;17792:3:0;;17764:80;;;-1:-1:-1;17863:1:0;17854:80;17870:3;:10;17866:1;:14;17854:80;;;17916:3;17920:1;17916:6;;;;;;;;;;;;;;;;17902;17909:3;;;;;;17902:11;;;;;;;;;;;:20;-1:-1:-1;;;;;17902:20:0;;;;;;;;-1:-1:-1;17882:3:0;;17854:80;;;-1:-1:-1;17953:1:0;17944:80;17960:3;:10;17956:1;:14;17944:80;;;18006:3;18010:1;18006:6;;;;;;;;;;;;;;;;17992;17999:3;;;;;;17992:11;;;;;;;;;;;:20;-1:-1:-1;;;;;17992:20:0;;;;;;;;-1:-1:-1;17972:3:0;;17944:80;;;-1:-1:-1;18043:1:0;18034:80;18050:3;:10;18046:1;:14;18034:80;;;18096:3;18100:1;18096:6;;;;;;;;;;;;;;;;18082;18089:3;;;;;;18082:11;;;;;;;;;;;:20;-1:-1:-1;;;;;18082:20:0;;;;;;;;-1:-1:-1;18062:3:0;;18034:80;;;-1:-1:-1;18133:1:0;18124:80;18140:3;:10;18136:1;:14;18124:80;;;18186:3;18190:1;18186:6;;;;;;;;;;;;;;;;18172;18179:3;;;;;;18172:11;;;;;;;;;;;:20;-1:-1:-1;;;;;18172:20:0;;;;;;;;-1:-1:-1;18152:3:0;;18124:80;;;-1:-1:-1;18228:6:0;;17115:1128;-1:-1:-1;;;;;;;;;;;;;17115:1128:0:o;26452:226::-;26572:7;26608:12;26600:6;;;;26592:29;;;;-1:-1:-1;;;26592:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26592:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26644:5:0;;;26452:226::o;64249:132::-;64358:14;60699:23;60715:6;60699:15;:23::i;63739:126::-;63844:12;60699:23;60715:6;60699:15;:23::i;104089:8294::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;104089:8294:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;104089:8294:0;;;-1:-1:-1;104089:8294:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://5249e58337c82edd85cf38e053225c650de1b92f8f4c0c9b7d53e6eb64bab534
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading