Token
My Store (MYS)
ERC-1155
Overview
Max Total Supply
0 MYS
Holders
6
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
AssetContractShared
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT import "./AssetContract.sol"; import "./ERC20.sol"; import "./ReentrancyGuard.sol"; import "./Strings.sol"; import "./TokenIdentifiers.sol"; pragma solidity 0.8.4; /** * @title AssetContractShared * Store shared asset contract - A contract for easily creating custom assets on store */ contract AssetContractShared is AssetContract, ReentrancyGuard { // Migration contract address AssetContractShared public migrationTarget; mapping(address => bool) public sharedProxyAddresses; struct Ownership { uint256 id; address owner; } struct NFTVoucher { uint256 tokenId; string uri; address erc20Token; uint256 erc20TokenAmount; address receiver; } bytes32 private constant NFT_VOUCHER_TYPEHASH = keccak256( bytes( "NFTVoucher(uint256 tokenId,string uri,address erc20Token,uint256 erc20TokenAmount,address receiver)" ) ); using TokenIdentifiers for uint256; event CreatorChanged(uint256 indexed _id, address indexed _creator); mapping(uint256 => address) internal _creatorOverride; /** * @dev Require msg.sender to be the creator of the token id */ modifier creatorOnly(uint256 _id) { require( _isCreatorOrManager(_id, _msgSender()), "AssetContractShared#creatorOnly: ONLY_CREATOR_ALLOWED" ); _; } /** * @dev Require msg.sender to be the creator of the token id */ modifier isCreatorOrMinter(uint256 _id) { require( _isCreatorOrMinter(_id, _msgSender()), "AssetContractShared#isCreatorOrMinter: ONLY_CREATOR_ALLOWED" ); _; } /** * @dev Require the caller to own the full supply of the token */ modifier onlyFullTokenOwner(uint256 _id) { require( _ownsTokenAmount(_msgSender(), _id, _id.tokenMaxSupply()), "AssetContractShared#onlyFullTokenOwner: ONLY_FULL_TOKEN_OWNER_ALLOWED" ); _; } constructor( string memory _name, string memory _symbol, address _proxyRegistryAddress, string memory _templateURI, address _migrationAddress ) AssetContract(_name, _symbol, _proxyRegistryAddress, _templateURI) { migrationTarget = AssetContractShared(_migrationAddress); } /** * @dev Allows owner to change the proxy registry */ function setProxyRegistryAddress(address _address) public onlyOwnerOrProxy { proxyRegistryAddress = _address; } /** * @dev Allows owner to add a shared proxy address */ function addSharedProxyAddress(address _address) public onlyOwnerOrProxy { sharedProxyAddresses[_address] = true; } /** * @dev Allows owner to remove a shared proxy address */ function removeSharedProxyAddress(address _address) public onlyOwnerOrProxy { delete sharedProxyAddresses[_address]; } /** * @dev Allows owner to disable the ability to migrate */ function disableMigrate() public onlyOwnerOrManager { migrationTarget = AssetContractShared(address(0)); } /** * @dev Migrate state from previous contract */ function migrate(Ownership[] memory _ownerships) public onlyOwnerOrManager { AssetContractShared _migrationTarget = migrationTarget; require( _migrationTarget != AssetContractShared(address(0)), "AssetContractShared#migrate: MIGRATE_DISABLED" ); string memory _migrationTargetTemplateURI = _migrationTarget.templateURI(); for (uint256 i = 0; i < _ownerships.length; ++i) { uint256 id = _ownerships[i].id; address owner = _ownerships[i].owner; require( owner != address(0), "AssetContractShared#migrate: ZERO_ADDRESS_NOT_ALLOWED" ); uint256 previousAmount = _migrationTarget.balanceOf(owner, id); if (previousAmount == 0) { continue; } _mint(owner, id, previousAmount, ""); if ( keccak256(bytes(_migrationTarget.uri(id))) != keccak256(bytes(_migrationTargetTemplateURI)) ) { _setPermanentURI(id, _migrationTarget.uri(id)); } } } function mint( address _to, uint256 _id, uint256 _quantity, bytes memory _data ) public override nonReentrant isCreatorOrMinter(_id) { _mint(_to, _id, _quantity, _data); } function batchMint( address _to, uint256[] memory _ids, uint256[] memory _quantities, bytes memory _data ) public override nonReentrant { for (uint256 i = 0; i < _ids.length; i++) { require( _isCreatorOrMinter(_ids[i], _msgSender()), "AssetContractShared#_batchMint: ONLY_CREATOR_ALLOWED" ); } _batchMint(_to, _ids, _quantities, _data); } ///////////////////////////////// // CONVENIENCE CREATOR METHODS // ///////////////////////////////// /** * @dev Will update the URI for the token * @param _id The token ID to update. msg.sender must be its creator, the uri must be impermanent, * and the creator must own all of the token supply * @param _uri New URI for the token. */ function setURI(uint256 _id, string memory _uri) public override creatorOnly(_id) onlyImpermanentURI(_id) onlyFullTokenOwner(_id) { _setURI(_id, _uri); } /** * @dev setURI, but permanent */ function setPermanentURI(uint256 _id, string memory _uri) public override creatorOnly(_id) onlyImpermanentURI(_id) onlyFullTokenOwner(_id) { _setPermanentURI(_id, _uri); } /** * @dev Change the creator address for given token * @param _to Address of the new creator * @param _id Token IDs to change creator of */ function setCreator(uint256 _id, address _to) public creatorOnly(_id) { require( _to != address(0), "AssetContractShared#setCreator: INVALID_ADDRESS." ); _creatorOverride[_id] = _to; emit CreatorChanged(_id, _to); } /** * @dev Get the creator for a token * @param _id The token id to look up */ function creator(uint256 _id) public view returns (address) { if (_creatorOverride[_id] != address(0)) { return _creatorOverride[_id]; } else { return _id.tokenCreator(); } } /** * @dev Get the maximum supply for a token * @param _id The token id to look up */ function maxSupply(uint256 _id) public pure returns (uint256) { return _id.tokenMaxSupply(); } // Override ERC1155Tradable for birth events function _origin(uint256 _id) internal pure override returns (address) { return _id.tokenCreator(); } function _remainingSupply(uint256 _id) internal view override returns (uint256) { return maxSupply(_id) - totalSupply(_id); } function _isCreatorOrProxy(uint256 _id, address _address) internal view override returns (bool) { address creator_ = creator(_id); return creator_ == _address || _isProxyForUser(creator_, _address); } function _isCreatorOrManager(uint256 _id, address _address) internal view returns (bool) { address creator_ = creator(_id); return creator_ == _address || managerAddresses[_address]; } function _isCreatorOrMinter(uint256 _id, address _address) internal view returns (bool) { address creator_ = creator(_id); return creator_ == _address || minterAddresses[_address]; } // Overrides ERC1155Tradable to allow a shared proxy address function _isProxyForUser(address _user, address _address) internal view override returns (bool) { if (sharedProxyAddresses[_address]) { return true; } return super._isProxyForUser(_user, _address); } /// @notice Redeems an NFTVoucher for an actual NFT, creating it in the process. /// @param voucher A NFTVoucher that describes the NFT to be redeemed. function redeem( address minter, NFTVoucher calldata voucher, bytes32 sigR, bytes32 sigS, uint8 sigV) public payable returns (uint256) { require( verifyRedeem(minter, voucher, sigR, sigS, sigV), "AssetContractShared#redeem: INVALID_SIGNATURE" ); // make sure that the signer is authorized to mint NFTs require( _isCreatorOrMinter(voucher.tokenId, minter), "AssetContractShared#redeem: ONLY_CREATOR_ALLOWED" ); require(!exists(voucher.tokenId), "AssetContractShared#redeem: TOKEN_REDEEMED"); uint256 tokenBalance = ERC20(voucher.erc20Token).balanceOf(msg.sender); require(tokenBalance >= voucher.erc20TokenAmount, "AssetContractShared#redeem: INSUFFICIENT_FUNDS"); uint256 allowance = ERC20(voucher.erc20Token).allowance(msg.sender, address(this)); require(allowance >= voucher.erc20TokenAmount, "AssetContractShared#redeem: INSUFFICIENT_ALLOWANCE"); (bool success, bytes memory result) = payable(address(voucher.erc20Token)).call(abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, voucher.receiver, voucher.erc20TokenAmount)); if (!success) { if (result.length > 0) { assembly { let result_size := mload(result) revert(add(32, result), result_size) } } else { revert("ERC20: TRANSFER_FAILED"); } } _mint(msg.sender, voucher.tokenId, 1, bytes(voucher.uri)); return voucher.tokenId; } function verifyRedeem( address signer, NFTVoucher calldata voucher, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "AssetContractShared#verifyRedeem: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashNFTVoucher(voucher)), sigV, sigR, sigS ); } function hashNFTVoucher(NFTVoucher calldata voucher) internal pure returns (bytes32) { return keccak256( abi.encode( NFT_VOUCHER_TYPEHASH, voucher.tokenId, keccak256(bytes(voucher.uri)), voucher.erc20Token, voucher.erc20TokenAmount, voucher.receiver ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "./ERC1155Tradable.sol"; /** * @title AssetContract * AssetContract - A contract for easily creating non-fungible assets. */ contract AssetContract is ERC1155Tradable { event PermanentURI(string _value, uint256 indexed _id); uint256 constant TOKEN_SUPPLY_CAP = 1; string public templateURI; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURI; // Mapping for whether a token URI is set permanently mapping(uint256 => bool) private _isPermanentURI; modifier onlyTokenAmountOwned( address _from, uint256 _id, uint256 _quantity ) { require( _ownsTokenAmount(_from, _id, _quantity), "AssetContract#onlyTokenAmountOwned: ONLY_TOKEN_AMOUNT_OWNED_ALLOWED" ); _; } /** * @dev Require the URI to be impermanent */ modifier onlyImpermanentURI(uint256 id) { require( !isPermanentURI(id), "AssetContract#onlyImpermanentURI: URI_CANNOT_BE_CHANGED" ); _; } constructor( string memory _name, string memory _symbol, address _proxyRegistryAddress, string memory _templateURI ) ERC1155Tradable(_name, _symbol, _proxyRegistryAddress) { if (bytes(_templateURI).length > 0) { setTemplateURI(_templateURI); } } function storeVersion() public pure returns (string memory) { return "1.1.0"; } /** * @dev Require _from to own a specified quantity of the token */ function _ownsTokenAmount( address _from, uint256 _id, uint256 _quantity ) internal view returns (bool) { return balanceOf(_from, _id) >= _quantity; } /** * Compat for factory interfaces on OpenSea * Indicates that this contract can return balances for * tokens that haven't been minted yet */ function supportsFactoryInterface() public pure returns (bool) { return true; } function setTemplateURI(string memory _uri) public onlyOwnerOrProxy { templateURI = _uri; } function setURI(uint256 _id, string memory _uri) public virtual onlyOwnerOrManager onlyImpermanentURI(_id) { _setURI(_id, _uri); } function setPermanentURI(uint256 _id, string memory _uri) public virtual onlyOwnerOrManager onlyImpermanentURI(_id) { _setPermanentURI(_id, _uri); } function isPermanentURI(uint256 _id) public view returns (bool) { return _isPermanentURI[_id]; } function uri(uint256 _id) public view override returns (string memory) { string memory tokenUri = _tokenURI[_id]; if (bytes(tokenUri).length != 0) { return tokenUri; } return templateURI; } function balanceOf(address _owner, uint256 _id) public view virtual override returns (uint256) { uint256 balance = super.balanceOf(_owner, _id); return _isCreatorOrProxy(_id, _owner) ? balance + _remainingSupply(_id) : balance; } function safeTransferFrom( address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data ) public override { uint256 mintedBalance = super.balanceOf(_from, _id); if (mintedBalance < _amount) { // Only mint what _from doesn't already have mint(_to, _id, _amount - mintedBalance, _data); if (mintedBalance > 0) { super.safeTransferFrom(_from, _to, _id, mintedBalance, _data); } } else { super.safeTransferFrom(_from, _to, _id, _amount, _data); } } function safeBatchTransferFrom( address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data ) public override { require( _ids.length == _amounts.length, "AssetContract#safeBatchTransferFrom: INVALID_ARRAYS_LENGTH" ); for (uint256 i = 0; i < _ids.length; i++) { safeTransferFrom(_from, _to, _ids[i], _amounts[i], _data); } } function _beforeMint(uint256 _id, uint256 _quantity) internal view override { require( _quantity <= _remainingSupply(_id), "AssetContract#_beforeMint: QUANTITY_EXCEEDS_TOKEN_SUPPLY_CAP" ); } // Overrides ERC1155Tradable burn to check for quantity owned function burn( address _from, uint256 _id, uint256 _quantity ) public override onlyTokenAmountOwned(_from, _id, _quantity) { super.burn(_from, _id, _quantity); } // Overrides ERC1155Tradable batchBurn to check for quantity owned function batchBurn( address _from, uint256[] memory _ids, uint256[] memory _quantities ) public override { for (uint256 i = 0; i < _ids.length; i++) { require( _ownsTokenAmount(_from, _ids[i], _quantities[i]), "AssetContract#batchBurn: ONLY_TOKEN_AMOUNT_OWNED_ALLOWED" ); } super.batchBurn(_from, _ids, _quantities); } function _mint( address _to, uint256 _id, uint256 _quantity, bytes memory _data ) internal override { super._mint(_to, _id, _quantity, _data); if (_data.length > 1) { _setURI(_id, string(_data)); } } function _isCreatorOrProxy(uint256, address _address) internal view virtual returns (bool) { return _isOwnerOrProxy(_address); } function _remainingSupply(uint256 _id) internal view virtual returns (uint256) { return TOKEN_SUPPLY_CAP - totalSupply(_id); } // Override ERC1155Tradable for birth events function _origin( uint256 /* _id */ ) internal view virtual override returns (address) { return owner(); } function _batchMint( address _to, uint256[] memory _ids, uint256[] memory _quantities, bytes memory _data ) internal virtual override { super._batchMint(_to, _ids, _quantities, _data); if (_data.length > 1) { for (uint256 i = 0; i < _ids.length; i++) { _setURI(_ids[i], string(_data)); } } } function _setURI(uint256 _id, string memory _uri) internal { _tokenURI[_id] = _uri; emit URI(_uri, _id); } function _setPermanentURI(uint256 _id, string memory _uri) internal virtual { require( bytes(_uri).length > 0, "AssetContract#setPermanentURI: ONLY_VALID_URI" ); _isPermanentURI[_id] = true; _setURI(_id, _uri); emit PermanentURI(_uri, _id); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "./Initializable.sol"; contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string public constant ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contracts that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712(string memory name) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "./ContextMixin.sol"; import "./ERC1155.sol"; import "./NativeMetaTransaction.sol"; import "./Ownable.sol"; import "./Pausable.sol"; contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } /** * @title ERC1155Tradable * ERC1155Tradable - ERC1155 contract that whitelists an operator address, has create and mint functionality, and supports useful standards from OpenZeppelin, like exists(), name(), symbol(), and totalSupply() */ contract ERC1155Tradable is ContextMixin, ERC1155, NativeMetaTransaction, Ownable, Pausable { using Address for address; // Proxy registry address address public proxyRegistryAddress; // Contract name string public name; // Contract symbol string public symbol; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private balances; mapping(uint256 => uint256) private _supply; mapping(address => bool) public managerAddresses; mapping(address => bool) public minterAddresses; constructor( string memory _name, string memory _symbol, address _proxyRegistryAddress ) ERC1155("") { name = _name; symbol = _symbol; proxyRegistryAddress = _proxyRegistryAddress; _initializeEIP712(name); } /** * @dev Throws if called by any account other than the owner or their proxy */ modifier onlyOwnerOrProxy() { require( _isOwnerOrProxy(_msgSender()), "ERC1155Tradable#onlyOwner: CALLER_IS_NOT_OWNER" ); _; } /** * @dev Throws if called by any account other than the owner or manager */ modifier onlyOwnerOrManager() { require( (owner() == _msgSender() || managerAddresses[_msgSender()]), "AssetContractShared#onlyOwnerOrManager: CALLER_IS_NOT_MANAGER" ); _; } /** * @dev Throws if called by any account other than the owner or minter */ modifier onlyOwnerOrMinter() { require( (owner() == _msgSender() || minterAddresses[_msgSender()]), "AssetContractShared#onlyOwnerOrMinter: CALLER_IS_NOT_MINTER" ); _; } /** * @dev Throws if called by any account other than _from or their proxy */ modifier onlyApproved(address _from) { require( _from == _msgSender() || isApprovedForAll(_from, _msgSender()), "ERC1155Tradable#onlyApproved: CALLER_NOT_ALLOWED" ); _; } function _isOwnerOrProxy(address _address) internal view returns (bool) { return owner() == _address || _isProxyForUser(owner(), _address); } /** * @dev Allows owner to add a manager address */ function addManagerAddress(address _address) public onlyOwnerOrManager { managerAddresses[_address] = true; } /** * @dev Allows owner to add a minter address */ function addMinterAddress(address _address) public onlyOwnerOrMinter { minterAddresses[_address] = true; } /** * @dev Allows owner to remove a manager address */ function removeManagerAddress(address _address) public onlyOwnerOrManager { delete managerAddresses[_address]; } /** * @dev Allows owner to remove a minter address */ function removeMinterAddress(address _address) public onlyOwnerOrMinter { delete minterAddresses[_address]; } function pause() external onlyOwnerOrManager { _pause(); } function unpause() external onlyOwnerOrManager { _unpause(); } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require( account != address(0), "ERC1155: balance query for the zero address" ); return balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev Returns the total quantity for a token ID * @param _id uint256 ID of the token to query * @return amount of token in existence */ function totalSupply(uint256 _id) public view returns (uint256) { return _supply[_id]; } /** * Override isApprovedForAll to whitelist user's exchange proxy accounts to enable gas-free listings. */ function isApprovedForAll(address _owner, address _operator) public view override returns (bool isOperator) { // Whitelist exchange proxy contracts for easy trading. if (_isProxyForUser(_owner, _operator)) { return true; } return super.isApprovedForAll(_owner, _operator); } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override whenNotPaused onlyApproved(from) { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, from, to, asSingletonArray(id), asSingletonArray(amount), data ); uint256 fromBalance = balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); balances[id][from] = fromBalance - amount; balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override whenNotPaused onlyApproved(from) { require( ids.length == amounts.length, "ERC1155: IDS_AMOUNTS_LENGTH_MISMATCH" ); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); balances[id][from] = fromBalance - amount; balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Hook to be called right before minting * @param _id Token ID to mint * @param _quantity Amount of tokens to mint */ function _beforeMint(uint256 _id, uint256 _quantity) internal virtual {} /** * @dev Mints some amount of tokens to an address * @param _to Address of the future owner of the token * @param _id Token ID to mint * @param _quantity Amount of tokens to mint * @param _data Data to pass if receiver is contract */ function mint( address _to, uint256 _id, uint256 _quantity, bytes memory _data ) public virtual onlyOwnerOrManager { _mint(_to, _id, _quantity, _data); } /** * @dev Mint tokens for each id in _ids * @param _to The address to mint tokens to * @param _ids Array of ids to mint * @param _quantities Array of amounts of tokens to mint per id * @param _data Data to pass if receiver is contract */ function batchMint( address _to, uint256[] memory _ids, uint256[] memory _quantities, bytes memory _data ) public virtual onlyOwnerOrManager { _batchMint(_to, _ids, _quantities, _data); } /** * @dev Burns amount of a given token id * @param _from The address to burn tokens from * @param _id Token ID to burn * @param _quantity Amount to burn */ function burn( address _from, uint256 _id, uint256 _quantity ) public virtual onlyApproved(_from) { _burn(_from, _id, _quantity); } /** * @dev Burns tokens for each id in _ids * @param _from The address to burn tokens from * @param _ids Array of token ids to burn * @param _quantities Array of the amount to be burned */ function batchBurn( address _from, uint256[] memory _ids, uint256[] memory _quantities ) public virtual onlyApproved(_from) { _burnBatch(_from, _ids, _quantities); } /** * @dev Returns whether the specified token is minted * @param _id uint256 ID of the token to query the existence of * @return bool whether the token exists */ function exists(uint256 _id) public view returns (bool) { return _supply[_id] > 0; } // Overrides ERC1155 _mint to allow changing birth events to creator transfers, // and to set _supply function _mint( address _to, uint256 _id, uint256 _amount, bytes memory _data ) internal virtual override whenNotPaused { address operator = _msgSender(); _beforeTokenTransfer( operator, address(0), _to, asSingletonArray(_id), asSingletonArray(_amount), _data ); _beforeMint(_id, _amount); // Add _amount balances[_id][_to] += _amount; _supply[_id] += _amount; // Origin of token will be the _from parameter address origin = _origin(_id); // Emit event emit TransferSingle(operator, origin, _to, _id, _amount); // Calling onReceive method if recipient is contract doSafeTransferAcceptanceCheck( operator, origin, _to, _id, _amount, _data ); } // Overrides ERC1155MintBurn to change the batch birth events to creator transfers, and to set _supply function _batchMint( address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data ) internal virtual whenNotPaused { require( _ids.length == _amounts.length, "ERC1155Tradable#batchMint: INVALID_ARRAYS_LENGTH" ); // Number of mints to execute uint256 nMint = _ids.length; // Origin of tokens will be the _from parameter address origin = _origin(_ids[0]); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), _to, _ids, _amounts, _data); // Executing all minting for (uint256 i = 0; i < nMint; i++) { // Update storage balance uint256 id = _ids[i]; uint256 amount = _amounts[i]; _beforeMint(id, amount); require( _origin(id) == origin, "ERC1155Tradable#batchMint: MULTIPLE_ORIGINS_NOT_ALLOWED" ); balances[id][_to] += amount; _supply[id] += amount; } // Emit batch mint event emit TransferBatch(operator, origin, _to, _ids, _amounts); // Calling onReceive method if recipient is contract doSafeBatchTransferAcceptanceCheck( operator, origin, _to, _ids, _amounts, _data ); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal override whenNotPaused { require(account != address(0), "ERC1155#_burn: BURN_FROM_ZERO_ADDRESS"); require(amount > 0, "ERC1155#_burn: AMOUNT_LESS_THAN_ONE"); address operator = _msgSender(); _beforeTokenTransfer( operator, account, address(0), asSingletonArray(id), asSingletonArray(amount), "" ); uint256 accountBalance = balances[id][account]; require( accountBalance >= amount, "ERC1155#_burn: AMOUNT_EXCEEDS_BALANCE" ); balances[id][account] = accountBalance - amount; _supply[id] -= amount; emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal override whenNotPaused { require(account != address(0), "ERC1155: BURN_FROM_ZERO_ADDRESS"); require( ids.length == amounts.length, "ERC1155: IDS_AMOUNTS_LENGTH_MISMATCH" ); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = balances[id][account]; require( accountBalance >= amount, "ERC1155#_burnBatch: AMOUNT_EXCEEDS_BALANCE" ); balances[id][account] = accountBalance - amount; _supply[id] -= amount; } emit TransferBatch(operator, account, address(0), ids, amounts); } // Override this to change birth events' _from address function _origin( uint256 /* _id */ ) internal view virtual returns (address) { return address(0); } // PROXY HELPER METHODS function _isProxyForUser(address _user, address _address) internal view virtual returns (bool) { if (!proxyRegistryAddress.isContract()) { return false; } ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); return address(proxyRegistry.proxies(_user)) == _address; } // Copied from OpenZeppelin // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/c3ae4790c71b7f53cc8fff743536dcb7031fed74/contracts/token/ERC1155/ERC1155.sol#L394 function doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if ( response != IERC1155Receiver(to).onERC1155Received.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } // Copied from OpenZeppelin // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/c3ae4790c71b7f53cc8fff743536dcb7031fed74/contracts/token/ERC1155/ERC1155.sol#L417 function doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155Receiver(to).onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } // Copied from OpenZeppelin // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/c3ae4790c71b7f53cc8fff743536dcb7031fed74/contracts/token/ERC1155/ERC1155.sol#L440 function asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } /** * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by Exchange. */ function _msgSender() internal view override returns (address sender) { return ContextMixin.msgSender(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @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)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @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)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "./EIP712Base.sol"; contract NativeMetaTransaction is EIP712Base { bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) external payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] += 1; emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; /* DESIGN NOTES: Token ids are a concatenation of: * creator: hex address of the creator of the token. 160 bits * index: Index for this token (the regular ID), up to 2^56 - 1. 56 bits * supply: Supply cap for this token, up to 2^40 - 1 (1 trillion). 40 bits */ /** * @title TokenIdentifiers * support for authentication and metadata for token ids */ library TokenIdentifiers { uint8 constant ADDRESS_BITS = 160; uint8 constant INDEX_BITS = 56; uint8 constant SUPPLY_BITS = 40; uint256 constant SUPPLY_MASK = (uint256(1) << SUPPLY_BITS) - 1; uint256 constant INDEX_MASK = ((uint256(1) << INDEX_BITS) - 1) ^ SUPPLY_MASK; function tokenMaxSupply(uint256 _id) internal pure returns (uint256) { return _id & SUPPLY_MASK; } function tokenIndex(uint256 _id) internal pure returns (uint256) { return _id & INDEX_MASK; } function tokenCreator(uint256 _id) internal pure returns (address) { return address(uint160(_id >> (INDEX_BITS + SUPPLY_BITS))); } }
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"_templateURI","type":"string"},{"internalType":"address","name":"_migrationAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":true,"internalType":"address","name":"_creator","type":"address"}],"name":"CreatorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addManagerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addMinterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addSharedProxyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_quantities","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_quantities","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","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":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isPermanentURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"managerAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"internalType":"struct AssetContractShared.Ownership[]","name":"_ownerships","type":"tuple[]"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationTarget","outputs":[{"internalType":"contract AssetContractShared","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minterAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"address","name":"erc20Token","type":"address"},{"internalType":"uint256","name":"erc20TokenAmount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct AssetContractShared.NFTVoucher","name":"voucher","type":"tuple"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeManagerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeMinterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeSharedProxyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","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":"_amount","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":"_id","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"setCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setPermanentURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setProxyRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setTemplateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sharedProxyAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"storeVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"supportsFactoryInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"templateURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526003805460ff191690553480156200001b57600080fd5b5060405162005985380380620059858339810160408190526200003e9162000725565b84848484838383604051806020016040528060008152506200006681620001ba60201b60201c565b506200007b62000075620001d3565b620001ef565b6006805460ff60a01b1916905582516200009d906008906020860190620005ad565b508151620000b3906009906020850190620005ad565b50600780546001600160a01b0319166001600160a01b038316179055600880546200016f9190620000e490620007df565b80601f01602080910402602001604051908101604052809291908181526020018280546200011290620007df565b8015620001635780601f10620001375761010080835404028352916020019162000163565b820191906000526020600020905b8154815290600101906020018083116200014557829003601f168201915b50506200024192505050565b5050815115905062000186576200018681620002a6565b505060016011555050601280546001600160a01b0319166001600160a01b0392909216919091179055506200084b92505050565b8051620001cf906002906020840190620005ad565b5050565b6000620001ea6200033460201b620026e01760201c565b905090565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60035460ff16156200028b5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b60448201526064015b60405180910390fd5b620002968162000393565b506003805460ff19166001179055565b620002ba620002b4620001d3565b62000435565b6200031f5760405162461bcd60e51b815260206004820152602e60248201527f455243313135355472616461626c65236f6e6c794f776e65723a2043414c4c4560448201526d292fa4a9afa727aa2fa7aba722a960911b606482015260840162000282565b8051620001cf90600e906020840190620005ad565b6000333014156200038d57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620003909050565b50335b90565b6040518060800160405280604f815260200162005936604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600455565b60006001600160a01b038216620004546006546001600160a01b031690565b6001600160a01b03161480620004835750620004836200047c6006546001600160a01b031690565b8362000489565b92915050565b6001600160a01b03811660009081526013602052604081205460ff1615620004b45750600162000483565b620004cb8383620004d260201b6200273d1760201c565b9392505050565b600754600090620004f8906001600160a01b03166200059e602090811b620027ed17901c565b620005065750600062000483565b60075460405163c455279160e01b81526001600160a01b03858116600483015291821691841690829063c45527919060240160206040518083038186803b1580156200055157600080fd5b505afa15801562000566573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200058c919062000706565b6001600160a01b031614949350505050565b6001600160a01b03163b151590565b828054620005bb90620007df565b90600052602060002090601f016020900481019282620005df57600085556200062a565b82601f10620005fa57805160ff19168380011785556200062a565b828001600101855582156200062a579182015b828111156200062a5782518255916020019190600101906200060d565b50620006389291506200063c565b5090565b5b808211156200063857600081556001016200063d565b600082601f83011262000664578081fd5b81516001600160401b03808211156200068157620006816200081c565b604051601f8301601f19908116603f01168101908282118183101715620006ac57620006ac6200081c565b81604052838152602092508683858801011115620006c8578485fd5b8491505b83821015620006eb5785820183015181830184015290820190620006cc565b83821115620006fc57848385830101525b9695505050505050565b60006020828403121562000718578081fd5b8151620004cb8162000832565b600080600080600060a086880312156200073d578081fd5b85516001600160401b038082111562000754578283fd5b6200076289838a0162000653565b9650602088015191508082111562000778578283fd5b6200078689838a0162000653565b9550604088015191506200079a8262000832565b606088015191945080821115620007af578283fd5b50620007be8882890162000653565b9250506080860151620007d18162000832565b809150509295509295909350565b600181811c90821680620007f457607f821691505b602082108114156200081657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200084857600080fd5b50565b6150db806200085b6000396000f3fe6080604052600436106102fe5760003560e01c8063731133e911610190578063b48ab8b6116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610964578063f5298aca14610984578063f6eb127a146109a4578063f923e8c3146109c457600080fd5b8063e985e9c514610904578063e9cf98ae14610924578063f242432a1461094457600080fd5b8063b48ab8b614610835578063bd85b03914610855578063c112222914610882578063c311c523146108b0578063cd7c0326146108c4578063d26ea6c0146108e457600080fd5b80638da5cb5b116101495780639e037eea116101235780639e037eea146107b5578063a02fb1ff146107d5578063a22cb465146107f5578063a50aa5c31461081557600080fd5b80638da5cb5b1461076257806391686f531461078057806395d89b41146107a057600080fd5b8063731133e91461069d57806373505d35146106bd57806383ca5a05146106ed5780638456cb591461070d578063862440e214610722578063869f75941461074257600080fd5b80632d0335ab1161024f5780634d647ade11610208578063510b5158116101e2578063510b5158146106115780635b51acff146106495780635c975abb14610669578063715018a61461068857600080fd5b80634d647ade146105855780634e1273f4146105b55780634f558e79146105e257600080fd5b80632d0335ab146104c75780632eb2c2d6146104fd5780632f1c982c1461051d5780633408e4701461053d5780633588ad7c146105505780633f4ba83a1461057057600080fd5b80630f7e5970116102bc578063201c9ac011610296578063201c9ac01461044f57806320379ee514610462578063232ee7601461047757806324d88785146104a757600080fd5b80630f7e5970146103d2578063129009b8146103ff5780631e7d9dbb1461041f57600080fd5b8062fdd58e1461030357806301ffc9a71461033657806306fdde03146103665780630bb2465a146103885780630c53c51c1461039f5780630e89341c146103b2575b600080fd5b34801561030f57600080fd5b5061032361031e3660046144ab565b6109d9565b6040519081526020015b60405180910390f35b34801561034257600080fd5b506103566103513660046146f4565b610a19565b604051901515815260200161032d565b34801561037257600080fd5b5061037b610a69565b60405161032d9190614a52565b34801561039457600080fd5b5061039d610af7565b005b61037b6103ad3660046143d1565b610b8b565b3480156103be57600080fd5b5061037b6103cd3660046147f7565b610d63565b3480156103de57600080fd5b5061037b604051806040016040528060018152602001603160f81b81525081565b34801561040b57600080fd5b5061039d61041a366004614135565b610ea3565b34801561042b57600080fd5b5061035661043a3660046147f7565b60009081526010602052604090205460ff1690565b61032361045d366004614442565b610f40565b34801561046e57600080fd5b50600454610323565b34801561048357600080fd5b50610356610492366004614135565b600d6020526000908152604090205460ff1681565b3480156104b357600080fd5b5061039d6104c2366004614748565b611410565b3480156104d357600080fd5b506103236104e2366004614135565b6001600160a01b031660009081526005602052604090205490565b34801561050957600080fd5b5061039d610518366004614189565b611453565b34801561052957600080fd5b5061039d61053836600461462a565b61154b565b34801561054957600080fd5b5046610323565b34801561055c57600080fd5b5061039d61056b36600461484b565b611975565b34801561057c57600080fd5b5061039d611a1c565b34801561059157600080fd5b506103566105a0366004614135565b600c6020526000908152604090205460ff1681565b3480156105c157600080fd5b506105d56105d036600461455e565b611a9f565b60405161032d9190614a1a565b3480156105ee57600080fd5b506103566105fd3660046147f7565b6000908152600b6020526040902054151590565b34801561061d57600080fd5b5061063161062c3660046147f7565b611c00565b6040516001600160a01b03909116815260200161032d565b34801561065557600080fd5b50601254610631906001600160a01b031681565b34801561067557600080fd5b50600654600160a01b900460ff16610356565b34801561069457600080fd5b5061039d611c47565b3480156106a957600080fd5b5061039d6106b836600461450a565b611cca565b3480156106c957600080fd5b506103566106d8366004614135565b60136020526000908152604090205460ff1681565b3480156106f957600080fd5b5061039d610708366004614135565b611dbe565b34801561071957600080fd5b5061039d611e5b565b34801561072e57600080fd5b5061039d61073d36600461484b565b611edc565b34801561074e57600080fd5b5061032361075d3660046147f7565b611f68565b34801561076e57600080fd5b506006546001600160a01b0316610631565b34801561078c57600080fd5b5061039d61079b366004614827565b611f73565b3480156107ac57600080fd5b5061037b612065565b3480156107c157600080fd5b5061039d6107d0366004614135565b612072565b3480156107e157600080fd5b5061039d6107f0366004614135565b6120ba565b34801561080157600080fd5b5061039d6108103660046143a0565b612154565b34801561082157600080fd5b5061039d610830366004614135565b612166565b34801561084157600080fd5b5061039d61085036600461430a565b6121b1565b34801561086157600080fd5b506103236108703660046147f7565b6000908152600b602052604090205490565b34801561088e57600080fd5b506040805180820190915260058152640312e312e360dc1b602082015261037b565b3480156108bc57600080fd5b506001610356565b3480156108d057600080fd5b50600754610631906001600160a01b031681565b3480156108f057600080fd5b5061039d6108ff366004614135565b6122db565b34801561091057600080fd5b5061035661091f366004614151565b612324565b34801561093057600080fd5b5061039d61093f366004614135565b61236e565b34801561095057600080fd5b5061039d61095f366004614232565b612408565b34801561097057600080fd5b5061039d61097f366004614135565b612458565b34801561099057600080fd5b5061039d61099f3660046144d6565b612542565b3480156109b057600080fd5b5061039d6109bf366004614298565b6125d9565b3480156109d057600080fd5b5061037b6126d3565b6000806109e684846127fc565b90506109f28385612890565b6109fc5780610a0f565b610a05836128c3565b610a0f9082614de1565b9150505b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610a4a57506001600160e01b031982166303a24d0760e21b145b80610a1357506301ffc9a760e01b6001600160e01b0319831614610a13565b60088054610a7690614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa290614e61565b8015610aef5780601f10610ac457610100808354040283529160200191610aef565b820191906000526020600020905b815481529060010190602001808311610ad257829003601f168201915b505050505081565b610aff6128e5565b6001600160a01b0316610b1a6006546001600160a01b031690565b6001600160a01b03161480610b545750600c6000610b366128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b610b795760405162461bcd60e51b8152600401610b7090614b0a565b60405180910390fd5b601280546001600160a01b0319169055565b60408051606081810183526001600160a01b03881660008181526005602090815290859020548452830152918101869052610bc987828787876128f4565b610c1f5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b70565b6001600160a01b0387166000908152600560205260408120805460019290610c48908490614de1565b90915550506040517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c8190899033908a9061494e565b60405180910390a1600080306001600160a01b0316888a604051602001610ca9929190614917565b60408051601f1981840301815290829052610cc3916148fb565b6000604051808303816000865af19150503d8060008114610d00576040519150601f19603f3d011682016040523d82523d6000602084013e610d05565b606091505b509150915081610d575760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b70565b98975050505050505050565b6000818152600f6020526040812080546060929190610d8190614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610dad90614e61565b8015610dfa5780601f10610dcf57610100808354040283529160200191610dfa565b820191906000526020600020905b815481529060010190602001808311610ddd57829003601f168201915b505050505090508051600014610e105792915050565b600e8054610e1d90614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4990614e61565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b5050505050915050919050565b610eab6128e5565b6001600160a01b0316610ec66006546001600160a01b031690565b6001600160a01b03161480610f005750600c6000610ee26128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b610f1c5760405162461bcd60e51b8152600401610b7090614b0a565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000610f4f86868686866129e4565b610fb15760405162461bcd60e51b815260206004820152602d60248201527f4173736574436f6e74726163745368617265642372656465656d3a20494e564160448201526c4c49445f5349474e415455524560981b6064820152608401610b70565b610fbc853587612a63565b6110215760405162461bcd60e51b815260206004820152603060248201527f4173736574436f6e74726163745368617265642372656465656d3a204f4e4c5960448201526f17d0d491505513d497d0531313d5d15160821b6064820152608401610b70565b84356000908152600b6020526040902054156110925760405162461bcd60e51b815260206004820152602a60248201527f4173736574436f6e74726163745368617265642372656465656d3a20544f4b456044820152691397d49151115153515160b21b6064820152608401610b70565b60006110a46060870160408801614135565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a082319060240160206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d919061480f565b9050856060013581101561118a5760405162461bcd60e51b815260206004820152602e60248201527f4173736574436f6e74726163745368617265642372656465656d3a20494e535560448201526d4646494349454e545f46554e445360901b6064820152608401610b70565b600061119c6060880160408901614135565b604051636eb1769f60e11b81523360048201523060248201526001600160a01b03919091169063dd62ed3e9060440160206040518083038186803b1580156111e357600080fd5b505afa1580156111f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121b919061480f565b9050866060013581101561128c5760405162461bcd60e51b815260206004820152603260248201527f4173736574436f6e74726163745368617265642372656465656d3a20494e53556044820152714646494349454e545f414c4c4f57414e434560701b6064820152608401610b70565b60008061129f60608a0160408b01614135565b6001600160a01b0316336112b960a08c0160808d01614135565b6040516001600160a01b0392831660248201529116604482015260608b0135606482015260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b1790525161131591906148fb565b6000604051808303816000865af19150503d8060008114611352576040519150601f19603f3d011682016040523d82523d6000602084013e611357565b606091505b5091509150816113b2578051156113715780518082602001fd5b60405162461bcd60e51b8152602060048201526016602482015275115490cc8c0e881514905394d1915497d1905253115160521b6044820152606401610b70565b611401338a3560016113c760208e018e614d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612aae92505050565b50509535979650505050505050565b61142061141b6128e5565b612ace565b61143c5760405162461bcd60e51b8152600401610b7090614c22565b805161144f90600e906020840190613fc0565b5050565b81518351146114ca5760405162461bcd60e51b815260206004820152603a60248201527f4173736574436f6e7472616374237361666542617463685472616e736665724660448201527f726f6d3a20494e56414c49445f4152524159535f4c454e4754480000000000006064820152608401610b70565b60005b83518110156115435761153186868684815181106114fb57634e487b7160e01b600052603260045260246000fd5b602002602001015186858151811061152357634e487b7160e01b600052603260045260246000fd5b602002602001015186612408565b8061153b81614eed565b9150506114cd565b505050505050565b6115536128e5565b6001600160a01b031661156e6006546001600160a01b031690565b6001600160a01b031614806115a85750600c600061158a6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b6115c45760405162461bcd60e51b8152600401610b7090614b0a565b6012546001600160a01b0316806116335760405162461bcd60e51b815260206004820152602d60248201527f4173736574436f6e7472616374536861726564236d6967726174653a204d494760448201526c1490551157d11254d050931151609a1b6064820152608401610b70565b6000816001600160a01b031663f923e8c36040518163ffffffff1660e01b815260040160006040518083038186803b15801561166e57600080fd5b505afa158015611682573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116aa919081019061477a565b905060005b835181101561196f5760008482815181106116da57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001519050600085838151811061170a57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151905060006001600160a01b0316816001600160a01b031614156117995760405162461bcd60e51b815260206004820152603560248201527f4173736574436f6e7472616374536861726564236d6967726174653a205a455260448201527413d7d05111149154d4d7d393d517d0531313d5d151605a1b6064820152608401610b70565b604051627eeac760e11b81526001600160a01b038281166004830152602482018490526000919087169062fdd58e9060440160206040518083038186803b1580156117e357600080fd5b505afa1580156117f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b919061480f565b90508061182a5750505061195f565b61184582848360405180602001604052806000815250612aae565b845160208601206040516303a24d0760e21b8152600481018590526001600160a01b03881690630e89341c9060240160006040518083038186803b15801561188c57600080fd5b505afa1580156118a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118c8919081019061477a565b805190602001201461195b576040516303a24d0760e21b81526004810184905261195b9084906001600160a01b03891690630e89341c9060240160006040518083038186803b15801561191a57600080fd5b505afa15801561192e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611956919081019061477a565b612b17565b5050505b61196881614eed565b90506116af565b50505050565b81611987816119826128e5565b612bdd565b6119a35760405162461bcd60e51b8152600401610b7090614cf7565b600083815260106020526040902054839060ff16156119d45760405162461bcd60e51b8152600401610b7090614aad565b836119ef6119e06128e5565b826119ea84612c28565b612c43565b611a0b5760405162461bcd60e51b8152600401610b7090614bb7565b611a158585612b17565b5050505050565b611a246128e5565b6001600160a01b0316611a3f6006546001600160a01b031690565b6001600160a01b03161480611a795750600c6000611a5b6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b611a955760405162461bcd60e51b8152600401610b7090614b0a565b611a9d612c5a565b565b60608151835114611b045760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b70565b600083516001600160401b03811115611b2d57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b56578160200160208202803683370190505b50905060005b8451811015611bf857611bbd858281518110611b8857634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110611bb057634e487b7160e01b600052603260045260246000fd5b60200260200101516109d9565b828281518110611bdd57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611bf181614eed565b9050611b5c565b509392505050565b6000818152601460205260408120546001600160a01b031615611c3957506000908152601460205260409020546001600160a01b031690565b610a1382612cfd565b919050565b611c4f6128e5565b6001600160a01b0316611c6a6006546001600160a01b031690565b6001600160a01b031614611cc05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b70565b611a9d6000612d17565b60026011541415611d1d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b70565b600260115582611d3481611d2f6128e5565b612a63565b611da65760405162461bcd60e51b815260206004820152603b60248201527f4173736574436f6e747261637453686172656423697343726561746f724f724d60448201527f696e7465723a204f4e4c595f43524541544f525f414c4c4f57454400000000006064820152608401610b70565b611db285858585612aae565b50506001601155505050565b611dc66128e5565b6001600160a01b0316611de16006546001600160a01b031690565b6001600160a01b03161480611e1b5750600d6000611dfd6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b611e375760405162461bcd60e51b8152600401610b7090614c9a565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b611e636128e5565b6001600160a01b0316611e7e6006546001600160a01b031690565b6001600160a01b03161480611eb85750600c6000611e9a6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b611ed45760405162461bcd60e51b8152600401610b7090614b0a565b611a9d612d69565b81611ee9816119826128e5565b611f055760405162461bcd60e51b8152600401610b7090614cf7565b600083815260106020526040902054839060ff1615611f365760405162461bcd60e51b8152600401610b7090614aad565b83611f426119e06128e5565b611f5e5760405162461bcd60e51b8152600401610b7090614bb7565b611a158585612dcf565b6000610a1382612c28565b81611f80816119826128e5565b611f9c5760405162461bcd60e51b8152600401610b7090614cf7565b6001600160a01b03821661200b5760405162461bcd60e51b815260206004820152603060248201527f4173736574436f6e74726163745368617265642373657443726561746f723a2060448201526f24a72b20a624a22fa0a2222922a9a99760811b6064820152608401610b70565b60008381526014602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051909185917f39071c63e44267bfdefc7b625c0df99d3ce2e6ff98d9f5e9e8a7ab43cdf5000d9190a3505050565b60098054610a7690614e61565b61207d61141b6128e5565b6120995760405162461bcd60e51b8152600401610b7090614c22565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6120c26128e5565b6001600160a01b03166120dd6006546001600160a01b031690565b6001600160a01b031614806121175750600c60006120f96128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b6121335760405162461bcd60e51b8152600401610b7090614b0a565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b61144f61215f6128e5565b8383612e1f565b61217161141b6128e5565b61218d5760405162461bcd60e51b8152600401610b7090614c22565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b600260115414156122045760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b70565b600260115560005b83518110156122c35761224884828151811061223857634e487b7160e01b600052603260045260246000fd5b6020026020010151611d2f6128e5565b6122b15760405162461bcd60e51b815260206004820152603460248201527f4173736574436f6e7472616374536861726564235f62617463684d696e743a2060448201527313d3931657d0d491505513d497d0531313d5d15160621b6064820152608401610b70565b806122bb81614eed565b91505061220c565b506122d084848484612f00565b505060016011555050565b6122e661141b6128e5565b6123025760405162461bcd60e51b8152600401610b7090614c22565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006123308383612f65565b1561233d57506001610a13565b6001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b6123766128e5565b6001600160a01b03166123916006546001600160a01b031690565b6001600160a01b031614806123cb5750600d60006123ad6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b6123e75760405162461bcd60e51b8152600401610b7090614c9a565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b600061241486856127fc565b90508281101561244b57612433858561242d8487614e1e565b85611cca565b8015612446576124468686868486612f98565b611543565b6115438686868686612f98565b6124606128e5565b6001600160a01b031661247b6006546001600160a01b031690565b6001600160a01b0316146124d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b70565b6001600160a01b0381166125365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b70565b61253f81612d17565b50565b828282612550838383612c43565b6125ce5760405162461bcd60e51b815260206004820152604360248201527f4173736574436f6e7472616374236f6e6c79546f6b656e416d6f756e744f776e60448201527f65643a204f4e4c595f544f4b454e5f414d4f554e545f4f574e45445f414c4c4f60648201526215d15160ea1b608482015260a401610b70565b6115438686866131cd565b60005b82518110156126c25761263e8484838151811061260957634e487b7160e01b600052603260045260246000fd5b602002602001015184848151811061263157634e487b7160e01b600052603260045260246000fd5b6020026020010151612c43565b6126b05760405162461bcd60e51b815260206004820152603860248201527f4173736574436f6e74726163742362617463684275726e3a204f4e4c595f544f60448201527f4b454e5f414d4f554e545f4f574e45445f414c4c4f57454400000000000000006064820152608401610b70565b806126ba81614eed565b9150506125dc565b506126ce838383613223565b505050565b600e8054610a7690614e61565b60003330141561273757600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b0316915061273a9050565b50335b90565b6007546000906001600160a01b03163b61275957506000610a13565b60075460405163c455279160e01b81526001600160a01b03858116600483015291821691841690829063c45527919060240160206040518083038186803b1580156127a357600080fd5b505afa1580156127b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127db919061472c565b6001600160a01b031614949350505050565b6001600160a01b03163b151590565b60006001600160a01b0383166128685760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b70565b506000908152600a602090815260408083206001600160a01b03949094168352929052205490565b60008061289c84611c00565b9050826001600160a01b0316816001600160a01b03161480610a0f5750610a0f8184612f65565b6000818152600b60205260408120546128db83611f68565b610a139190614e1e565b60006128ef6126e0565b905090565b60006001600160a01b03861661295a5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b70565b600161296d61296887613279565b6132f6565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156129bb573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006001600160a01b038616612a555760405162461bcd60e51b815260206004820152603060248201527f4173736574436f6e74726163745368617265642376657269667952656465656d60448201526f1d1024a72b20a624a22fa9a4a3a722a960811b6064820152608401610b70565b600161296d61296887613326565b600080612a6f84611c00565b9050826001600160a01b0316816001600160a01b03161480610a0f575050506001600160a01b03166000908152600d602052604090205460ff16919050565b612aba848484846133d7565b60018151111561196f5761196f8382612dcf565b6000816001600160a01b0316612aec6006546001600160a01b031690565b6001600160a01b03161480610a135750610a13612b116006546001600160a01b031690565b83612f65565b6000815111612b7e5760405162461bcd60e51b815260206004820152602d60248201527f4173736574436f6e7472616374237365745065726d616e656e745552493a204f60448201526c4e4c595f56414c49445f55524960981b6064820152608401610b70565b6000828152601060205260409020805460ff19166001179055612ba18282612dcf565b817fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b5565720782604051612bd19190614a52565b60405180910390a25050565b600080612be984611c00565b9050826001600160a01b0316816001600160a01b03161480610a0f575050506001600160a01b03166000908152600c602052604090205460ff16919050565b6000612c3b600165010000000000614e1e565b909116919050565b600081612c5085856109d9565b1015949350505050565b600654600160a01b900460ff16612caa5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b70565b6006805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612ce06128e5565b6040516001600160a01b03909116815260200160405180910390a1565b6000612d0b60286038614df9565b60ff169190911c919050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600654600160a01b900460ff1615612d935760405162461bcd60e51b8152600401610b7090614c70565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ce06128e5565b6000828152600f602090815260409091208251612dee92840190613fc0565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051612bd19190614a52565b816001600160a01b0316836001600160a01b03161415612e935760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b70565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612f0c84848484613506565b60018151111561196f5760005b8351811015611a1557612f53848281518110612f4557634e487b7160e01b600052603260045260246000fd5b602002602001015183612dcf565b80612f5d81614eed565b915050612f19565b6001600160a01b03811660009081526013602052604081205460ff1615612f8e57506001610a13565b612367838361273d565b600654600160a01b900460ff1615612fc25760405162461bcd60e51b8152600401610b7090614c70565b84612fcb6128e5565b6001600160a01b0316816001600160a01b03161480612ff15750612ff18161091f6128e5565b61300d5760405162461bcd60e51b8152600401610b7090614b67565b6001600160a01b0385166130715760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b70565b600061307b6128e5565b905061309581888861308c896137b5565b611a15896137b5565b6000858152600a602090815260408083206001600160a01b038b1684529091529020548481101561311b5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610b70565b6131258582614e1e565b6000878152600a602090815260408083206001600160a01b038d81168552925280832093909355891681529081208054879290613163908490614de1565b909155505060408051878152602081018790526001600160a01b03808a16928b821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46131c382898989898961380e565b5050505050505050565b826131d66128e5565b6001600160a01b0316816001600160a01b031614806131fc57506131fc8161091f6128e5565b6132185760405162461bcd60e51b8152600401610b7090614b67565b61196f848484613979565b8261322c6128e5565b6001600160a01b0316816001600160a01b0316148061325257506132528161091f6128e5565b61326e5760405162461bcd60e51b8152600401610b7090614b67565b61196f848484613bc1565b600060405180608001604052806043815260200161500060439139805160209182012083518483015160408087015180519086012090516132d9950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061330160045490565b60405161190160f01b60208201526022810191909152604281018390526062016132d9565b60006040518060a00160405280606381526020016150436063913980516020918201209083359061335990850185614d4c565b6040516133679291906148eb565b60405180910390208460400160208101906133829190614135565b606086013561339760a0880160808901614135565b60408051602081019790975286019490945260608501929092526001600160a01b03908116608085015260a08401919091521660c082015260e0016132d9565b600654600160a01b900460ff16156134015760405162461bcd60e51b8152600401610b7090614c70565b600061340b6128e5565b90506134268160008761341d886137b5565b611a15886137b5565b6134308484613e6d565b6000848152600a602090815260408083206001600160a01b038916845290915281208054859290613462908490614de1565b90915550506000848152600b602052604081208054859290613485908490614de1565b909155506000905061349685613eeb565b9050856001600160a01b0316816001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516134f0929190918252602082015260400190565b60405180910390a461154382828888888861380e565b600654600160a01b900460ff16156135305760405162461bcd60e51b8152600401610b7090614c70565b815183511461359a5760405162461bcd60e51b815260206004820152603060248201527f455243313135355472616461626c652362617463684d696e743a20494e56414c60448201526f09288be82a4a482b2a6be988a9c8ea8960831b6064820152608401610b70565b825160006135cb8582846135be57634e487b7160e01b600052603260045260246000fd5b6020026020010151613eeb565b905060006135d76128e5565b905060005b8381101561374657600087828151811061360657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600087838151811061363257634e487b7160e01b600052603260045260246000fd5b602002602001015190506136468282613e6d565b846001600160a01b031661365983613eeb565b6001600160a01b0316146136d55760405162461bcd60e51b815260206004820152603760248201527f455243313135355472616461626c652362617463684d696e743a204d554c544960448201527f504c455f4f524947494e535f4e4f545f414c4c4f5745440000000000000000006064820152608401610b70565b6000828152600a602090815260408083206001600160a01b038e16845290915281208054839290613707908490614de1565b90915550506000828152600b60205260408120805483929061372a908490614de1565b925050819055505050808061373e90614eed565b9150506135dc565b50866001600160a01b0316826001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051613796929190614a2d565b60405180910390a46137ac818389898989613ef6565b50505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106137fd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156115435760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061385290899089908890889088906004016149d5565b602060405180830381600087803b15801561386c57600080fd5b505af192505050801561389c575060408051601f3d908101601f1916820190925261389991810190614710565b60015b613949576138a8614f34565b806308c379a014156138e257506138bd614f4b565b806138c857506138e4565b8060405162461bcd60e51b8152600401610b709190614a52565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b70565b6001600160e01b0319811663f23a6e6160e01b146137ac5760405162461bcd60e51b8152600401610b7090614a65565b600654600160a01b900460ff16156139a35760405162461bcd60e51b8152600401610b7090614c70565b6001600160a01b038316613a075760405162461bcd60e51b815260206004820152602560248201527f45524331313535235f6275726e3a204255524e5f46524f4d5f5a45524f5f4144604482015264445245535360d81b6064820152608401610b70565b60008111613a635760405162461bcd60e51b815260206004820152602360248201527f45524331313535235f6275726e3a20414d4f554e545f4c4553535f5448414e5f6044820152624f4e4560e81b6064820152608401610b70565b6000613a6d6128e5565b9050613a9e81856000613a7f876137b5565b613a88876137b5565b5050604080516020810190915260009052505050565b6000838152600a602090815260408083206001600160a01b038816845290915290205482811015613b1f5760405162461bcd60e51b815260206004820152602560248201527f45524331313535235f6275726e3a20414d4f554e545f455843454544535f42416044820152644c414e434560d81b6064820152608401610b70565b613b298382614e1e565b6000858152600a602090815260408083206001600160a01b038a168452825280832093909355868252600b90529081208054859290613b69908490614e1e565b909155505060408051858152602081018590526000916001600160a01b0388811692908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600654600160a01b900460ff1615613beb5760405162461bcd60e51b8152600401610b7090614c70565b6001600160a01b038316613c415760405162461bcd60e51b815260206004820152601f60248201527f455243313135353a204255524e5f46524f4d5f5a45524f5f41444452455353006044820152606401610b70565b8051825114613c9e5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a204944535f414d4f554e54535f4c454e4754485f4d49534d604482015263082a886960e31b6064820152608401610b70565b6000613ca86128e5565b604080516020810190915260009052905060005b8351811015613e0e576000848281518110613ce757634e487b7160e01b600052603260045260246000fd5b602002602001015190506000848381518110613d1357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516000848152600a835260408082206001600160a01b038c168352909352919091205490915081811015613da75760405162461bcd60e51b815260206004820152602a60248201527f45524331313535235f6275726e42617463683a20414d4f554e545f455843454560448201526944535f42414c414e434560b01b6064820152608401610b70565b613db18282614e1e565b6000848152600a602090815260408083206001600160a01b038d168452825280832093909355858252600b90529081208054849290613df1908490614e1e565b925050819055505050508080613e0690614eed565b915050613cbc565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613e5f929190614a2d565b60405180910390a450505050565b613e76826128c3565b81111561144f5760405162461bcd60e51b815260206004820152603c60248201527f4173736574436f6e7472616374235f6265666f72654d696e743a205155414e5460448201527f4954595f455843454544535f544f4b454e5f535550504c595f434150000000006064820152608401610b70565b6000610a1382612cfd565b6001600160a01b0384163b156115435760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613f3a9089908990889088908890600401614983565b602060405180830381600087803b158015613f5457600080fd5b505af1925050508015613f84575060408051601f3d908101601f19168201909252613f8191810190614710565b60015b613f90576138a8614f34565b6001600160e01b0319811663bc197c8160e01b146137ac5760405162461bcd60e51b8152600401610b7090614a65565b828054613fcc90614e61565b90600052602060002090601f016020900481019282613fee5760008555614034565b82601f1061400757805160ff1916838001178555614034565b82800160010185558215614034579182015b82811115614034578251825591602001919060010190614019565b50614040929150614044565b5090565b5b808211156140405760008155600101614045565b600082601f830112614069578081fd5b8135602061407682614d97565b6040516140838282614ec1565b8381528281019150858301600585901b870184018810156140a2578586fd5b855b858110156140c0578135845292840192908401906001016140a4565b5090979650505050505050565b600082601f8301126140dd578081fd5b81356140e881614dba565b6040516140f58282614ec1565b828152856020848701011115614109578384fd5b82602086016020830137918201602001929092529392505050565b803560ff81168114611c4257600080fd5b600060208284031215614146578081fd5b813561236781614fd4565b60008060408385031215614163578081fd5b823561416e81614fd4565b9150602083013561417e81614fd4565b809150509250929050565b600080600080600060a086880312156141a0578081fd5b85356141ab81614fd4565b945060208601356141bb81614fd4565b935060408601356001600160401b03808211156141d6578283fd5b6141e289838a01614059565b945060608801359150808211156141f7578283fd5b61420389838a01614059565b93506080880135915080821115614218578283fd5b50614225888289016140cd565b9150509295509295909350565b600080600080600060a08688031215614249578283fd5b853561425481614fd4565b9450602086013561426481614fd4565b9350604086013592506060860135915060808601356001600160401b0381111561428c578182fd5b614225888289016140cd565b6000806000606084860312156142ac578081fd5b83356142b781614fd4565b925060208401356001600160401b03808211156142d2578283fd5b6142de87838801614059565b935060408601359150808211156142f3578283fd5b5061430086828701614059565b9150509250925092565b6000806000806080858703121561431f578182fd5b843561432a81614fd4565b935060208501356001600160401b0380821115614345578384fd5b61435188838901614059565b94506040870135915080821115614366578384fd5b61437288838901614059565b93506060870135915080821115614387578283fd5b50614394878288016140cd565b91505092959194509250565b600080604083850312156143b2578182fd5b82356143bd81614fd4565b91506020830135801515811461417e578182fd5b600080600080600060a086880312156143e8578283fd5b85356143f381614fd4565b945060208601356001600160401b0381111561440d578384fd5b614419888289016140cd565b945050604086013592506060860135915061443660808701614124565b90509295509295909350565b600080600080600060a08688031215614459578283fd5b853561446481614fd4565b945060208601356001600160401b0381111561447e578384fd5b860160a0818903121561448f578384fd5b9350604086013592506060860135915061443660808701614124565b600080604083850312156144bd578182fd5b82356144c881614fd4565b946020939093013593505050565b6000806000606084860312156144ea578081fd5b83356144f581614fd4565b95602085013595506040909401359392505050565b6000806000806080858703121561451f578182fd5b843561452a81614fd4565b9350602085013592506040850135915060608501356001600160401b03811115614552578182fd5b614394878288016140cd565b60008060408385031215614570578182fd5b82356001600160401b0380821115614586578384fd5b818501915085601f830112614599578384fd5b813560206145a682614d97565b6040516145b38282614ec1565b8381528281019150858301600585901b870184018b10156145d2578889fd5b8896505b848710156145fd5780356145e981614fd4565b8352600196909601959183019183016145d6565b5096505086013592505080821115614613578283fd5b5061462085828601614059565b9150509250929050565b6000602080838503121561463c578182fd5b82356001600160401b03811115614651578283fd5b8301601f81018513614661578283fd5b803561466c81614d97565b6040805161467a8382614ec1565b8381528581019250848601600685901b860187018a1015614699578788fd5b8795505b848610156146e75782818b0312156146b3578788fd5b82516146be81614e9c565b81358152878201356146cf81614fd4565b8189015284526001959095019492860192820161469d565b5098975050505050505050565b600060208284031215614705578081fd5b813561236781614fe9565b600060208284031215614721578081fd5b815161236781614fe9565b60006020828403121561473d578081fd5b815161236781614fd4565b600060208284031215614759578081fd5b81356001600160401b0381111561476e578182fd5b610a0f848285016140cd565b60006020828403121561478b578081fd5b81516001600160401b038111156147a0578182fd5b8201601f810184136147b0578182fd5b80516147bb81614dba565b6040516147c88282614ec1565b8281528660208486010111156147dc578485fd5b6147ed836020830160208701614e35565b9695505050505050565b600060208284031215614808578081fd5b5035919050565b600060208284031215614820578081fd5b5051919050565b60008060408385031215614839578182fd5b82359150602083013561417e81614fd4565b6000806040838503121561485d578182fd5b8235915060208301356001600160401b03811115614879578182fd5b614620858286016140cd565b6000815180845260208085019450808401835b838110156148b457815187529582019590820190600101614898565b509495945050505050565b600081518084526148d7816020860160208601614e35565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161490d818460208701614e35565b9190910192915050565b60008351614929818460208801614e35565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6001600160a01b0384811682528316602082015260606040820181905260009061497a908301846148bf565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906149af90830186614885565b82810360608401526149c18186614885565b90508281036080840152610d5781856148bf565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614a0f908301846148bf565b979650505050505050565b6020815260006123676020830184614885565b604081526000614a406040830185614885565b828103602084015261497a8185614885565b60208152600061236760208301846148bf565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526037908201527f4173736574436f6e7472616374236f6e6c79496d7065726d616e656e7455524960408201527f3a205552495f43414e4e4f545f42455f4348414e474544000000000000000000606082015260800190565b6020808252603d908201527f4173736574436f6e7472616374536861726564236f6e6c794f776e65724f724d60408201527f616e616765723a2043414c4c45525f49535f4e4f545f4d414e41474552000000606082015260800190565b60208082526030908201527f455243313135355472616461626c65236f6e6c79417070726f7665643a20434160408201526f1313115497d393d517d0531313d5d15160821b606082015260800190565b60208082526045908201527f4173736574436f6e7472616374536861726564236f6e6c7946756c6c546f6b6560408201527f6e4f776e65723a204f4e4c595f46554c4c5f544f4b454e5f4f574e45525f414c6060820152641313d5d15160da1b608082015260a00190565b6020808252602e908201527f455243313135355472616461626c65236f6e6c794f776e65723a2043414c4c4560408201526d292fa4a9afa727aa2fa7aba722a960911b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252603b908201527f4173736574436f6e7472616374536861726564236f6e6c794f776e65724f724d60408201527f696e7465723a2043414c4c45525f49535f4e4f545f4d494e5445520000000000606082015260800190565b60208082526035908201527f4173736574436f6e74726163745368617265642363726561746f724f6e6c793a6040820152740813d3931657d0d491505513d497d0531313d5d151605a1b606082015260800190565b6000808335601e19843603018112614d62578283fd5b8301803591506001600160401b03821115614d7b578283fd5b602001915036819003821315614d9057600080fd5b9250929050565b60006001600160401b03821115614db057614db0614f1e565b5060051b60200190565b60006001600160401b03821115614dd357614dd3614f1e565b50601f01601f191660200190565b60008219821115614df457614df4614f08565b500190565b600060ff821660ff84168060ff03821115614e1657614e16614f08565b019392505050565b600082821015614e3057614e30614f08565b500390565b60005b83811015614e50578181015183820152602001614e38565b8381111561196f5750506000910152565b600181811c90821680614e7557607f821691505b60208210811415614e9657634e487b7160e01b600052602260045260246000fd5b50919050565b604081018181106001600160401b0382111715614ebb57614ebb614f1e565b60405250565b601f8201601f191681016001600160401b0381118282101715614ee657614ee6614f1e565b6040525050565b6000600019821415614f0157614f01614f08565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561273a57600481823e5160e01c90565b600060443d1015614f595790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614f8857505050505090565b8285019150815181811115614fa05750505050505090565b843d8701016020828501011115614fba5750505050505090565b614fc960208286010187614ec1565b509095945050505050565b6001600160a01b038116811461253f57600080fd5b6001600160e01b03198116811461253f57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e6174757265294e4654566f75636865722875696e7432353620746f6b656e49642c737472696e67207572692c61646472657373206572633230546f6b656e2c75696e74323536206572633230546f6b656e416d6f756e742c6164647265737320726563656976657229a2646970667358221220714df7e1b9751ed4aba2b9372ef5532387301bf21fdcb3fd64b361ade173a55664736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d792053746f726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d59530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b697066733a2f2f7b69647d000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102fe5760003560e01c8063731133e911610190578063b48ab8b6116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610964578063f5298aca14610984578063f6eb127a146109a4578063f923e8c3146109c457600080fd5b8063e985e9c514610904578063e9cf98ae14610924578063f242432a1461094457600080fd5b8063b48ab8b614610835578063bd85b03914610855578063c112222914610882578063c311c523146108b0578063cd7c0326146108c4578063d26ea6c0146108e457600080fd5b80638da5cb5b116101495780639e037eea116101235780639e037eea146107b5578063a02fb1ff146107d5578063a22cb465146107f5578063a50aa5c31461081557600080fd5b80638da5cb5b1461076257806391686f531461078057806395d89b41146107a057600080fd5b8063731133e91461069d57806373505d35146106bd57806383ca5a05146106ed5780638456cb591461070d578063862440e214610722578063869f75941461074257600080fd5b80632d0335ab1161024f5780634d647ade11610208578063510b5158116101e2578063510b5158146106115780635b51acff146106495780635c975abb14610669578063715018a61461068857600080fd5b80634d647ade146105855780634e1273f4146105b55780634f558e79146105e257600080fd5b80632d0335ab146104c75780632eb2c2d6146104fd5780632f1c982c1461051d5780633408e4701461053d5780633588ad7c146105505780633f4ba83a1461057057600080fd5b80630f7e5970116102bc578063201c9ac011610296578063201c9ac01461044f57806320379ee514610462578063232ee7601461047757806324d88785146104a757600080fd5b80630f7e5970146103d2578063129009b8146103ff5780631e7d9dbb1461041f57600080fd5b8062fdd58e1461030357806301ffc9a71461033657806306fdde03146103665780630bb2465a146103885780630c53c51c1461039f5780630e89341c146103b2575b600080fd5b34801561030f57600080fd5b5061032361031e3660046144ab565b6109d9565b6040519081526020015b60405180910390f35b34801561034257600080fd5b506103566103513660046146f4565b610a19565b604051901515815260200161032d565b34801561037257600080fd5b5061037b610a69565b60405161032d9190614a52565b34801561039457600080fd5b5061039d610af7565b005b61037b6103ad3660046143d1565b610b8b565b3480156103be57600080fd5b5061037b6103cd3660046147f7565b610d63565b3480156103de57600080fd5b5061037b604051806040016040528060018152602001603160f81b81525081565b34801561040b57600080fd5b5061039d61041a366004614135565b610ea3565b34801561042b57600080fd5b5061035661043a3660046147f7565b60009081526010602052604090205460ff1690565b61032361045d366004614442565b610f40565b34801561046e57600080fd5b50600454610323565b34801561048357600080fd5b50610356610492366004614135565b600d6020526000908152604090205460ff1681565b3480156104b357600080fd5b5061039d6104c2366004614748565b611410565b3480156104d357600080fd5b506103236104e2366004614135565b6001600160a01b031660009081526005602052604090205490565b34801561050957600080fd5b5061039d610518366004614189565b611453565b34801561052957600080fd5b5061039d61053836600461462a565b61154b565b34801561054957600080fd5b5046610323565b34801561055c57600080fd5b5061039d61056b36600461484b565b611975565b34801561057c57600080fd5b5061039d611a1c565b34801561059157600080fd5b506103566105a0366004614135565b600c6020526000908152604090205460ff1681565b3480156105c157600080fd5b506105d56105d036600461455e565b611a9f565b60405161032d9190614a1a565b3480156105ee57600080fd5b506103566105fd3660046147f7565b6000908152600b6020526040902054151590565b34801561061d57600080fd5b5061063161062c3660046147f7565b611c00565b6040516001600160a01b03909116815260200161032d565b34801561065557600080fd5b50601254610631906001600160a01b031681565b34801561067557600080fd5b50600654600160a01b900460ff16610356565b34801561069457600080fd5b5061039d611c47565b3480156106a957600080fd5b5061039d6106b836600461450a565b611cca565b3480156106c957600080fd5b506103566106d8366004614135565b60136020526000908152604090205460ff1681565b3480156106f957600080fd5b5061039d610708366004614135565b611dbe565b34801561071957600080fd5b5061039d611e5b565b34801561072e57600080fd5b5061039d61073d36600461484b565b611edc565b34801561074e57600080fd5b5061032361075d3660046147f7565b611f68565b34801561076e57600080fd5b506006546001600160a01b0316610631565b34801561078c57600080fd5b5061039d61079b366004614827565b611f73565b3480156107ac57600080fd5b5061037b612065565b3480156107c157600080fd5b5061039d6107d0366004614135565b612072565b3480156107e157600080fd5b5061039d6107f0366004614135565b6120ba565b34801561080157600080fd5b5061039d6108103660046143a0565b612154565b34801561082157600080fd5b5061039d610830366004614135565b612166565b34801561084157600080fd5b5061039d61085036600461430a565b6121b1565b34801561086157600080fd5b506103236108703660046147f7565b6000908152600b602052604090205490565b34801561088e57600080fd5b506040805180820190915260058152640312e312e360dc1b602082015261037b565b3480156108bc57600080fd5b506001610356565b3480156108d057600080fd5b50600754610631906001600160a01b031681565b3480156108f057600080fd5b5061039d6108ff366004614135565b6122db565b34801561091057600080fd5b5061035661091f366004614151565b612324565b34801561093057600080fd5b5061039d61093f366004614135565b61236e565b34801561095057600080fd5b5061039d61095f366004614232565b612408565b34801561097057600080fd5b5061039d61097f366004614135565b612458565b34801561099057600080fd5b5061039d61099f3660046144d6565b612542565b3480156109b057600080fd5b5061039d6109bf366004614298565b6125d9565b3480156109d057600080fd5b5061037b6126d3565b6000806109e684846127fc565b90506109f28385612890565b6109fc5780610a0f565b610a05836128c3565b610a0f9082614de1565b9150505b92915050565b60006001600160e01b03198216636cdb3d1360e11b1480610a4a57506001600160e01b031982166303a24d0760e21b145b80610a1357506301ffc9a760e01b6001600160e01b0319831614610a13565b60088054610a7690614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa290614e61565b8015610aef5780601f10610ac457610100808354040283529160200191610aef565b820191906000526020600020905b815481529060010190602001808311610ad257829003601f168201915b505050505081565b610aff6128e5565b6001600160a01b0316610b1a6006546001600160a01b031690565b6001600160a01b03161480610b545750600c6000610b366128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b610b795760405162461bcd60e51b8152600401610b7090614b0a565b60405180910390fd5b601280546001600160a01b0319169055565b60408051606081810183526001600160a01b03881660008181526005602090815290859020548452830152918101869052610bc987828787876128f4565b610c1f5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b70565b6001600160a01b0387166000908152600560205260408120805460019290610c48908490614de1565b90915550506040517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c8190899033908a9061494e565b60405180910390a1600080306001600160a01b0316888a604051602001610ca9929190614917565b60408051601f1981840301815290829052610cc3916148fb565b6000604051808303816000865af19150503d8060008114610d00576040519150601f19603f3d011682016040523d82523d6000602084013e610d05565b606091505b509150915081610d575760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b70565b98975050505050505050565b6000818152600f6020526040812080546060929190610d8190614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610dad90614e61565b8015610dfa5780601f10610dcf57610100808354040283529160200191610dfa565b820191906000526020600020905b815481529060010190602001808311610ddd57829003601f168201915b505050505090508051600014610e105792915050565b600e8054610e1d90614e61565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4990614e61565b8015610e965780601f10610e6b57610100808354040283529160200191610e96565b820191906000526020600020905b815481529060010190602001808311610e7957829003601f168201915b5050505050915050919050565b610eab6128e5565b6001600160a01b0316610ec66006546001600160a01b031690565b6001600160a01b03161480610f005750600c6000610ee26128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b610f1c5760405162461bcd60e51b8152600401610b7090614b0a565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000610f4f86868686866129e4565b610fb15760405162461bcd60e51b815260206004820152602d60248201527f4173736574436f6e74726163745368617265642372656465656d3a20494e564160448201526c4c49445f5349474e415455524560981b6064820152608401610b70565b610fbc853587612a63565b6110215760405162461bcd60e51b815260206004820152603060248201527f4173736574436f6e74726163745368617265642372656465656d3a204f4e4c5960448201526f17d0d491505513d497d0531313d5d15160821b6064820152608401610b70565b84356000908152600b6020526040902054156110925760405162461bcd60e51b815260206004820152602a60248201527f4173736574436f6e74726163745368617265642372656465656d3a20544f4b456044820152691397d49151115153515160b21b6064820152608401610b70565b60006110a46060870160408801614135565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a082319060240160206040518083038186803b1580156110e557600080fd5b505afa1580156110f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111d919061480f565b9050856060013581101561118a5760405162461bcd60e51b815260206004820152602e60248201527f4173736574436f6e74726163745368617265642372656465656d3a20494e535560448201526d4646494349454e545f46554e445360901b6064820152608401610b70565b600061119c6060880160408901614135565b604051636eb1769f60e11b81523360048201523060248201526001600160a01b03919091169063dd62ed3e9060440160206040518083038186803b1580156111e357600080fd5b505afa1580156111f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121b919061480f565b9050866060013581101561128c5760405162461bcd60e51b815260206004820152603260248201527f4173736574436f6e74726163745368617265642372656465656d3a20494e53556044820152714646494349454e545f414c4c4f57414e434560701b6064820152608401610b70565b60008061129f60608a0160408b01614135565b6001600160a01b0316336112b960a08c0160808d01614135565b6040516001600160a01b0392831660248201529116604482015260608b0135606482015260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b1790525161131591906148fb565b6000604051808303816000865af19150503d8060008114611352576040519150601f19603f3d011682016040523d82523d6000602084013e611357565b606091505b5091509150816113b2578051156113715780518082602001fd5b60405162461bcd60e51b8152602060048201526016602482015275115490cc8c0e881514905394d1915497d1905253115160521b6044820152606401610b70565b611401338a3560016113c760208e018e614d4c565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612aae92505050565b50509535979650505050505050565b61142061141b6128e5565b612ace565b61143c5760405162461bcd60e51b8152600401610b7090614c22565b805161144f90600e906020840190613fc0565b5050565b81518351146114ca5760405162461bcd60e51b815260206004820152603a60248201527f4173736574436f6e7472616374237361666542617463685472616e736665724660448201527f726f6d3a20494e56414c49445f4152524159535f4c454e4754480000000000006064820152608401610b70565b60005b83518110156115435761153186868684815181106114fb57634e487b7160e01b600052603260045260246000fd5b602002602001015186858151811061152357634e487b7160e01b600052603260045260246000fd5b602002602001015186612408565b8061153b81614eed565b9150506114cd565b505050505050565b6115536128e5565b6001600160a01b031661156e6006546001600160a01b031690565b6001600160a01b031614806115a85750600c600061158a6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b6115c45760405162461bcd60e51b8152600401610b7090614b0a565b6012546001600160a01b0316806116335760405162461bcd60e51b815260206004820152602d60248201527f4173736574436f6e7472616374536861726564236d6967726174653a204d494760448201526c1490551157d11254d050931151609a1b6064820152608401610b70565b6000816001600160a01b031663f923e8c36040518163ffffffff1660e01b815260040160006040518083038186803b15801561166e57600080fd5b505afa158015611682573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116aa919081019061477a565b905060005b835181101561196f5760008482815181106116da57634e487b7160e01b600052603260045260246000fd5b6020026020010151600001519050600085838151811061170a57634e487b7160e01b600052603260045260246000fd5b602002602001015160200151905060006001600160a01b0316816001600160a01b031614156117995760405162461bcd60e51b815260206004820152603560248201527f4173736574436f6e7472616374536861726564236d6967726174653a205a455260448201527413d7d05111149154d4d7d393d517d0531313d5d151605a1b6064820152608401610b70565b604051627eeac760e11b81526001600160a01b038281166004830152602482018490526000919087169062fdd58e9060440160206040518083038186803b1580156117e357600080fd5b505afa1580156117f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181b919061480f565b90508061182a5750505061195f565b61184582848360405180602001604052806000815250612aae565b845160208601206040516303a24d0760e21b8152600481018590526001600160a01b03881690630e89341c9060240160006040518083038186803b15801561188c57600080fd5b505afa1580156118a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118c8919081019061477a565b805190602001201461195b576040516303a24d0760e21b81526004810184905261195b9084906001600160a01b03891690630e89341c9060240160006040518083038186803b15801561191a57600080fd5b505afa15801561192e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611956919081019061477a565b612b17565b5050505b61196881614eed565b90506116af565b50505050565b81611987816119826128e5565b612bdd565b6119a35760405162461bcd60e51b8152600401610b7090614cf7565b600083815260106020526040902054839060ff16156119d45760405162461bcd60e51b8152600401610b7090614aad565b836119ef6119e06128e5565b826119ea84612c28565b612c43565b611a0b5760405162461bcd60e51b8152600401610b7090614bb7565b611a158585612b17565b5050505050565b611a246128e5565b6001600160a01b0316611a3f6006546001600160a01b031690565b6001600160a01b03161480611a795750600c6000611a5b6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b611a955760405162461bcd60e51b8152600401610b7090614b0a565b611a9d612c5a565b565b60608151835114611b045760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610b70565b600083516001600160401b03811115611b2d57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611b56578160200160208202803683370190505b50905060005b8451811015611bf857611bbd858281518110611b8857634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110611bb057634e487b7160e01b600052603260045260246000fd5b60200260200101516109d9565b828281518110611bdd57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611bf181614eed565b9050611b5c565b509392505050565b6000818152601460205260408120546001600160a01b031615611c3957506000908152601460205260409020546001600160a01b031690565b610a1382612cfd565b919050565b611c4f6128e5565b6001600160a01b0316611c6a6006546001600160a01b031690565b6001600160a01b031614611cc05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b70565b611a9d6000612d17565b60026011541415611d1d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b70565b600260115582611d3481611d2f6128e5565b612a63565b611da65760405162461bcd60e51b815260206004820152603b60248201527f4173736574436f6e747261637453686172656423697343726561746f724f724d60448201527f696e7465723a204f4e4c595f43524541544f525f414c4c4f57454400000000006064820152608401610b70565b611db285858585612aae565b50506001601155505050565b611dc66128e5565b6001600160a01b0316611de16006546001600160a01b031690565b6001600160a01b03161480611e1b5750600d6000611dfd6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b611e375760405162461bcd60e51b8152600401610b7090614c9a565b6001600160a01b03166000908152600d60205260409020805460ff19166001179055565b611e636128e5565b6001600160a01b0316611e7e6006546001600160a01b031690565b6001600160a01b03161480611eb85750600c6000611e9a6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b611ed45760405162461bcd60e51b8152600401610b7090614b0a565b611a9d612d69565b81611ee9816119826128e5565b611f055760405162461bcd60e51b8152600401610b7090614cf7565b600083815260106020526040902054839060ff1615611f365760405162461bcd60e51b8152600401610b7090614aad565b83611f426119e06128e5565b611f5e5760405162461bcd60e51b8152600401610b7090614bb7565b611a158585612dcf565b6000610a1382612c28565b81611f80816119826128e5565b611f9c5760405162461bcd60e51b8152600401610b7090614cf7565b6001600160a01b03821661200b5760405162461bcd60e51b815260206004820152603060248201527f4173736574436f6e74726163745368617265642373657443726561746f723a2060448201526f24a72b20a624a22fa0a2222922a9a99760811b6064820152608401610b70565b60008381526014602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051909185917f39071c63e44267bfdefc7b625c0df99d3ce2e6ff98d9f5e9e8a7ab43cdf5000d9190a3505050565b60098054610a7690614e61565b61207d61141b6128e5565b6120995760405162461bcd60e51b8152600401610b7090614c22565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6120c26128e5565b6001600160a01b03166120dd6006546001600160a01b031690565b6001600160a01b031614806121175750600c60006120f96128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b6121335760405162461bcd60e51b8152600401610b7090614b0a565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b61144f61215f6128e5565b8383612e1f565b61217161141b6128e5565b61218d5760405162461bcd60e51b8152600401610b7090614c22565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b600260115414156122045760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b70565b600260115560005b83518110156122c35761224884828151811061223857634e487b7160e01b600052603260045260246000fd5b6020026020010151611d2f6128e5565b6122b15760405162461bcd60e51b815260206004820152603460248201527f4173736574436f6e7472616374536861726564235f62617463684d696e743a2060448201527313d3931657d0d491505513d497d0531313d5d15160621b6064820152608401610b70565b806122bb81614eed565b91505061220c565b506122d084848484612f00565b505060016011555050565b6122e661141b6128e5565b6123025760405162461bcd60e51b8152600401610b7090614c22565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60006123308383612f65565b1561233d57506001610a13565b6001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b6123766128e5565b6001600160a01b03166123916006546001600160a01b031690565b6001600160a01b031614806123cb5750600d60006123ad6128e5565b6001600160a01b0316815260208101919091526040016000205460ff165b6123e75760405162461bcd60e51b8152600401610b7090614c9a565b6001600160a01b03166000908152600d60205260409020805460ff19169055565b600061241486856127fc565b90508281101561244b57612433858561242d8487614e1e565b85611cca565b8015612446576124468686868486612f98565b611543565b6115438686868686612f98565b6124606128e5565b6001600160a01b031661247b6006546001600160a01b031690565b6001600160a01b0316146124d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b70565b6001600160a01b0381166125365760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b70565b61253f81612d17565b50565b828282612550838383612c43565b6125ce5760405162461bcd60e51b815260206004820152604360248201527f4173736574436f6e7472616374236f6e6c79546f6b656e416d6f756e744f776e60448201527f65643a204f4e4c595f544f4b454e5f414d4f554e545f4f574e45445f414c4c4f60648201526215d15160ea1b608482015260a401610b70565b6115438686866131cd565b60005b82518110156126c25761263e8484838151811061260957634e487b7160e01b600052603260045260246000fd5b602002602001015184848151811061263157634e487b7160e01b600052603260045260246000fd5b6020026020010151612c43565b6126b05760405162461bcd60e51b815260206004820152603860248201527f4173736574436f6e74726163742362617463684275726e3a204f4e4c595f544f60448201527f4b454e5f414d4f554e545f4f574e45445f414c4c4f57454400000000000000006064820152608401610b70565b806126ba81614eed565b9150506125dc565b506126ce838383613223565b505050565b600e8054610a7690614e61565b60003330141561273757600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b0316915061273a9050565b50335b90565b6007546000906001600160a01b03163b61275957506000610a13565b60075460405163c455279160e01b81526001600160a01b03858116600483015291821691841690829063c45527919060240160206040518083038186803b1580156127a357600080fd5b505afa1580156127b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127db919061472c565b6001600160a01b031614949350505050565b6001600160a01b03163b151590565b60006001600160a01b0383166128685760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b70565b506000908152600a602090815260408083206001600160a01b03949094168352929052205490565b60008061289c84611c00565b9050826001600160a01b0316816001600160a01b03161480610a0f5750610a0f8184612f65565b6000818152600b60205260408120546128db83611f68565b610a139190614e1e565b60006128ef6126e0565b905090565b60006001600160a01b03861661295a5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b70565b600161296d61296887613279565b6132f6565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156129bb573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006001600160a01b038616612a555760405162461bcd60e51b815260206004820152603060248201527f4173736574436f6e74726163745368617265642376657269667952656465656d60448201526f1d1024a72b20a624a22fa9a4a3a722a960811b6064820152608401610b70565b600161296d61296887613326565b600080612a6f84611c00565b9050826001600160a01b0316816001600160a01b03161480610a0f575050506001600160a01b03166000908152600d602052604090205460ff16919050565b612aba848484846133d7565b60018151111561196f5761196f8382612dcf565b6000816001600160a01b0316612aec6006546001600160a01b031690565b6001600160a01b03161480610a135750610a13612b116006546001600160a01b031690565b83612f65565b6000815111612b7e5760405162461bcd60e51b815260206004820152602d60248201527f4173736574436f6e7472616374237365745065726d616e656e745552493a204f60448201526c4e4c595f56414c49445f55524960981b6064820152608401610b70565b6000828152601060205260409020805460ff19166001179055612ba18282612dcf565b817fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b5565720782604051612bd19190614a52565b60405180910390a25050565b600080612be984611c00565b9050826001600160a01b0316816001600160a01b03161480610a0f575050506001600160a01b03166000908152600c602052604090205460ff16919050565b6000612c3b600165010000000000614e1e565b909116919050565b600081612c5085856109d9565b1015949350505050565b600654600160a01b900460ff16612caa5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b70565b6006805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612ce06128e5565b6040516001600160a01b03909116815260200160405180910390a1565b6000612d0b60286038614df9565b60ff169190911c919050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600654600160a01b900460ff1615612d935760405162461bcd60e51b8152600401610b7090614c70565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612ce06128e5565b6000828152600f602090815260409091208251612dee92840190613fc0565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051612bd19190614a52565b816001600160a01b0316836001600160a01b03161415612e935760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610b70565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612f0c84848484613506565b60018151111561196f5760005b8351811015611a1557612f53848281518110612f4557634e487b7160e01b600052603260045260246000fd5b602002602001015183612dcf565b80612f5d81614eed565b915050612f19565b6001600160a01b03811660009081526013602052604081205460ff1615612f8e57506001610a13565b612367838361273d565b600654600160a01b900460ff1615612fc25760405162461bcd60e51b8152600401610b7090614c70565b84612fcb6128e5565b6001600160a01b0316816001600160a01b03161480612ff15750612ff18161091f6128e5565b61300d5760405162461bcd60e51b8152600401610b7090614b67565b6001600160a01b0385166130715760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b70565b600061307b6128e5565b905061309581888861308c896137b5565b611a15896137b5565b6000858152600a602090815260408083206001600160a01b038b1684529091529020548481101561311b5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b6064820152608401610b70565b6131258582614e1e565b6000878152600a602090815260408083206001600160a01b038d81168552925280832093909355891681529081208054879290613163908490614de1565b909155505060408051878152602081018790526001600160a01b03808a16928b821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46131c382898989898961380e565b5050505050505050565b826131d66128e5565b6001600160a01b0316816001600160a01b031614806131fc57506131fc8161091f6128e5565b6132185760405162461bcd60e51b8152600401610b7090614b67565b61196f848484613979565b8261322c6128e5565b6001600160a01b0316816001600160a01b0316148061325257506132528161091f6128e5565b61326e5760405162461bcd60e51b8152600401610b7090614b67565b61196f848484613bc1565b600060405180608001604052806043815260200161500060439139805160209182012083518483015160408087015180519086012090516132d9950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061330160045490565b60405161190160f01b60208201526022810191909152604281018390526062016132d9565b60006040518060a00160405280606381526020016150436063913980516020918201209083359061335990850185614d4c565b6040516133679291906148eb565b60405180910390208460400160208101906133829190614135565b606086013561339760a0880160808901614135565b60408051602081019790975286019490945260608501929092526001600160a01b03908116608085015260a08401919091521660c082015260e0016132d9565b600654600160a01b900460ff16156134015760405162461bcd60e51b8152600401610b7090614c70565b600061340b6128e5565b90506134268160008761341d886137b5565b611a15886137b5565b6134308484613e6d565b6000848152600a602090815260408083206001600160a01b038916845290915281208054859290613462908490614de1565b90915550506000848152600b602052604081208054859290613485908490614de1565b909155506000905061349685613eeb565b9050856001600160a01b0316816001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516134f0929190918252602082015260400190565b60405180910390a461154382828888888861380e565b600654600160a01b900460ff16156135305760405162461bcd60e51b8152600401610b7090614c70565b815183511461359a5760405162461bcd60e51b815260206004820152603060248201527f455243313135355472616461626c652362617463684d696e743a20494e56414c60448201526f09288be82a4a482b2a6be988a9c8ea8960831b6064820152608401610b70565b825160006135cb8582846135be57634e487b7160e01b600052603260045260246000fd5b6020026020010151613eeb565b905060006135d76128e5565b905060005b8381101561374657600087828151811061360657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600087838151811061363257634e487b7160e01b600052603260045260246000fd5b602002602001015190506136468282613e6d565b846001600160a01b031661365983613eeb565b6001600160a01b0316146136d55760405162461bcd60e51b815260206004820152603760248201527f455243313135355472616461626c652362617463684d696e743a204d554c544960448201527f504c455f4f524947494e535f4e4f545f414c4c4f5745440000000000000000006064820152608401610b70565b6000828152600a602090815260408083206001600160a01b038e16845290915281208054839290613707908490614de1565b90915550506000828152600b60205260408120805483929061372a908490614de1565b925050819055505050808061373e90614eed565b9150506135dc565b50866001600160a01b0316826001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051613796929190614a2d565b60405180910390a46137ac818389898989613ef6565b50505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106137fd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156115435760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061385290899089908890889088906004016149d5565b602060405180830381600087803b15801561386c57600080fd5b505af192505050801561389c575060408051601f3d908101601f1916820190925261389991810190614710565b60015b613949576138a8614f34565b806308c379a014156138e257506138bd614f4b565b806138c857506138e4565b8060405162461bcd60e51b8152600401610b709190614a52565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610b70565b6001600160e01b0319811663f23a6e6160e01b146137ac5760405162461bcd60e51b8152600401610b7090614a65565b600654600160a01b900460ff16156139a35760405162461bcd60e51b8152600401610b7090614c70565b6001600160a01b038316613a075760405162461bcd60e51b815260206004820152602560248201527f45524331313535235f6275726e3a204255524e5f46524f4d5f5a45524f5f4144604482015264445245535360d81b6064820152608401610b70565b60008111613a635760405162461bcd60e51b815260206004820152602360248201527f45524331313535235f6275726e3a20414d4f554e545f4c4553535f5448414e5f6044820152624f4e4560e81b6064820152608401610b70565b6000613a6d6128e5565b9050613a9e81856000613a7f876137b5565b613a88876137b5565b5050604080516020810190915260009052505050565b6000838152600a602090815260408083206001600160a01b038816845290915290205482811015613b1f5760405162461bcd60e51b815260206004820152602560248201527f45524331313535235f6275726e3a20414d4f554e545f455843454544535f42416044820152644c414e434560d81b6064820152608401610b70565b613b298382614e1e565b6000858152600a602090815260408083206001600160a01b038a168452825280832093909355868252600b90529081208054859290613b69908490614e1e565b909155505060408051858152602081018590526000916001600160a01b0388811692908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600654600160a01b900460ff1615613beb5760405162461bcd60e51b8152600401610b7090614c70565b6001600160a01b038316613c415760405162461bcd60e51b815260206004820152601f60248201527f455243313135353a204255524e5f46524f4d5f5a45524f5f41444452455353006044820152606401610b70565b8051825114613c9e5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a204944535f414d4f554e54535f4c454e4754485f4d49534d604482015263082a886960e31b6064820152608401610b70565b6000613ca86128e5565b604080516020810190915260009052905060005b8351811015613e0e576000848281518110613ce757634e487b7160e01b600052603260045260246000fd5b602002602001015190506000848381518110613d1357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516000848152600a835260408082206001600160a01b038c168352909352919091205490915081811015613da75760405162461bcd60e51b815260206004820152602a60248201527f45524331313535235f6275726e42617463683a20414d4f554e545f455843454560448201526944535f42414c414e434560b01b6064820152608401610b70565b613db18282614e1e565b6000848152600a602090815260408083206001600160a01b038d168452825280832093909355858252600b90529081208054849290613df1908490614e1e565b925050819055505050508080613e0690614eed565b915050613cbc565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051613e5f929190614a2d565b60405180910390a450505050565b613e76826128c3565b81111561144f5760405162461bcd60e51b815260206004820152603c60248201527f4173736574436f6e7472616374235f6265666f72654d696e743a205155414e5460448201527f4954595f455843454544535f544f4b454e5f535550504c595f434150000000006064820152608401610b70565b6000610a1382612cfd565b6001600160a01b0384163b156115435760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613f3a9089908990889088908890600401614983565b602060405180830381600087803b158015613f5457600080fd5b505af1925050508015613f84575060408051601f3d908101601f19168201909252613f8191810190614710565b60015b613f90576138a8614f34565b6001600160e01b0319811663bc197c8160e01b146137ac5760405162461bcd60e51b8152600401610b7090614a65565b828054613fcc90614e61565b90600052602060002090601f016020900481019282613fee5760008555614034565b82601f1061400757805160ff1916838001178555614034565b82800160010185558215614034579182015b82811115614034578251825591602001919060010190614019565b50614040929150614044565b5090565b5b808211156140405760008155600101614045565b600082601f830112614069578081fd5b8135602061407682614d97565b6040516140838282614ec1565b8381528281019150858301600585901b870184018810156140a2578586fd5b855b858110156140c0578135845292840192908401906001016140a4565b5090979650505050505050565b600082601f8301126140dd578081fd5b81356140e881614dba565b6040516140f58282614ec1565b828152856020848701011115614109578384fd5b82602086016020830137918201602001929092529392505050565b803560ff81168114611c4257600080fd5b600060208284031215614146578081fd5b813561236781614fd4565b60008060408385031215614163578081fd5b823561416e81614fd4565b9150602083013561417e81614fd4565b809150509250929050565b600080600080600060a086880312156141a0578081fd5b85356141ab81614fd4565b945060208601356141bb81614fd4565b935060408601356001600160401b03808211156141d6578283fd5b6141e289838a01614059565b945060608801359150808211156141f7578283fd5b61420389838a01614059565b93506080880135915080821115614218578283fd5b50614225888289016140cd565b9150509295509295909350565b600080600080600060a08688031215614249578283fd5b853561425481614fd4565b9450602086013561426481614fd4565b9350604086013592506060860135915060808601356001600160401b0381111561428c578182fd5b614225888289016140cd565b6000806000606084860312156142ac578081fd5b83356142b781614fd4565b925060208401356001600160401b03808211156142d2578283fd5b6142de87838801614059565b935060408601359150808211156142f3578283fd5b5061430086828701614059565b9150509250925092565b6000806000806080858703121561431f578182fd5b843561432a81614fd4565b935060208501356001600160401b0380821115614345578384fd5b61435188838901614059565b94506040870135915080821115614366578384fd5b61437288838901614059565b93506060870135915080821115614387578283fd5b50614394878288016140cd565b91505092959194509250565b600080604083850312156143b2578182fd5b82356143bd81614fd4565b91506020830135801515811461417e578182fd5b600080600080600060a086880312156143e8578283fd5b85356143f381614fd4565b945060208601356001600160401b0381111561440d578384fd5b614419888289016140cd565b945050604086013592506060860135915061443660808701614124565b90509295509295909350565b600080600080600060a08688031215614459578283fd5b853561446481614fd4565b945060208601356001600160401b0381111561447e578384fd5b860160a0818903121561448f578384fd5b9350604086013592506060860135915061443660808701614124565b600080604083850312156144bd578182fd5b82356144c881614fd4565b946020939093013593505050565b6000806000606084860312156144ea578081fd5b83356144f581614fd4565b95602085013595506040909401359392505050565b6000806000806080858703121561451f578182fd5b843561452a81614fd4565b9350602085013592506040850135915060608501356001600160401b03811115614552578182fd5b614394878288016140cd565b60008060408385031215614570578182fd5b82356001600160401b0380821115614586578384fd5b818501915085601f830112614599578384fd5b813560206145a682614d97565b6040516145b38282614ec1565b8381528281019150858301600585901b870184018b10156145d2578889fd5b8896505b848710156145fd5780356145e981614fd4565b8352600196909601959183019183016145d6565b5096505086013592505080821115614613578283fd5b5061462085828601614059565b9150509250929050565b6000602080838503121561463c578182fd5b82356001600160401b03811115614651578283fd5b8301601f81018513614661578283fd5b803561466c81614d97565b6040805161467a8382614ec1565b8381528581019250848601600685901b860187018a1015614699578788fd5b8795505b848610156146e75782818b0312156146b3578788fd5b82516146be81614e9c565b81358152878201356146cf81614fd4565b8189015284526001959095019492860192820161469d565b5098975050505050505050565b600060208284031215614705578081fd5b813561236781614fe9565b600060208284031215614721578081fd5b815161236781614fe9565b60006020828403121561473d578081fd5b815161236781614fd4565b600060208284031215614759578081fd5b81356001600160401b0381111561476e578182fd5b610a0f848285016140cd565b60006020828403121561478b578081fd5b81516001600160401b038111156147a0578182fd5b8201601f810184136147b0578182fd5b80516147bb81614dba565b6040516147c88282614ec1565b8281528660208486010111156147dc578485fd5b6147ed836020830160208701614e35565b9695505050505050565b600060208284031215614808578081fd5b5035919050565b600060208284031215614820578081fd5b5051919050565b60008060408385031215614839578182fd5b82359150602083013561417e81614fd4565b6000806040838503121561485d578182fd5b8235915060208301356001600160401b03811115614879578182fd5b614620858286016140cd565b6000815180845260208085019450808401835b838110156148b457815187529582019590820190600101614898565b509495945050505050565b600081518084526148d7816020860160208601614e35565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161490d818460208701614e35565b9190910192915050565b60008351614929818460208801614e35565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6001600160a01b0384811682528316602082015260606040820181905260009061497a908301846148bf565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906149af90830186614885565b82810360608401526149c18186614885565b90508281036080840152610d5781856148bf565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614a0f908301846148bf565b979650505050505050565b6020815260006123676020830184614885565b604081526000614a406040830185614885565b828103602084015261497a8185614885565b60208152600061236760208301846148bf565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526037908201527f4173736574436f6e7472616374236f6e6c79496d7065726d616e656e7455524960408201527f3a205552495f43414e4e4f545f42455f4348414e474544000000000000000000606082015260800190565b6020808252603d908201527f4173736574436f6e7472616374536861726564236f6e6c794f776e65724f724d60408201527f616e616765723a2043414c4c45525f49535f4e4f545f4d414e41474552000000606082015260800190565b60208082526030908201527f455243313135355472616461626c65236f6e6c79417070726f7665643a20434160408201526f1313115497d393d517d0531313d5d15160821b606082015260800190565b60208082526045908201527f4173736574436f6e7472616374536861726564236f6e6c7946756c6c546f6b6560408201527f6e4f776e65723a204f4e4c595f46554c4c5f544f4b454e5f4f574e45525f414c6060820152641313d5d15160da1b608082015260a00190565b6020808252602e908201527f455243313135355472616461626c65236f6e6c794f776e65723a2043414c4c4560408201526d292fa4a9afa727aa2fa7aba722a960911b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252603b908201527f4173736574436f6e7472616374536861726564236f6e6c794f776e65724f724d60408201527f696e7465723a2043414c4c45525f49535f4e4f545f4d494e5445520000000000606082015260800190565b60208082526035908201527f4173736574436f6e74726163745368617265642363726561746f724f6e6c793a6040820152740813d3931657d0d491505513d497d0531313d5d151605a1b606082015260800190565b6000808335601e19843603018112614d62578283fd5b8301803591506001600160401b03821115614d7b578283fd5b602001915036819003821315614d9057600080fd5b9250929050565b60006001600160401b03821115614db057614db0614f1e565b5060051b60200190565b60006001600160401b03821115614dd357614dd3614f1e565b50601f01601f191660200190565b60008219821115614df457614df4614f08565b500190565b600060ff821660ff84168060ff03821115614e1657614e16614f08565b019392505050565b600082821015614e3057614e30614f08565b500390565b60005b83811015614e50578181015183820152602001614e38565b8381111561196f5750506000910152565b600181811c90821680614e7557607f821691505b60208210811415614e9657634e487b7160e01b600052602260045260246000fd5b50919050565b604081018181106001600160401b0382111715614ebb57614ebb614f1e565b60405250565b601f8201601f191681016001600160401b0381118282101715614ee657614ee6614f1e565b6040525050565b6000600019821415614f0157614f01614f08565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d111561273a57600481823e5160e01c90565b600060443d1015614f595790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614f8857505050505090565b8285019150815181811115614fa05750505050505090565b843d8701016020828501011115614fba5750505050505090565b614fc960208286010187614ec1565b509095945050505050565b6001600160a01b038116811461253f57600080fd5b6001600160e01b03198116811461253f57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e6174757265294e4654566f75636865722875696e7432353620746f6b656e49642c737472696e67207572692c61646472657373206572633230546f6b656e2c75696e74323536206572633230546f6b656e416d6f756e742c6164647265737320726563656976657229a2646970667358221220714df7e1b9751ed4aba2b9372ef5532387301bf21fdcb3fd64b361ade173a55664736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084d792053746f726500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d59530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b697066733a2f2f7b69647d000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): My Store
Arg [1] : _symbol (string): MYS
Arg [2] : _proxyRegistryAddress (address): 0x0000000000000000000000000000000000000000
Arg [3] : _templateURI (string): ipfs://{id}
Arg [4] : _migrationAddress (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 4d792053746f7265000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 4d59530000000000000000000000000000000000000000000000000000000000
Arg [9] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [10] : 697066733a2f2f7b69647d000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
342:11259:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3058:349:1;;;;;;;;;;-1:-1:-1;3058:349:1;;;;;:::i;:::-;;:::i;:::-;;;20929:25:23;;;20917:2;20902:18;3058:349:1;;;;;;;;1166:305:6;;;;;;;;;;-1:-1:-1;1166:305:6;;;;;:::i;:::-;;:::i;:::-;;;20756:14:23;;20749:22;20731:41;;20719:2;20704:18;1166:305:6;20686:92:23;842:18:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3239:120:2:-;;;;;;;;;;;;;:::i;:::-;;905:1179:17;;;;;;:::i;:::-;;:::i;2807:243:1:-;;;;;;;;;;-1:-1:-1;2807:243:1;;;;;:::i;:::-;;:::i;280:43:5:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;280:43:5;;;;;3011:123:7;;;;;;;;;;-1:-1:-1;3011:123:7;;;;;:::i;:::-;;:::i;2689:110:1:-;;;;;;;;;;-1:-1:-1;2689:110:1;;;;;:::i;:::-;2747:4;2771:20;;;:15;:20;;;;;;;;;2689:110;8940:1653:2;;;;;;:::i;:::-;;:::i;1275:101:5:-;;;;;;;;;;-1:-1:-1;1353:15:5;;1275:101;;1150:47:7;;;;;;;;;;-1:-1:-1;1150:47:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;2172:105:1;;;;;;;;;;-1:-1:-1;2172:105:1;;;;;:::i;:::-;;:::i;2510:107:17:-;;;;;;;;;;-1:-1:-1;2510:107:17;;;;;:::i;:::-;-1:-1:-1;;;;;2597:12:17;2563:13;2597:12;;;:6;:12;;;;;;;2510:107;4056:490:1;;;;;;;;;;-1:-1:-1;4056:490:1;;;;;:::i;:::-;;:::i;3435:1184:2:-;;;;;;;;;;-1:-1:-1;3435:1184:2;;;;;:::i;:::-;;:::i;1384:161:5:-;;;;;;;;;;-1:-1:-1;1498:9:5;1384:161;;6017:235:2;;;;;;;;;;-1:-1:-1;6017:235:2;;;;;:::i;:::-;;:::i;3872:76:7:-;;;;;;;;;;;;;:::i;1095:48::-;;;;;;;;;;-1:-1:-1;1095:48:7;;;;;:::i;:::-;;;;;;;;;;;;;;;;4582:561;;;;;;;;;;-1:-1:-1;4582:561:7;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10639:98::-;;;;;;;;;;-1:-1:-1;10639:98:7;;;;;:::i;:::-;10689:4;10713:12;;;:7;:12;;;;;;:16;;;10639:98;6827:232:2;;;;;;;;;;-1:-1:-1;6827:232:2;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;17011:32:23;;;16993:51;;16981:2;16966:18;6827:232:2;16948:102:23;447:42:2;;;;;;;;;;-1:-1:-1;447:42:2;;;;-1:-1:-1;;;;;447:42:2;;;1091:84:19;;;;;;;;;;-1:-1:-1;1161:7:19;;-1:-1:-1;;;1161:7:19;;;;1091:84;;1661:101:18;;;;;;;;;;;;;:::i;4627:226:2:-;;;;;;;;;;-1:-1:-1;4627:226:2;;;;;:::i;:::-;;:::i;498:52::-;;;;;;;;;;-1:-1:-1;498:52:2;;;;;:::i;:::-;;;;;;;;;;;;;;;;3210:120:7;;;;;;;;;;-1:-1:-1;3210:120:7;;;;;:::i;:::-;;:::i;3792:72::-;;;;;;;;;;;;;:::i;5739:217:2:-;;;;;;;;;;-1:-1:-1;5739:217:2;;;;;:::i;:::-;;:::i;7178:108::-;;;;;;;;;;-1:-1:-1;7178:108:2;;;;;:::i;:::-;;:::i;1029:85:18:-;;;;;;;;;;-1:-1:-1;1101:6:18;;-1:-1:-1;;;;;1101:6:18;1029:85;;6433:282:2;;;;;;;;;;-1:-1:-1;6433:282:2;;;;;:::i;:::-;;:::i;891:20:7:-;;;;;;;;;;;;;:::i;2998:155:2:-;;;;;;;;;;-1:-1:-1;2998:155:2;;;;;:::i;:::-;;:::i;3410:149:7:-;;;;;;;;;;-1:-1:-1;3410:149:7;;;;;:::i;:::-;;:::i;3075:153:6:-;;;;;;;;;;-1:-1:-1;3075:153:6;;;;;:::i;:::-;;:::i;2784:129:2:-;;;;;;;;;;-1:-1:-1;2784:129:2;;;;;:::i;:::-;;:::i;4861:471::-;;;;;;;;;;-1:-1:-1;4861:471:2;;;;;:::i;:::-;;:::i;5321:102:7:-;;;;;;;;;;-1:-1:-1;5321:102:7;;;;;:::i;:::-;5376:7;5403:12;;;:7;:12;;;;;;;5321:102;1508:93:1;;;;;;;;;;-1:-1:-1;1579:14:1;;;;;;;;;;;;-1:-1:-1;;;1579:14:1;;;;1508:93;;2071;;;;;;;;;;-1:-1:-1;2152:4:1;2071:93;;778:35:7;;;;;;;;;;-1:-1:-1;778:35:7;;;;-1:-1:-1;;;;;778:35:7;;;2577:125:2;;;;;;;;;;-1:-1:-1;2577:125:2;;;;;:::i;:::-;;:::i;5556:371:7:-;;;;;;;;;;-1:-1:-1;5556:371:7;;;;;:::i;:::-;;:::i;3638:146::-;;;;;;;;;;-1:-1:-1;3638:146:7;;;;;:::i;:::-;;:::i;3415:633:1:-;;;;;;;;;;-1:-1:-1;3415:633:1;;;;;:::i;:::-;;:::i;1911:198:18:-;;;;;;;;;;-1:-1:-1;1911:198:18;;;;;:::i;:::-;;:::i;4900:207:1:-;;;;;;;;;;-1:-1:-1;4900:207:1;;;;;:::i;:::-;;:::i;5187:442::-;;;;;;;;;;-1:-1:-1;5187:442:1;;;;;:::i;:::-;;:::i;361:25::-;;;;;;;;;;;;;:::i;3058:349::-;3189:7;3214:15;3232:28;3248:6;3256:3;3232:15;:28::i;:::-;3214:46;;3291:30;3309:3;3314:6;3291:17;:30::i;:::-;:108;;3392:7;3291:108;;;3351:21;3368:3;3351:16;:21::i;:::-;3341:31;;:7;:31;:::i;:::-;3271:128;;;3058:349;;;;;:::o;1166:305:6:-;1268:4;-1:-1:-1;;;;;;1303:41:6;;-1:-1:-1;;;1303:41:6;;:109;;-1:-1:-1;;;;;;;1360:52:6;;-1:-1:-1;;;1360:52:6;1303:109;:161;;;-1:-1:-1;;;;;;;;;;937:40:8;;;1428:36:6;829:155:8;842:18:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3239:120:2:-;1955:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1944:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;1944:7:7;-1:-1:-1;;;;;1944:23:7;;:57;;;;1971:16;:30;1988:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:30:7;;;;;;;;;;;;-1:-1:-1;1971:30:7;;;;1944:57;1921:170;;;;-1:-1:-1;;;1921:170:7;;;;;;;:::i;:::-;;;;;;;;;3302:15:2::1;:49:::0;;-1:-1:-1;;;;;;3302:49:2::1;::::0;;3239:120::o;905:1179:17:-;1178:168;;;1108:12;1178:168;;;;;-1:-1:-1;;;;;1220:19:17;;1133:29;1220:19;;;:6;:19;;;;;;;;;1178:168;;;;;;;;;;;1381:45;1227:11;1178:168;1409:4;1415;1421;1381:6;:45::i;:::-;1359:128;;;;-1:-1:-1;;;1359:128:17;;34736:2:23;1359:128:17;;;34718:21:23;34775:2;34755:18;;;34748:30;34814:34;34794:18;;;34787:62;-1:-1:-1;;;34865:18:23;;;34858:31;34906:19;;1359:128:17;34708:223:23;1359:128:17;-1:-1:-1;;;;;1554:19:17;;;;;;:6;:19;;;;;:24;;1577:1;;1554:19;:24;;1577:1;;1554:24;:::i;:::-;;;;-1:-1:-1;;1596:126:17;;;;;;1634:11;;1668:10;;1694:17;;1596:126;:::i;:::-;;;;;;;;1833:12;1847:23;1895:4;-1:-1:-1;;;;;1887:18:17;1941:17;1960:11;1924:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1924:48:17;;;;;;;;;;1887:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1832:155;;;;2006:7;1998:48;;;;-1:-1:-1;;;1998:48:17;;26522:2:23;1998:48:17;;;26504:21:23;26561:2;26541:18;;;26534:30;26600;26580:18;;;26573:58;26648:18;;1998:48:17;26494:178:23;1998:48:17;2066:10;905:1179;-1:-1:-1;;;;;;;;905:1179:17:o;2807:243:1:-;2889:22;2914:14;;;:9;:14;;;;;2889:39;;2863:13;;2889:22;2914:14;2889:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2949:8;2943:22;2969:1;2943:27;2939:75;;2994:8;2807:243;-1:-1:-1;;2807:243:1:o;2939:75::-;3031:11;3024:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2807:243;;;:::o;3011:123:7:-;1955:12;:10;:12::i;:::-;-1:-1:-1;;;;;1944:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;1944:7:7;-1:-1:-1;;;;;1944:23:7;;:57;;;;1971:16;:30;1988:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:30:7;;;;;;;;;;;;-1:-1:-1;1971:30:7;;;;1944:57;1921:170;;;;-1:-1:-1;;;1921:170:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3093:26:7::1;;::::0;;;:16:::1;:26;::::0;;;;:33;;-1:-1:-1;;3093:33:7::1;3122:4;3093:33;::::0;;3011:123::o;8940:1653:2:-;9111:7;9155:47;9168:6;9176:7;9185:4;9191;9197;9155:12;:47::i;:::-;9133:142;;;;-1:-1:-1;;;9133:142:2;;28555:2:23;9133:142:2;;;28537:21:23;28594:2;28574:18;;;28567:30;28633:34;28613:18;;;28606:62;-1:-1:-1;;;28684:18:23;;;28677:43;28737:19;;9133:142:2;28527:235:23;9133:142:2;9375:43;9394:15;;9411:6;9375:18;:43::i;:::-;9353:141;;;;-1:-1:-1;;;9353:141:2;;29386:2:23;9353:141:2;;;29368:21:23;29425:2;29405:18;;;29398:30;29464:34;29444:18;;;29437:62;-1:-1:-1;;;29515:18:23;;;29508:46;29571:19;;9353:141:2;29358:238:23;9353:141:2;9523:15;;10689:4:7;10713:12;;;:7;:12;;;;;;:16;9507:79:2;;;;-1:-1:-1;;;9507:79:2;;35965:2:23;9507:79:2;;;35947:21:23;36004:2;35984:18;;;35977:30;36043:34;36023:18;;;36016:62;-1:-1:-1;;;36094:18:23;;;36087:40;36144:19;;9507:79:2;35937:232:23;9507:79:2;9599:20;9628:18;;;;;;;;:::i;:::-;9622:47;;-1:-1:-1;;;9622:47:2;;9658:10;9622:47;;;16993:51:23;-1:-1:-1;;;;;9622:35:2;;;;;;;16966:18:23;;9622:47:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9599:70;;9704:7;:24;;;9688:12;:40;;9680:99;;;;-1:-1:-1;;;9680:99:2;;42085:2:23;9680:99:2;;;42067:21:23;42124:2;42104:18;;;42097:30;42163:34;42143:18;;;42136:62;-1:-1:-1;;;42214:18:23;;;42207:44;42268:19;;9680:99:2;42057:236:23;9680:99:2;9792:17;9818:18;;;;;;;;:::i;:::-;9812:62;;-1:-1:-1;;;9812:62:2;;9848:10;9812:62;;;17267:34:23;9868:4:2;17317:18:23;;;17310:43;-1:-1:-1;;;;;9812:35:2;;;;;;;17202:18:23;;9812:62:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9792:82;;9906:7;:24;;;9893:9;:37;;9885:100;;;;-1:-1:-1;;;9885:100:2;;24100:2:23;9885:100:2;;;24082:21:23;24139:2;24119:18;;;24112:30;24178:34;24158:18;;;24151:62;-1:-1:-1;;;24229:18:23;;;24222:48;24287:19;;9885:100:2;24072:240:23;9885:100:2;9999:12;;10052:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10036:41:2;10143:10;10155:16;;;;;;;;:::i;:::-;10078:120;;-1:-1:-1;;;;;18889:15:23;;;10078:120:2;;;18871:34:23;18941:15;;18921:18;;;18914:43;10173:24:2;;;;18973:18:23;;;18966:34;18806:18;;10078:120:2;;;-1:-1:-1;;10078:120:2;;;;;;;;;;;;;;-1:-1:-1;;;;;10078:120:2;-1:-1:-1;;;10078:120:2;;;10036:163;;;10078:120;10036:163;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9998:201;;;;10215:7;10210:271;;10239:13;;:17;10235:235;;10322:6;10316:13;10367:11;10358:6;10354:2;10350:15;10343:36;10282:112;10426:32;;-1:-1:-1;;;10426:32:2;;35138:2:23;10426:32:2;;;35120:21:23;35177:2;35157:18;;;35150:30;-1:-1:-1;;;35196:18:23;;;35189:52;35258:18;;10426:32:2;35110:172:23;10235:235:2;10493:57;10499:10;10511:15;;10528:1;10537:11;;;;10511:7;10537:11;:::i;:::-;10493:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10493:5:2;;-1:-1:-1;;;10493:57:2:i;:::-;-1:-1:-1;;10570:15:2;;;8940:1653;-1:-1:-1;;;;;;;8940:1653:2:o;2172:105:1:-;1654:29:7;1670:12;:10;:12::i;:::-;1654:15;:29::i;:::-;1632:125;;;;-1:-1:-1;;;1632:125:7;;;;;;;:::i;:::-;2251:18:1;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;2172:105:::0;:::o;4056:490::-;4301:8;:15;4286:4;:11;:30;4264:138;;;;-1:-1:-1;;;4264:138:1;;39276:2:23;4264:138:1;;;39258:21:23;39315:2;39295:18;;;39288:30;39354:34;39334:18;;;39327:62;39425:28;39405:18;;;39398:56;39471:19;;4264:138:1;39248:248:23;4264:138:1;4418:9;4413:126;4437:4;:11;4433:1;:15;4413:126;;;4470:57;4487:5;4494:3;4499:4;4504:1;4499:7;;;;;;-1:-1:-1;;;4499:7:1;;;;;;;;;;;;;;;4508:8;4517:1;4508:11;;;;;;-1:-1:-1;;;4508:11:1;;;;;;;;;;;;;;;4521:5;4470:16;:57::i;:::-;4450:3;;;;:::i;:::-;;;;4413:126;;;;4056:490;;;;;:::o;3435:1184:2:-;1955:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1944:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;1944:7:7;-1:-1:-1;;;;;1944:23:7;;:57;;;;1971:16;:30;1988:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:30:7;;;;;;;;;;;;-1:-1:-1;1971:30:7;;;;1944:57;1921:170;;;;-1:-1:-1;;;1921:170:7;;;;;;;:::i;:::-;3560:15:2::1;::::0;-1:-1:-1;;;;;3560:15:2::1;3608:51:::0;3586:146:::1;;;::::0;-1:-1:-1;;;3586:146:2;;37625:2:23;3586:146:2::1;::::0;::::1;37607:21:23::0;37664:2;37644:18;;;37637:30;37703:34;37683:18;;;37676:62;-1:-1:-1;;;37754:18:23;;;37747:43;37807:19;;3586:146:2::1;37597:235:23::0;3586:146:2::1;3745:41;3802:16;-1:-1:-1::0;;;;;3802:28:2::1;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;3802:30:2::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;3745:87;;3850:9;3845:767;3869:11;:18;3865:1;:22;3845:767;;;3909:10;3922:11;3934:1;3922:14;;;;;;-1:-1:-1::0;;;3922:14:2::1;;;;;;;;;;;;;;;:17;;;3909:30;;3954:13;3970:11;3982:1;3970:14;;;;;;-1:-1:-1::0;;;3970:14:2::1;;;;;;;;;;;;;;;:20;;;3954:36;;4050:1;-1:-1:-1::0;;;;;4033:19:2::1;:5;-1:-1:-1::0;;;;;4033:19:2::1;;;4007:134;;;::::0;-1:-1:-1;;;4007:134:2;;36376:2:23;4007:134:2::1;::::0;::::1;36358:21:23::0;36415:2;36395:18;;;36388:30;36454:34;36434:18;;;36427:62;-1:-1:-1;;;36505:18:23;;;36498:51;36566:19;;4007:134:2::1;36348:243:23::0;4007:134:2::1;4183:37;::::0;-1:-1:-1;;;4183:37:2;;-1:-1:-1;;;;;19768:32:23;;;4183:37:2::1;::::0;::::1;19750:51:23::0;19817:18;;;19810:34;;;4158:22:2::1;::::0;4183:26;;::::1;::::0;::::1;::::0;19723:18:23;;4183:37:2::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4158:62:::0;-1:-1:-1;4241:19:2;4237:68:::1;;4281:8;;;;;4237:68;4321:36;4327:5;4334:2;4338:14;4321:36;;;;;;;;;;;::::0;:5:::1;:36::i;:::-;4459:45:::0;;::::1;::::0;::::1;::::0;4412:24:::1;::::0;-1:-1:-1;;;4412:24:2;;::::1;::::0;::::1;20929:25:23::0;;;-1:-1:-1;;;;;4412:20:2;::::1;::::0;::::1;::::0;20902:18:23;;4412:24:2::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;4412:24:2::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;4396:42;;;;;;:108;4374:227;;4560:24;::::0;-1:-1:-1;;;4560:24:2;;::::1;::::0;::::1;20929:25:23::0;;;4539:46:2::1;::::0;4556:2;;-1:-1:-1;;;;;4560:20:2;::::1;::::0;::::1;::::0;20902:18:23;;4560:24:2::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;4560:24:2::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;4539:16;:46::i;:::-;3845:767;;;;3889:3;::::0;::::1;:::i;:::-;;;3845:767;;;;2102:1:7;;3435:1184:2::0;:::o;6017:235::-;6130:3;1362:38;1382:3;1387:12;:10;:12::i;:::-;1362:19;:38::i;:::-;1340:141;;;;-1:-1:-1;;;1340:141:2;;;;;;;:::i;:::-;2747:4:1;2771:20;;;:15;:20;;;;;;6163:3:2;;2771:20:1;;1048:19:::1;1026:124;;;;-1:-1:-1::0;;;1026:124:1::1;;;;;;;:::i;:::-;6196:3:2::2;1978:57;1995:12;:10;:12::i;:::-;2009:3;2014:20;:3;:18;:20::i;:::-;1978:16;:57::i;:::-;1956:176;;;;-1:-1:-1::0;;;1956:176:2::2;;;;;;;:::i;:::-;6217:27:::3;6234:3;6239:4;6217:16;:27::i;:::-;1161:1:1::2;1492::2::1;6017:235:::0;;;:::o;3872:76:7:-;1955:12;:10;:12::i;:::-;-1:-1:-1;;;;;1944:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;1944:7:7;-1:-1:-1;;;;;1944:23:7;;:57;;;;1971:16;:30;1988:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:30:7;;;;;;;;;;;;-1:-1:-1;1971:30:7;;;;1944:57;1921:170;;;;-1:-1:-1;;;1921:170:7;;;;;;;:::i;:::-;3930:10:::1;:8;:10::i;:::-;3872:76::o:0;4582:561::-;4738:16;4813:3;:10;4794:8;:15;:29;4772:120;;;;-1:-1:-1;;;4772:120:7;;38866:2:23;4772:120:7;;;38848:21:23;38905:2;38885:18;;;38878:30;38944:34;38924:18;;;38917:62;-1:-1:-1;;;38995:18:23;;;38988:39;39044:19;;4772:120:7;38838:231:23;4772:120:7;4905:30;4952:8;:15;-1:-1:-1;;;;;4938:30:7;;;;;-1:-1:-1;;;4938:30:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4938:30:7;;4905:63;;4986:9;4981:122;5005:8;:15;5001:1;:19;4981:122;;;5061:30;5071:8;5080:1;5071:11;;;;;;-1:-1:-1;;;5071:11:7;;;;;;;;;;;;;;;5084:3;5088:1;5084:6;;;;;;-1:-1:-1;;;5084:6:7;;;;;;;;;;;;;;;5061:9;:30::i;:::-;5042:13;5056:1;5042:16;;;;;;-1:-1:-1;;;5042:16:7;;;;;;;;;;;;;;;;;;:49;5022:3;;;:::i;:::-;;;4981:122;;;-1:-1:-1;5122:13:7;4582:561;-1:-1:-1;;;4582:561:7:o;6827:232:2:-;6878:7;6902:21;;;:16;:21;;;;;;-1:-1:-1;;;;;6902:21:2;:35;6898:154;;-1:-1:-1;6961:21:2;;;;:16;:21;;;;;;-1:-1:-1;;;;;6961:21:2;;6827:232::o;6898:154::-;7022:18;:3;:16;:18::i;6898:154::-;6827:232;;;:::o;1661:101:18:-;1252:12;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:18;:7;1101:6;;-1:-1:-1;;;;;1101:6:18;;1029:85;1241:7;-1:-1:-1;;;;;1241:23:18;;1233:68;;;;-1:-1:-1;;;1233:68:18;;34375:2:23;1233:68:18;;;34357:21:23;;;34394:18;;;34387:30;34453:34;34433:18;;;34426:62;34505:18;;1233:68:18;34347:182:23;1233:68:18;1725:30:::1;1752:1;1725:18;:30::i;4627:226:2:-:0;1744:1:20;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:20;;41300:2:23;2317:63:20;;;41282:21:23;41339:2;41319:18;;;41312:30;41378:33;41358:18;;;41351:61;41429:18;;2317:63:20;41272:181:23;2317:63:20;1744:1;2455:7;:18;4796:3:2;1666:37:::1;4796:3:::0;1690:12:::1;:10;:12::i;:::-;1666:18;:37::i;:::-;1644:146;;;::::0;-1:-1:-1;;;1644:146:2;;32285:2:23;1644:146:2::1;::::0;::::1;32267:21:23::0;32324:2;32304:18;;;32297:30;32363:34;32343:18;;;32336:62;32434:29;32414:18;;;32407:57;32481:19;;1644:146:2::1;32257:249:23::0;1644:146:2::1;4812:33:::2;4818:3;4823;4828:9;4839:5;4812;:33::i;:::-;-1:-1:-1::0;;1701:1:20;2628:7;:22;-1:-1:-1;;;4627:226:2:o;3210:120:7:-;2287:12;:10;:12::i;:::-;-1:-1:-1;;;;;2276:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;2276:7:7;-1:-1:-1;;;;;2276:23:7;;:56;;;;2303:15;:29;2319:12;:10;:12::i;:::-;-1:-1:-1;;;;;2303:29:7;;;;;;;;;;;;-1:-1:-1;2303:29:7;;;;2276:56;2253:167;;;;-1:-1:-1;;;2253:167:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3290:25:7::1;;::::0;;;:15:::1;:25;::::0;;;;:32;;-1:-1:-1;;3290:32:7::1;3318:4;3290:32;::::0;;3210:120::o;3792:72::-;1955:12;:10;:12::i;:::-;-1:-1:-1;;;;;1944:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;1944:7:7;-1:-1:-1;;;;;1944:23:7;;:57;;;;1971:16;:30;1988:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:30:7;;;;;;;;;;;;-1:-1:-1;1971:30:7;;;;1944:57;1921:170;;;;-1:-1:-1;;;1921:170:7;;;;;;;:::i;:::-;3848:8:::1;:6;:8::i;5739:217:2:-:0;5843:3;1362:38;1382:3;1387:12;:10;:12::i;1362:38::-;1340:141;;;;-1:-1:-1;;;1340:141:2;;;;;;;:::i;:::-;2747:4:1;2771:20;;;:15;:20;;;;;;5876:3:2;;2771:20:1;;1048:19:::1;1026:124;;;;-1:-1:-1::0;;;1026:124:1::1;;;;;;;:::i;:::-;5909:3:2::2;1978:57;1995:12;:10;:12::i;1978:57::-;1956:176;;;;-1:-1:-1::0;;;1956:176:2::2;;;;;;;:::i;:::-;5930:18:::3;5938:3;5943:4;5930:7;:18::i;7178:108::-:0;7231:7;7258:20;:3;:18;:20::i;6433:282::-;6498:3;1362:38;1382:3;1387:12;:10;:12::i;1362:38::-;1340:141;;;;-1:-1:-1;;;1340:141:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;6536:17:2;::::1;6514:115;;;::::0;-1:-1:-1;;;6514:115:2;;28969:2:23;6514:115:2::1;::::0;::::1;28951:21:23::0;29008:2;28988:18;;;28981:30;29047:34;29027:18;;;29020:62;-1:-1:-1;;;29098:18:23;;;29091:46;29154:19;;6514:115:2::1;28941:238:23::0;6514:115:2::1;6640:21;::::0;;;:16:::1;:21;::::0;;;;;:27;;-1:-1:-1;;;;;;6640:27:2::1;-1:-1:-1::0;;;;;6640:27:2;::::1;::::0;;::::1;::::0;;;6683:24;;6640:27;;:21;;6683:24:::1;::::0;6640:21;6683:24:::1;6433:282:::0;;;:::o;891:20:7:-;;;;;;;:::i;2998:155:2:-;1654:29:7;1670:12;:10;:12::i;1654:29::-;1632:125;;;;-1:-1:-1;;;1632:125:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3115:30:2::1;;::::0;;;:20:::1;:30;::::0;;;;3108:37;;-1:-1:-1;;3108:37:2::1;::::0;;2998:155::o;3410:149:7:-;1955:12;:10;:12::i;:::-;-1:-1:-1;;;;;1944:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;1944:7:7;-1:-1:-1;;;;;1944:23:7;;:57;;;;1971:16;:30;1988:12;:10;:12::i;:::-;-1:-1:-1;;;;;1971:30:7;;;;;;;;;;;;-1:-1:-1;1971:30:7;;;;1944:57;1921:170;;;;-1:-1:-1;;;1921:170:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3525:26:7::1;;::::0;;;:16:::1;:26;::::0;;;;3518:33;;-1:-1:-1;;3518:33:7::1;::::0;;3410:149::o;3075:153:6:-;3169:52;3188:12;:10;:12::i;:::-;3202:8;3212;3169:18;:52::i;2784:129:2:-;1654:29:7;1670:12;:10;:12::i;1654:29::-;1632:125;;;;-1:-1:-1;;;1632:125:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;2868:30:2::1;;::::0;;;:20:::1;:30;::::0;;;;:37;;-1:-1:-1;;2868:37:2::1;2901:4;2868:37;::::0;;2784:129::o;4861:471::-;1744:1:20;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:20;;41300:2:23;2317:63:20;;;41282:21:23;41339:2;41319:18;;;41312:30;41378:33;41358:18;;;41351:61;41429:18;;2317:63:20;41272:181:23;2317:63:20;1744:1;2455:7;:18;5054:9:2::1;5049:224;5073:4;:11;5069:1;:15;5049:224;;;5132:41;5151:4;5156:1;5151:7;;;;;;-1:-1:-1::0;;;5151:7:2::1;;;;;;;;;;;;;;;5160:12;:10;:12::i;5132:41::-;5106:155;;;::::0;-1:-1:-1;;;5106:155:2;;36798:2:23;5106:155:2::1;::::0;::::1;36780:21:23::0;36837:2;36817:18;;;36810:30;36876:34;36856:18;;;36849:62;-1:-1:-1;;;36927:18:23;;;36920:50;36987:19;;5106:155:2::1;36770:242:23::0;5106:155:2::1;5086:3:::0;::::1;::::0;::::1;:::i;:::-;;;;5049:224;;;;5283:41;5294:3;5299:4;5305:11;5318:5;5283:10;:41::i;:::-;-1:-1:-1::0;;1701:1:20;2628:7;:22;-1:-1:-1;;4861:471:2:o;2577:125::-;1654:29:7;1670:12;:10;:12::i;1654:29::-;1632:125;;;;-1:-1:-1;;;1632:125:7;;;;;;;:::i;:::-;2663:20:2::1;:31:::0;;-1:-1:-1;;;;;;2663:31:2::1;-1:-1:-1::0;;;;;2663:31:2;;;::::1;::::0;;;::::1;::::0;;2577:125::o;5556:371:7:-;5683:15;5785:34;5801:6;5809:9;5785:15;:34::i;:::-;5781:78;;;-1:-1:-1;5843:4:7;5836:11;;5781:78;-1:-1:-1;;;;;3417:27:6;;;3394:4;3417:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;5878:41:7;5871:48;5556:371;-1:-1:-1;;;5556:371:7:o;3638:146::-;2287:12;:10;:12::i;:::-;-1:-1:-1;;;;;2276:23:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;2276:7:7;-1:-1:-1;;;;;2276:23:7;;:56;;;;2303:15;:29;2319:12;:10;:12::i;:::-;-1:-1:-1;;;;;2303:29:7;;;;;;;;;;;;-1:-1:-1;2303:29:7;;;;2276:56;2253:167;;;;-1:-1:-1;;;2253:167:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;3751:25:7::1;;::::0;;;:15:::1;:25;::::0;;;;3744:32;;-1:-1:-1;;3744:32:7::1;::::0;;3638:146::o;3415:633:1:-;3598:21;3622:27;3638:5;3645:3;3622:15;:27::i;:::-;3598:51;;3680:7;3664:13;:23;3660:381;;;3762:46;3767:3;3772;3777:23;3787:13;3777:7;:23;:::i;:::-;3802:5;3762:4;:46::i;:::-;3827:17;;3823:119;;3865:61;3888:5;3895:3;3900;3905:13;3920:5;3865:22;:61::i;:::-;3660:381;;;3974:55;3997:5;4004:3;4009;4014:7;4023:5;3974:22;:55::i;1911:198:18:-;1252:12;:10;:12::i;:::-;-1:-1:-1;;;;;1241:23:18;:7;1101:6;;-1:-1:-1;;;;;1101:6:18;;1029:85;1241:7;-1:-1:-1;;;;;1241:23:18;;1233:68;;;;-1:-1:-1;;;1233:68:18;;34375:2:23;1233:68:18;;;34357:21:23;;;34394:18;;;34387:30;34453:34;34433:18;;;34426:62;34505:18;;1233:68:18;34347:182:23;1233:68:18;-1:-1:-1;;;;;1999:22:18;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:18;;26115:2:23;1991:73:18::1;::::0;::::1;26097:21:23::0;26154:2;26134:18;;;26127:30;26193:34;26173:18;;;26166:62;-1:-1:-1;;;26244:18:23;;;26237:36;26290:19;;1991:73:18::1;26087:228:23::0;1991:73:18::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;4900:207:1:-;5032:5;5039:3;5044:9;748:39;765:5;772:3;777:9;748:16;:39::i;:::-;726:156;;;;-1:-1:-1;;;726:156:1;;35489:2:23;726:156:1;;;35471:21:23;35528:2;35508:18;;;35501:30;35567:34;35547:18;;;35540:62;35638:34;35618:18;;;35611:62;-1:-1:-1;;;35689:19:23;;;35682:34;35733:19;;726:156:1;35461:297:23;726:156:1;5066:33:::1;5077:5;5084:3;5089:9;5066:10;:33::i;5187:442::-:0;5340:9;5335:235;5359:4;:11;5355:1;:15;5335:235;;;5418:48;5435:5;5442:4;5447:1;5442:7;;;;;;-1:-1:-1;;;5442:7:1;;;;;;;;;;;;;;;5451:11;5463:1;5451:14;;;;;;-1:-1:-1;;;5451:14:1;;;;;;;;;;;;;;;5418:16;:48::i;:::-;5392:166;;;;-1:-1:-1;;;5392:166:1;;41660:2:23;5392:166:1;;;41642:21:23;41699:2;41679:18;;;41672:30;41738:34;41718:18;;;41711:62;41809:26;41789:18;;;41782:54;41853:19;;5392:166:1;41632:246:23;5392:166:1;5372:3;;;;:::i;:::-;;;;5335:235;;;;5580:41;5596:5;5603:4;5609:11;5580:15;:41::i;:::-;5187:442;;;:::o;361:25::-;;;;;;;:::i;99:618:4:-;143:22;182:10;204:4;182:27;178:508;;;226:18;247:8;;226:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;286:8:4;497:17;491:24;-1:-1:-1;;;;;465:134:4;;-1:-1:-1;325:289:4;;-1:-1:-1;325:289:4;;-1:-1:-1;663:10:4;178:508;99:618;:::o;16000:376:7:-;16152:20;;16125:4;;-1:-1:-1;;;;;16152:20:7;1465:19:0;16147:79:7;;-1:-1:-1;16209:5:7;16202:12;;16147:79;16280:20;;16327:28;;-1:-1:-1;;;16327:28:7;;-1:-1:-1;;;;;17011:32:23;;;16327:28:7;;;16993:51:23;16280:20:7;;;;16319:49;;;16280:20;;16327:21;;16966:18:23;;16327:28:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16319:49:7;;;16000:376;-1:-1:-1;;;;16000:376:7:o;1175:320:0:-;-1:-1:-1;;;;;1465:19:0;;:23;;;1175:320::o;4099:317:7:-;4230:7;-1:-1:-1;;;;;4277:21:7;;4255:114;;;;-1:-1:-1;;;4255:114:7;;25703:2:23;4255:114:7;;;25685:21:23;25742:2;25722:18;;;25715:30;25781:34;25761:18;;;25754:62;-1:-1:-1;;;25832:18:23;;;25825:41;25883:19;;4255:114:7;25675:233:23;4255:114:7;-1:-1:-1;4387:12:7;;;;:8;:12;;;;;;;;-1:-1:-1;;;;;4387:21:7;;;;;;;;;;;;4099:317::o;7655:264:2:-;7781:4;7803:16;7822:12;7830:3;7822:7;:12::i;:::-;7803:31;;7864:8;-1:-1:-1;;;;;7852:20:2;:8;-1:-1:-1;;;;;7852:20:2;;:59;;;;7876:35;7892:8;7902;7876:15;:35::i;7467:180::-;7574:7;5403:12:7;;;:7;:12;;;;;;7606:14:2;7616:3;7606:9;:14::i;:::-;:33;;;;:::i;19264:120:7:-;19318:14;19352:24;:22;:24::i;:::-;19345:31;;19264:120;:::o;2625:486:17:-;2803:4;-1:-1:-1;;;;;2828:20:17;;2820:70;;;;-1:-1:-1;;;2820:70:17;;31534:2:23;2820:70:17;;;31516:21:23;31573:2;31553:18;;;31546:30;31612:34;31592:18;;;31585:62;-1:-1:-1;;;31663:18:23;;;31656:35;31708:19;;2820:70:17;31506:227:23;2820:70:17;2944:159;2972:47;2991:27;3011:6;2991:19;:27::i;:::-;2972:18;:47::i;:::-;2944:159;;;;;;;;;;;;22210:25:23;;;;22283:4;22271:17;;22251:18;;;22244:45;22305:18;;;22298:34;;;22348:18;;;22341:34;;;22182:19;;2944:159:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2921:182:17;:6;-1:-1:-1;;;;;2921:182:17;;2901:202;;2625:486;;;;;;;:::o;10601:497:2:-;10783:4;-1:-1:-1;;;;;10808:20:2;;10800:81;;;;-1:-1:-1;;;10800:81:2;;38039:2:23;10800:81:2;;;38021:21:23;38078:2;38058:18;;;38051:30;38117:34;38097:18;;;38090:62;-1:-1:-1;;;38168:18:23;;;38161:46;38224:19;;10800:81:2;38011:238:23;10800:81:2;10935:155;10963:43;10982:23;10997:7;10982:14;:23::i;8174:237::-;8283:4;8305:16;8324:12;8332:3;8324:7;:12::i;:::-;8305:31;;8366:8;-1:-1:-1;;;;;8354:20:2;:8;-1:-1:-1;;;;;8354:20:2;;:49;;;-1:-1:-1;;;;;;;;8378:25:2;;;;;:15;:25;;;;;;;;;8174:237;-1:-1:-1;8174:237:2:o;5637:285:1:-;5789:39;5801:3;5806;5811:9;5822:5;5789:11;:39::i;:::-;5858:1;5843:5;:12;:16;5839:76;;;5876:27;5884:3;5896:5;5876:7;:27::i;2779:155:7:-;2845:4;2880:8;-1:-1:-1;;;;;2869:19:7;:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;2869:7:7;-1:-1:-1;;;;;2869:19:7;;:57;;;;2892:34;2908:7;1101:6:18;;-1:-1:-1;;;;;1101:6:18;;1029:85;2908:7:7;2917:8;2892:15;:34::i;7054:341:1:-;7207:1;7192:4;7186:18;:22;7164:117;;;;-1:-1:-1;;;7164:117:1;;31120:2:23;7164:117:1;;;31102:21:23;31159:2;31139:18;;;31132:30;31198:34;31178:18;;;31171:62;-1:-1:-1;;;31249:18:23;;;31242:43;31302:19;;7164:117:1;31092:235:23;7164:117:1;7292:20;;;;:15;:20;;;;;:27;;-1:-1:-1;;7292:27:1;7315:4;7292:27;;;7330:18;7308:3;7343:4;7330:7;:18::i;:::-;7383:3;7364:23;7377:4;7364:23;;;;;;:::i;:::-;;;;;;;;7054:341;;:::o;7927:239:2:-;8037:4;8059:16;8078:12;8086:3;8078:7;:12::i;:::-;8059:31;;8120:8;-1:-1:-1;;;;;8108:20:2;:8;-1:-1:-1;;;;;8108:20:2;;:50;;;-1:-1:-1;;;;;;;;8132:26:2;;;;;:16;:26;;;;;;;;;7927:239;-1:-1:-1;7927:239:2:o;749:112:22:-;809:7;617:31;647:1;618:25;617:31;:::i;:::-;836:17;;;;749:112;-1:-1:-1;749:112:22:o;1695:196:1:-;1825:4;1874:9;1849:21;1859:5;1866:3;1849:9;:21::i;:::-;:34;;;1695:196;-1:-1:-1;;;;1695:196:1:o;2103:117:19:-;1161:7;;-1:-1:-1;;;1161:7:19;;;;1662:41;;;;-1:-1:-1;;;1662:41:19;;24948:2:23;1662:41:19;;;24930:21:23;24987:2;24967:18;;;24960:30;-1:-1:-1;;;25006:18:23;;;24999:50;25066:18;;1662:41:19;24920:170:23;1662:41:19;2161:7:::1;:15:::0;;-1:-1:-1;;;;2161:15:19::1;::::0;;2191:22:::1;2200:12;:10;:12::i;:::-;2191:22;::::0;-1:-1:-1;;;;;17011:32:23;;;16993:51;;16981:2;16966:18;2191:22:19::1;;;;;;;2103:117::o:0;984:144:22:-;1042:7;1093:24;575:2;537;1093:24;:::i;:::-;1085:33;;;;;;;984:144;-1:-1:-1;984:144:22:o;2263:187:18:-;2355:6;;;-1:-1:-1;;;;;2371:17:18;;;-1:-1:-1;;;;;;2371:17:18;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2263:187;;:::o;1856:115:19:-;1161:7;;-1:-1:-1;;;1161:7:19;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:19;;;;;;;:::i;:::-;1915:7:::1;:14:::0;;-1:-1:-1;;;;1915:14:19::1;-1:-1:-1::0;;;1915:14:19::1;::::0;;1944:20:::1;1951:12;:10;:12::i;6917:129:1:-:0;6987:14;;;;:9;:14;;;;;;;;:21;;;;;;;;:::i;:::-;;7034:3;7024:14;7028:4;7024:14;;;;;;:::i;12702:323:6:-;12852:8;-1:-1:-1;;;;;12843:17:6;:5;-1:-1:-1;;;;;12843:17:6;;;12835:71;;;;-1:-1:-1;;;12835:71:6;;38456:2:23;12835:71:6;;;38438:21:23;38495:2;38475:18;;;38468:30;38534:34;38514:18;;;38507:62;-1:-1:-1;;;38585:18:23;;;38578:39;38634:19;;12835:71:6;38428:231:23;12835:71:6;-1:-1:-1;;;;;12916:25:6;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12916:46:6;;;;;;;;;;12977:41;;20731::23;;;12977::6;;20704:18:23;12977:41:6;;;;;;;12702:323;;;:::o;6502:407:1:-;6688:47;6705:3;6710:4;6716:11;6729:5;6688:16;:47::i;:::-;6765:1;6750:5;:12;:16;6746:156;;;6788:9;6783:108;6807:4;:11;6803:1;:15;6783:108;;;6844:31;6852:4;6857:1;6852:7;;;;;;-1:-1:-1;;;6852:7:1;;;;;;;;;;;;;;;6868:5;6844:7;:31::i;:::-;6820:3;;;;:::i;:::-;;;;6783:108;;8485:285:2;-1:-1:-1;;;;;8637:30:2;;8611:4;8637:30;;;:20;:30;;;;;;;;8633:74;;;-1:-1:-1;8691:4:2;8684:11;;8633:74;8724:38;8746:5;8753:8;8724:21;:38::i;5999:943:7:-;1161:7:19;;-1:-1:-1;;;1161:7:19;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:19;;;;;;;:::i;:::-;6201:4:7::1;2622:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;2613:21:7::1;:5;-1:-1:-1::0;;;;;2613:21:7::1;;:62;;;;2638:37;2655:5;2662:12;:10;:12::i;2638:37::-;2591:160;;;;-1:-1:-1::0;;;2591:160:7::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;6226:16:7;::::2;6218:66;;;::::0;-1:-1:-1;;;6218:66:7;;32713:2:23;6218:66:7::2;::::0;::::2;32695:21:23::0;32752:2;32732:18;;;32725:30;32791:34;32771:18;;;32764:62;-1:-1:-1;;;32842:18:23;;;32835:35;32887:19;;6218:66:7::2;32685:227:23::0;6218:66:7::2;6297:16;6316:12;:10;:12::i;:::-;6297:31;;6341:183;6376:8;6399:4;6418:2;6435:20;6452:2;6435:16;:20::i;:::-;6470:24;6487:6;6470:16;:24::i;6341:183::-;6537:19;6559:12:::0;;;:8:::2;:12;::::0;;;;;;;-1:-1:-1;;;;;6559:18:7;::::2;::::0;;;;;;;;6610:21;;::::2;;6588:113;;;::::0;-1:-1:-1;;;6588:113:7;;33964:2:23;6588:113:7::2;::::0;::::2;33946:21:23::0;34003:2;33983:18;;;33976:30;34042:34;34022:18;;;34015:62;-1:-1:-1;;;34093:18:23;;;34086:40;34143:19;;6588:113:7::2;33936:232:23::0;6588:113:7::2;6733:20;6747:6:::0;6733:11;:20:::2;:::i;:::-;6712:12;::::0;;;:8:::2;:12;::::0;;;;;;;-1:-1:-1;;;;;6712:18:7;;::::2;::::0;;;;;;;:41;;;;6764:16;::::2;::::0;;;;;:26;;6784:6;;6712:12;6764:26:::2;::::0;6784:6;;6764:26:::2;:::i;:::-;::::0;;;-1:-1:-1;;6808:46:7::2;::::0;;42654:25:23;;;42710:2;42695:18;;42688:34;;;-1:-1:-1;;;;;6808:46:7;;::::2;::::0;;;::::2;::::0;;;::::2;::::0;::::2;::::0;42627:18:23;6808:46:7::2;;;;;;;6867:67;6897:8;6907:4;6913:2;6917;6921:6;6929:4;6867:29;:67::i;:::-;2762:1;;1444::19::1;5999:943:7::0;;;;;:::o;9801:177::-;9924:5;2622:12;:10;:12::i;:::-;-1:-1:-1;;;;;2613:21:7;:5;-1:-1:-1;;;;;2613:21:7;;:62;;;;2638:37;2655:5;2662:12;:10;:12::i;2638:37::-;2591:160;;;;-1:-1:-1;;;2591:160:7;;;;;;;:::i;:::-;9942:28:::1;9948:5;9955:3;9960:9;9942:5;:28::i;10228:211::-:0;10377:5;2622:12;:10;:12::i;:::-;-1:-1:-1;;;;;2613:21:7;:5;-1:-1:-1;;;;;2613:21:7;;:62;;;;2638:37;2655:5;2662:12;:10;:12::i;2638:37::-;2591:160;;;;-1:-1:-1;;;2591:160:7;;;;;;;:::i;:::-;10395:36:::1;10406:5;10413:4;10419:11;10395:10;:36::i;2092:410:17:-:0;2202:7;229:108;;;;;;;;;;;;;;;;;205:143;;;;;;;2356:12;;2391:11;;;;2435:24;;;;;2425:35;;;;;;2275:204;;;;;21196:25:23;;;21252:2;21237:18;;21230:34;;;;-1:-1:-1;;;;;21300:32:23;21295:2;21280:18;;21273:60;21364:2;21349:18;;21342:34;21183:3;21168:19;;21150:232;2275:204:17;;;;;;;;;;;;;2247:247;;;;;;2227:267;;2092:410;;;:::o;1914:258:5:-;2013:7;2115:20;1353:15;;;1275:101;2115:20;2086:63;;-1:-1:-1;;;2086:63:5;;;16708:27:23;16751:11;;;16744:27;;;;16787:12;;;16780:28;;;16824:12;;2086:63:5;16698:144:23;11110:488:2;11213:7;882:132;;;;;;;;;;;;;;;;;862:159;;;;;;;;11362:15;;;11416:11;;;;11362:7;11416:11;:::i;:::-;11400:29;;;;;;;:::i;:::-;;;;;;;;11452:7;:18;;;;;;;;;;:::i;:::-;11493:24;;;;11540:16;;;;;;;;:::i;:::-;11286:289;;;;;;21674:25:23;;;;21715:18;;21708:34;;;;21758:18;;;21751:34;;;;-1:-1:-1;;;;;21859:15:23;;;21839:18;;;21832:43;21891:19;;;21884:35;;;;21956:15;21935:19;;;21928:44;21646:19;;11286:289:2;21628:350:23;10857:982:7;1161:7:19;;-1:-1:-1;;;1161:7:19;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:19;;;;;;;:::i;:::-;11029:16:7::1;11048:12;:10;:12::i;:::-;11029:31;;11073:193;11108:8;11139:1;11156:3;11174:21;11191:3;11174:16;:21::i;:::-;11210:25;11227:7;11210:16;:25::i;11073:193::-;11279:25;11291:3;11296:7;11279:11;:25::i;:::-;11341:13;::::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;11341:18:7;::::1;::::0;;;;;;;:29;;11363:7;;11341:13;:29:::1;::::0;11363:7;;11341:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;11381:12:7::1;::::0;;;:7:::1;:12;::::0;;;;:23;;11397:7;;11381:12;:23:::1;::::0;11397:7;;11381:23:::1;:::i;:::-;::::0;;;-1:-1:-1;11473:14:7::1;::::0;-1:-1:-1;11490:12:7::1;11498:3:::0;11490:7:::1;:12::i;:::-;11473:29;;11576:3;-1:-1:-1::0;;;;;11543:51:7::1;11568:6;-1:-1:-1::0;;;;;11543:51:7::1;11558:8;-1:-1:-1::0;;;;;11543:51:7::1;;11581:3;11586:7;11543:51;;;;;;42654:25:23::0;;;42710:2;42695:18;;42688:34;42642:2;42627:18;;42609:119;11543:51:7::1;;;;;;;;11669:162;11713:8;11736:6;11757:3;11775;11793:7;11815:5;11669:29;:162::i;11955:1461::-:0;1161:7:19;;-1:-1:-1;;;1161:7:19;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:19;;;;;;;:::i;:::-;12180:8:7::1;:15;12165:4;:11;:30;12143:128;;;::::0;-1:-1:-1;;;12143:128:7;;33547:2:23;12143:128:7::1;::::0;::::1;33529:21:23::0;33586:2;33566:18;;;33559:30;33625:34;33605:18;;;33598:62;-1:-1:-1;;;33676:18:23;;;33669:46;33732:19;;12143:128:7::1;33519:238:23::0;12143:128:7::1;12339:11:::0;;12323:13:::1;12437:16;12339:4:::0;12323:13;12445:7;::::1;;-1:-1:-1::0;;;12445:7:7::1;;;;;;;;;;;;;;;12437;:16::i;:::-;12420:33;;12466:16;12485:12;:10;:12::i;:::-;12466:31;;12632:9;12627:434;12651:5;12647:1;:9;12627:434;;;12717:10;12730:4;12735:1;12730:7;;;;;;-1:-1:-1::0;;;12730:7:7::1;;;;;;;;;;;;;;;12717:20;;12752:14;12769:8;12778:1;12769:11;;;;;;-1:-1:-1::0;;;12769:11:7::1;;;;;;;;;;;;;;;12752:28;;12795:23;12807:2;12811:6;12795:11;:23::i;:::-;12874:6;-1:-1:-1::0;;;;;12859:21:7::1;:11;12867:2;12859:7;:11::i;:::-;-1:-1:-1::0;;;;;12859:21:7::1;;12833:138;;;::::0;-1:-1:-1;;;12833:138:7;;29803:2:23;12833:138:7::1;::::0;::::1;29785:21:23::0;29842:2;29822:18;;;29815:30;29881:34;29861:18;;;29854:62;29952:25;29932:18;;;29925:53;29995:19;;12833:138:7::1;29775:245:23::0;12833:138:7::1;12986:12;::::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;12986:17:7;::::1;::::0;;;;;;;:27;;13007:6;;12986:12;:27:::1;::::0;13007:6;;12986:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;13028:11:7::1;::::0;;;:7:::1;:11;::::0;;;;:21;;13043:6;;13028:11;:21:::1;::::0;13043:6;;13028:21:::1;:::i;:::-;;;;;;;;12627:434;;12658:3;;;;;:::i;:::-;;;;12627:434;;;;13144:3;-1:-1:-1::0;;;;;13112:52:7::1;13136:6;-1:-1:-1::0;;;;;13112:52:7::1;13126:8;-1:-1:-1::0;;;;;13112:52:7::1;;13149:4;13155:8;13112:52;;;;;;;:::i;:::-;;;;;;;;13239:169;13288:8;13311:6;13332:3;13350:4;13369:8;13392:5;13239:34;:169::i;:::-;1444:1:19;;;11955:1461:7::0;;;;:::o;18890:229::-;19041:16;;;19055:1;19041:16;;;;;;;;;18982;;19016:22;;19041:16;;;;;;;;;;;;-1:-1:-1;19041:16:7;19016:41;;19079:7;19068:5;19074:1;19068:8;;;;;;-1:-1:-1;;;19068:8:7;;;;;;;;;;;;;;;;;;:18;19106:5;18890:229;-1:-1:-1;;18890:229:7:o;16567:941::-;-1:-1:-1;;;;;16781:13:7;;1465:19:0;:23;16777:724:7;;16834:196;;-1:-1:-1;;;16834:196:7;;-1:-1:-1;;;;;16834:38:7;;;;;:196;;16895:8;;16926:4;;16953:2;;16978:6;;17007:4;;16834:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16834:196:7;;;;;;;;-1:-1:-1;;16834:196:7;;;;;;;;;;;;:::i;:::-;;;16813:677;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;17363:6;17356:14;;-1:-1:-1;;;17356:14:7;;;;;;;;:::i;16813:677::-;;;17412:62;;-1:-1:-1;;;17412:62:7;;23270:2:23;17412:62:7;;;23252:21:23;23309:2;23289:18;;;23282:30;23348:34;23328:18;;;23321:62;-1:-1:-1;;;23399:18:23;;;23392:50;23459:19;;17412:62:7;23242:242:23;16813:677:7;-1:-1:-1;;;;;;17115:59:7;;-1:-1:-1;;;17115:59:7;17089:198;;17217:50;;-1:-1:-1;;;17217:50:7;;;;;;;:::i;13675:880::-;1161:7:19;;-1:-1:-1;;;1161:7:19;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:19;;;;;;;:::i;:::-;-1:-1:-1;;;;;13820:21:7;::::1;13812:71;;;::::0;-1:-1:-1;;;13812:71:7;;25297:2:23;13812:71:7::1;::::0;::::1;25279:21:23::0;25336:2;25316:18;;;25309:30;25375:34;25355:18;;;25348:62;-1:-1:-1;;;25426:18:23;;;25419:35;25471:19;;13812:71:7::1;25269:227:23::0;13812:71:7::1;13911:1;13902:6;:10;13894:58;;;::::0;-1:-1:-1;;;13894:58:7;;39703:2:23;13894:58:7::1;::::0;::::1;39685:21:23::0;39742:2;39722:18;;;39715:30;39781:34;39761:18;;;39754:62;-1:-1:-1;;;39832:18:23;;;39825:33;39875:19;;13894:58:7::1;39675:225:23::0;13894:58:7::1;13965:16;13984:12;:10;:12::i;:::-;13965:31;;14009:192;14044:8;14067:7;14097:1;14114:20;14131:2;14114:16;:20::i;:::-;14149:24;14166:6;14149:16;:24::i;:::-;-1:-1:-1::0;;14009:192:7::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;14009:192:7;;-1:-1:-1;;;4056:490:1;14009:192:7::1;14214:22;14239:12:::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;14239:21:7;::::1;::::0;;;;;;;;14293:24;;::::1;;14271:111;;;::::0;-1:-1:-1;;;14271:111:7;;37219:2:23;14271:111:7::1;::::0;::::1;37201:21:23::0;37258:2;37238:18;;;37231:30;37297:34;37277:18;;;37270:62;-1:-1:-1;;;37348:18:23;;;37341:35;37393:19;;14271:111:7::1;37191:227:23::0;14271:111:7::1;14417:23;14434:6:::0;14417:14;:23:::1;:::i;:::-;14393:12;::::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;14393:21:7;::::1;::::0;;;;;;;:47;;;;14451:11;;;:7:::1;:11:::0;;;;;:21;;14466:6;;14393:12;14451:21:::1;::::0;14466:6;;14451:21:::1;:::i;:::-;::::0;;;-1:-1:-1;;14490:57:7::1;::::0;;42654:25:23;;;42710:2;42695:18;;42688:34;;;14532:1:7::1;::::0;-1:-1:-1;;;;;14490:57:7;;::::1;::::0;;;::::1;::::0;::::1;::::0;42627:18:23;14490:57:7::1;;;;;;;1444:1:19;;13675:880:7::0;;;:::o;14758:1007::-;1161:7:19;;-1:-1:-1;;;1161:7:19;;;;1404:9;1396:38;;;;-1:-1:-1;;;1396:38:19;;;;;;;:::i;:::-;-1:-1:-1;;;;;14928:21:7;::::1;14920:65;;;::::0;-1:-1:-1;;;14920:65:7;;40107:2:23;14920:65:7::1;::::0;::::1;40089:21:23::0;40146:2;40126:18;;;40119:30;40185:33;40165:18;;;40158:61;40236:18;;14920:65:7::1;40079:181:23::0;14920:65:7::1;15032:7;:14;15018:3;:10;:28;14996:114;;;::::0;-1:-1:-1;;;14996:114:7;;27303:2:23;14996:114:7::1;::::0;::::1;27285:21:23::0;27342:2;27322:18;;;27315:30;27381:34;27361:18;;;27354:62;-1:-1:-1;;;27432:18:23;;;27425:34;27476:19;;14996:114:7::1;27275:226:23::0;14996:114:7::1;15123:16;15142:12;:10;:12::i;:::-;15167:69;::::0;;::::1;::::0;::::1;::::0;;;15215:1:::1;15167:69:::0;;15123:31;-1:-1:-1;15254:9:7::1;15249:433;15273:3;:10;15269:1;:14;15249:433;;;15305:10;15318:3;15322:1;15318:6;;;;;;-1:-1:-1::0;;;15318:6:7::1;;;;;;;;;;;;;;;15305:19;;15339:14;15356:7;15364:1;15356:10;;;;;;-1:-1:-1::0;;;15356:10:7::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;15383:22:::1;15408:12:::0;;;:8:::1;:12:::0;;;;;;-1:-1:-1;;;;;15408:21:7;::::1;::::0;;;;;;;;;;15356:10;;-1:-1:-1;15470:24:7;;::::1;;15444:128;;;::::0;-1:-1:-1;;;15444:128:7;;40467:2:23;15444:128:7::1;::::0;::::1;40449:21:23::0;40506:2;40486:18;;;40479:30;40545:34;40525:18;;;40518:62;-1:-1:-1;;;40596:18:23;;;40589:40;40646:19;;15444:128:7::1;40439:232:23::0;15444:128:7::1;15611:23;15628:6:::0;15611:14;:23:::1;:::i;:::-;15587:12;::::0;;;:8:::1;:12;::::0;;;;;;;-1:-1:-1;;;;;15587:21:7;::::1;::::0;;;;;;;:47;;;;15649:11;;;:7:::1;:11:::0;;;;;:21;;15664:6;;15587:12;15649:21:::1;::::0;15664:6;;15649:21:::1;:::i;:::-;;;;;;;;15249:433;;;15285:3;;;;;:::i;:::-;;;;15249:433;;;;15740:1;-1:-1:-1::0;;;;;15699:58:7::1;15723:7;-1:-1:-1::0;;;;;15699:58:7::1;15713:8;-1:-1:-1::0;;;;;15699:58:7::1;;15744:3;15749:7;15699:58;;;;;;;:::i;:::-;;;;;;;;1444:1:19;14758:1007:7::0;;;:::o;4554:271:1:-;4708:21;4725:3;4708:16;:21::i;:::-;4695:9;:34;;4673:144;;;;-1:-1:-1;;;4673:144:1;;24519:2:23;4673:144:1;;;24501:21:23;24558:2;24538:18;;;24531:30;24597:34;24577:18;;;24570:62;24668:30;24648:18;;;24641:58;24716:19;;4673:144:1;24491:250:23;7344:115:2;7406:7;7433:18;:3;:16;:18::i;17699:1000:7:-;-1:-1:-1;;;;;17939:13:7;;1465:19:0;:23;17935:757:7;;17992:203;;-1:-1:-1;;;17992:203:7;;-1:-1:-1;;;;;17992:43:7;;;;;:203;;18058:8;;18089:4;;18116:3;;18142:7;;18172:4;;17992:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17992:203:7;;;;;;;;-1:-1:-1;;17992:203:7;;;;;;;;;;;;:::i;:::-;;;17971:710;;;;:::i;:::-;-1:-1:-1;;;;;;18280:85:7;;-1:-1:-1;;;18280:85:7;18254:224;;18408:50;;-1:-1:-1;;;18408:50:7;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:755:23;68:5;121:3;114:4;106:6;102:17;98:27;88:2;;143:5;136;129:20;88:2;183:6;170:20;209:4;232:43;272:2;232:43;:::i;:::-;304:2;298:9;316:31;344:2;336:6;316:31;:::i;:::-;382:18;;;416:15;;;;-1:-1:-1;451:15:23;;;501:1;497:10;;;485:23;;481:32;;478:41;-1:-1:-1;475:2:23;;;536:5;529;522:20;475:2;562:5;576:163;590:2;587:1;584:9;576:163;;;647:17;;635:30;;685:12;;;;717;;;;608:1;601:9;576:163;;;-1:-1:-1;757:6:23;;78:691;-1:-1:-1;;;;;;;78:691:23:o;774:528::-;816:5;869:3;862:4;854:6;850:17;846:27;836:2;;891:5;884;877:20;836:2;931:6;918:20;957:31;985:2;957:31;:::i;:::-;1017:2;1011:9;1029:31;1057:2;1049:6;1029:31;:::i;:::-;1084:2;1076:6;1069:18;1130:3;1123:4;1118:2;1110:6;1106:15;1102:26;1099:35;1096:2;;;1151:5;1144;1137:20;1096:2;1219;1212:4;1204:6;1200:17;1193:4;1185:6;1181:17;1168:54;1242:15;;;1259:4;1238:26;1231:41;;;;1246:6;826:476;-1:-1:-1;;;826:476:23:o;1307:156::-;1373:20;;1433:4;1422:16;;1412:27;;1402:2;;1453:1;1450;1443:12;1468:257;1527:6;1580:2;1568:9;1559:7;1555:23;1551:32;1548:2;;;1601:6;1593;1586:22;1548:2;1645:9;1632:23;1664:31;1689:5;1664:31;:::i;1730:398::-;1798:6;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:2;;;1880:6;1872;1865:22;1827:2;1924:9;1911:23;1943:31;1968:5;1943:31;:::i;:::-;1993:5;-1:-1:-1;2050:2:23;2035:18;;2022:32;2063:33;2022:32;2063:33;:::i;:::-;2115:7;2105:17;;;1817:311;;;;;:::o;2133:1111::-;2287:6;2295;2303;2311;2319;2372:3;2360:9;2351:7;2347:23;2343:33;2340:2;;;2394:6;2386;2379:22;2340:2;2438:9;2425:23;2457:31;2482:5;2457:31;:::i;:::-;2507:5;-1:-1:-1;2564:2:23;2549:18;;2536:32;2577:33;2536:32;2577:33;:::i;:::-;2629:7;-1:-1:-1;2687:2:23;2672:18;;2659:32;-1:-1:-1;;;;;2740:14:23;;;2737:2;;;2772:6;2764;2757:22;2737:2;2800:61;2853:7;2844:6;2833:9;2829:22;2800:61;:::i;:::-;2790:71;;2914:2;2903:9;2899:18;2886:32;2870:48;;2943:2;2933:8;2930:16;2927:2;;;2964:6;2956;2949:22;2927:2;2992:63;3047:7;3036:8;3025:9;3021:24;2992:63;:::i;:::-;2982:73;;3108:3;3097:9;3093:19;3080:33;3064:49;;3138:2;3128:8;3125:16;3122:2;;;3159:6;3151;3144:22;3122:2;;3187:51;3230:7;3219:8;3208:9;3204:24;3187:51;:::i;:::-;3177:61;;;2330:914;;;;;;;;:::o;3249:754::-;3353:6;3361;3369;3377;3385;3438:3;3426:9;3417:7;3413:23;3409:33;3406:2;;;3460:6;3452;3445:22;3406:2;3504:9;3491:23;3523:31;3548:5;3523:31;:::i;:::-;3573:5;-1:-1:-1;3630:2:23;3615:18;;3602:32;3643:33;3602:32;3643:33;:::i;:::-;3695:7;-1:-1:-1;3749:2:23;3734:18;;3721:32;;-1:-1:-1;3800:2:23;3785:18;;3772:32;;-1:-1:-1;3855:3:23;3840:19;;3827:33;-1:-1:-1;;;;;3872:30:23;;3869:2;;;3920:6;3912;3905:22;3869:2;3948:49;3989:7;3980:6;3969:9;3965:22;3948:49;:::i;4008:760::-;4135:6;4143;4151;4204:2;4192:9;4183:7;4179:23;4175:32;4172:2;;;4225:6;4217;4210:22;4172:2;4269:9;4256:23;4288:31;4313:5;4288:31;:::i;:::-;4338:5;-1:-1:-1;4394:2:23;4379:18;;4366:32;-1:-1:-1;;;;;4447:14:23;;;4444:2;;;4479:6;4471;4464:22;4444:2;4507:61;4560:7;4551:6;4540:9;4536:22;4507:61;:::i;:::-;4497:71;;4621:2;4610:9;4606:18;4593:32;4577:48;;4650:2;4640:8;4637:16;4634:2;;;4671:6;4663;4656:22;4634:2;;4699:63;4754:7;4743:8;4732:9;4728:24;4699:63;:::i;:::-;4689:73;;;4162:606;;;;;:::o;4773:969::-;4918:6;4926;4934;4942;4995:3;4983:9;4974:7;4970:23;4966:33;4963:2;;;5017:6;5009;5002:22;4963:2;5061:9;5048:23;5080:31;5105:5;5080:31;:::i;:::-;5130:5;-1:-1:-1;5186:2:23;5171:18;;5158:32;-1:-1:-1;;;;;5239:14:23;;;5236:2;;;5271:6;5263;5256:22;5236:2;5299:61;5352:7;5343:6;5332:9;5328:22;5299:61;:::i;:::-;5289:71;;5413:2;5402:9;5398:18;5385:32;5369:48;;5442:2;5432:8;5429:16;5426:2;;;5463:6;5455;5448:22;5426:2;5491:63;5546:7;5535:8;5524:9;5520:24;5491:63;:::i;:::-;5481:73;;5607:2;5596:9;5592:18;5579:32;5563:48;;5636:2;5626:8;5623:16;5620:2;;;5657:6;5649;5642:22;5620:2;;5685:51;5728:7;5717:8;5706:9;5702:24;5685:51;:::i;:::-;5675:61;;;4953:789;;;;;;;:::o;5747:436::-;5812:6;5820;5873:2;5861:9;5852:7;5848:23;5844:32;5841:2;;;5894:6;5886;5879:22;5841:2;5938:9;5925:23;5957:31;5982:5;5957:31;:::i;:::-;6007:5;-1:-1:-1;6064:2:23;6049:18;;6036:32;6106:15;;6099:23;6087:36;;6077:2;;6142:6;6134;6127:22;6188:683;6290:6;6298;6306;6314;6322;6375:3;6363:9;6354:7;6350:23;6346:33;6343:2;;;6397:6;6389;6382:22;6343:2;6441:9;6428:23;6460:31;6485:5;6460:31;:::i;:::-;6510:5;-1:-1:-1;6566:2:23;6551:18;;6538:32;-1:-1:-1;;;;;6582:30:23;;6579:2;;;6630:6;6622;6615:22;6579:2;6658:49;6699:7;6690:6;6679:9;6675:22;6658:49;:::i;:::-;6648:59;;;6754:2;6743:9;6739:18;6726:32;6716:42;;6805:2;6794:9;6790:18;6777:32;6767:42;;6828:37;6860:3;6849:9;6845:19;6828:37;:::i;:::-;6818:47;;6333:538;;;;;;;;:::o;6876:762::-;6998:6;7006;7014;7022;7030;7083:3;7071:9;7062:7;7058:23;7054:33;7051:2;;;7105:6;7097;7090:22;7051:2;7149:9;7136:23;7168:31;7193:5;7168:31;:::i;:::-;7218:5;-1:-1:-1;7274:2:23;7259:18;;7246:32;-1:-1:-1;;;;;7290:30:23;;7287:2;;;7338:6;7330;7323:22;7287:2;7366:22;;7422:3;7404:16;;;7400:26;7397:2;;;7444:6;7436;7429:22;7397:2;7472;-1:-1:-1;7521:2:23;7506:18;;7493:32;;-1:-1:-1;7572:2:23;7557:18;;7544:32;;-1:-1:-1;7595:37:23;7627:3;7612:19;;7595:37;:::i;7643:325::-;7711:6;7719;7772:2;7760:9;7751:7;7747:23;7743:32;7740:2;;;7793:6;7785;7778:22;7740:2;7837:9;7824:23;7856:31;7881:5;7856:31;:::i;:::-;7906:5;7958:2;7943:18;;;;7930:32;;-1:-1:-1;;;7730:238:23:o;7973:393::-;8050:6;8058;8066;8119:2;8107:9;8098:7;8094:23;8090:32;8087:2;;;8140:6;8132;8125:22;8087:2;8184:9;8171:23;8203:31;8228:5;8203:31;:::i;:::-;8253:5;8305:2;8290:18;;8277:32;;-1:-1:-1;8356:2:23;8341:18;;;8328:32;;8077:289;-1:-1:-1;;;8077:289:23:o;8371:612::-;8466:6;8474;8482;8490;8543:3;8531:9;8522:7;8518:23;8514:33;8511:2;;;8565:6;8557;8550:22;8511:2;8609:9;8596:23;8628:31;8653:5;8628:31;:::i;:::-;8678:5;-1:-1:-1;8730:2:23;8715:18;;8702:32;;-1:-1:-1;8781:2:23;8766:18;;8753:32;;-1:-1:-1;8836:2:23;8821:18;;8808:32;-1:-1:-1;;;;;8852:30:23;;8849:2;;;8900:6;8892;8885:22;8849:2;8928:49;8969:7;8960:6;8949:9;8945:22;8928:49;:::i;8988:1343::-;9106:6;9114;9167:2;9155:9;9146:7;9142:23;9138:32;9135:2;;;9188:6;9180;9173:22;9135:2;9233:9;9220:23;-1:-1:-1;;;;;9303:2:23;9295:6;9292:14;9289:2;;;9324:6;9316;9309:22;9289:2;9367:6;9356:9;9352:22;9342:32;;9412:7;9405:4;9401:2;9397:13;9393:27;9383:2;;9439:6;9431;9424:22;9383:2;9480;9467:16;9502:4;9525:43;9565:2;9525:43;:::i;:::-;9597:2;9591:9;9609:31;9637:2;9629:6;9609:31;:::i;:::-;9675:18;;;9709:15;;;;-1:-1:-1;9744:11:23;;;9786:1;9782:10;;;9774:19;;9770:28;;9767:41;-1:-1:-1;9764:2:23;;;9826:6;9818;9811:22;9764:2;9853:6;9844:15;;9868:238;9882:2;9879:1;9876:9;9868:238;;;9953:3;9940:17;9970:31;9995:5;9970:31;:::i;:::-;10014:18;;9900:1;9893:9;;;;;10052:12;;;;10084;;9868:238;;;-1:-1:-1;10125:6:23;-1:-1:-1;;10169:18:23;;10156:32;;-1:-1:-1;;10200:16:23;;;10197:2;;;10234:6;10226;10219:22;10197:2;;10262:63;10317:7;10306:8;10295:9;10291:24;10262:63;:::i;:::-;10252:73;;;9125:1206;;;;;:::o;10336:1390::-;10446:6;10477:2;10520;10508:9;10499:7;10495:23;10491:32;10488:2;;;10541:6;10533;10526:22;10488:2;10586:9;10573:23;-1:-1:-1;;;;;10611:6:23;10608:30;10605:2;;;10656:6;10648;10641:22;10605:2;10684:22;;10737:4;10729:13;;10725:27;-1:-1:-1;10715:2:23;;10771:6;10763;10756:22;10715:2;10812;10799:16;10834:43;10874:2;10834:43;:::i;:::-;10896:2;10927;10921:9;10939:31;10967:2;10959:6;10939:31;:::i;:::-;11005:18;;;11039:15;;;;-1:-1:-1;11074:11:23;;;11116:1;11112:10;;;11104:19;;11100:28;;11097:41;-1:-1:-1;11094:2:23;;;11156:6;11148;11141:22;11094:2;11183:6;11174:15;;11198:497;11212:2;11209:1;11206:9;11198:497;;;11283:2;11277:3;11268:7;11264:17;11260:26;11257:2;;;11304:6;11296;11289:22;11257:2;11348;11342:9;11364:34;11389:8;11364:34;:::i;:::-;11441:3;11428:17;11418:8;11411:35;11494:2;11489:3;11485:12;11472:26;11511:31;11536:5;11511:31;:::i;:::-;11562:17;;;11555:32;11600:21;;11230:1;11223:9;;;;;11641:12;;;;11673;;11198:497;;;-1:-1:-1;11714:6:23;10457:1269;-1:-1:-1;;;;;;;;10457:1269:23:o;11731:255::-;11789:6;11842:2;11830:9;11821:7;11817:23;11813:32;11810:2;;;11863:6;11855;11848:22;11810:2;11907:9;11894:23;11926:30;11950:5;11926:30;:::i;11991:259::-;12060:6;12113:2;12101:9;12092:7;12088:23;12084:32;12081:2;;;12134:6;12126;12119:22;12081:2;12171:9;12165:16;12190:30;12214:5;12190:30;:::i;12255:290::-;12354:6;12407:2;12395:9;12386:7;12382:23;12378:32;12375:2;;;12428:6;12420;12413:22;12375:2;12465:9;12459:16;12484:31;12509:5;12484:31;:::i;12550:341::-;12619:6;12672:2;12660:9;12651:7;12647:23;12643:32;12640:2;;;12693:6;12685;12678:22;12640:2;12738:9;12725:23;-1:-1:-1;;;;;12763:6:23;12760:30;12757:2;;;12808:6;12800;12793:22;12757:2;12836:49;12877:7;12868:6;12857:9;12853:22;12836:49;:::i;12896:730::-;12976:6;13029:2;13017:9;13008:7;13004:23;13000:32;12997:2;;;13050:6;13042;13035:22;12997:2;13088:9;13082:16;-1:-1:-1;;;;;13113:6:23;13110:30;13107:2;;;13158:6;13150;13143:22;13107:2;13186:22;;13239:4;13231:13;;13227:27;-1:-1:-1;13217:2:23;;13273:6;13265;13258:22;13217:2;13307;13301:9;13329:31;13357:2;13329:31;:::i;:::-;13389:2;13383:9;13401:31;13429:2;13421:6;13401:31;:::i;:::-;13456:2;13448:6;13441:18;13496:7;13491:2;13486;13482;13478:11;13474:20;13471:33;13468:2;;;13522:6;13514;13507:22;13468:2;13540:55;13592:2;13587;13579:6;13575:15;13570:2;13566;13562:11;13540:55;:::i;:::-;13614:6;12987:639;-1:-1:-1;;;;;;12987:639:23:o;13631:190::-;13690:6;13743:2;13731:9;13722:7;13718:23;13714:32;13711:2;;;13764:6;13756;13749:22;13711:2;-1:-1:-1;13792:23:23;;13701:120;-1:-1:-1;13701:120:23:o;13826:194::-;13896:6;13949:2;13937:9;13928:7;13924:23;13920:32;13917:2;;;13970:6;13962;13955:22;13917:2;-1:-1:-1;13998:16:23;;13907:113;-1:-1:-1;13907:113:23:o;14025:325::-;14093:6;14101;14154:2;14142:9;14133:7;14129:23;14125:32;14122:2;;;14175:6;14167;14160:22;14122:2;14216:9;14203:23;14193:33;;14276:2;14265:9;14261:18;14248:32;14289:31;14314:5;14289:31;:::i;14355:409::-;14433:6;14441;14494:2;14482:9;14473:7;14469:23;14465:32;14462:2;;;14515:6;14507;14500:22;14462:2;14556:9;14543:23;14533:33;;14617:2;14606:9;14602:18;14589:32;-1:-1:-1;;;;;14636:6:23;14633:30;14630:2;;;14681:6;14673;14666:22;14630:2;14709:49;14750:7;14741:6;14730:9;14726:22;14709:49;:::i;14769:437::-;14822:3;14860:5;14854:12;14887:6;14882:3;14875:19;14913:4;14942:2;14937:3;14933:12;14926:19;;14979:2;14972:5;14968:14;15000:3;15012:169;15026:6;15023:1;15020:13;15012:169;;;15087:13;;15075:26;;15121:12;;;;15156:15;;;;15048:1;15041:9;15012:169;;;-1:-1:-1;15197:3:23;;14830:376;-1:-1:-1;;;;;14830:376:23:o;15211:257::-;15252:3;15290:5;15284:12;15317:6;15312:3;15305:19;15333:63;15389:6;15382:4;15377:3;15373:14;15366:4;15359:5;15355:16;15333:63;:::i;:::-;15450:2;15429:15;-1:-1:-1;;15425:29:23;15416:39;;;;15457:4;15412:50;;15260:208;-1:-1:-1;;15260:208:23:o;15473:273::-;15656:6;15648;15643:3;15630:33;15612:3;15682:16;;15707:15;;;15682:16;15620:126;-1:-1:-1;15620:126:23:o;15751:274::-;15880:3;15918:6;15912:13;15934:53;15980:6;15975:3;15968:4;15960:6;15956:17;15934:53;:::i;:::-;16003:16;;;;;15888:137;-1:-1:-1;;15888:137:23:o;16030:415::-;16187:3;16225:6;16219:13;16241:53;16287:6;16282:3;16275:4;16267:6;16263:17;16241:53;:::i;:::-;16363:2;16359:15;;;;-1:-1:-1;;16355:53:23;16316:16;;;;16341:68;;;16436:2;16425:14;;16195:250;-1:-1:-1;;16195:250:23:o;17364:431::-;-1:-1:-1;;;;;17621:15:23;;;17603:34;;17673:15;;17668:2;17653:18;;17646:43;17725:2;17720;17705:18;;17698:30;;;17546:4;;17745:44;;17770:18;;17762:6;17745:44;:::i;:::-;17737:52;17555:240;-1:-1:-1;;;;;17555:240:23:o;17800:826::-;-1:-1:-1;;;;;18197:15:23;;;18179:34;;18249:15;;18244:2;18229:18;;18222:43;18159:3;18296:2;18281:18;;18274:31;;;18122:4;;18328:57;;18365:19;;18357:6;18328:57;:::i;:::-;18433:9;18425:6;18421:22;18416:2;18405:9;18401:18;18394:50;18467:44;18504:6;18496;18467:44;:::i;:::-;18453:58;;18560:9;18552:6;18548:22;18542:3;18531:9;18527:19;18520:51;18588:32;18613:6;18605;18588:32;:::i;19011:560::-;-1:-1:-1;;;;;19308:15:23;;;19290:34;;19360:15;;19355:2;19340:18;;19333:43;19407:2;19392:18;;19385:34;;;19450:2;19435:18;;19428:34;;;19270:3;19493;19478:19;;19471:32;;;19233:4;;19520:45;;19545:19;;19537:6;19520:45;:::i;:::-;19512:53;19242:329;-1:-1:-1;;;;;;;19242:329:23:o;19855:261::-;20034:2;20023:9;20016:21;19997:4;20054:56;20106:2;20095:9;20091:18;20083:6;20054:56;:::i;20121:465::-;20378:2;20367:9;20360:21;20341:4;20404:56;20456:2;20445:9;20441:18;20433:6;20404:56;:::i;:::-;20508:9;20500:6;20496:22;20491:2;20480:9;20476:18;20469:50;20536:44;20573:6;20565;20536:44;:::i;22386:217::-;22533:2;22522:9;22515:21;22496:4;22553:44;22593:2;22582:9;22578:18;22570:6;22553:44;:::i;23489:404::-;23691:2;23673:21;;;23730:2;23710:18;;;23703:30;23769:34;23764:2;23749:18;;23742:62;-1:-1:-1;;;23835:2:23;23820:18;;23813:38;23883:3;23868:19;;23663:230::o;26677:419::-;26879:2;26861:21;;;26918:2;26898:18;;;26891:30;26957:34;26952:2;26937:18;;26930:62;27028:25;27023:2;27008:18;;27001:53;27086:3;27071:19;;26851:245::o;27506:425::-;27708:2;27690:21;;;27747:2;27727:18;;;27720:30;27786:34;27781:2;27766:18;;27759:62;27857:31;27852:2;27837:18;;27830:59;27921:3;27906:19;;27680:251::o;27936:412::-;28138:2;28120:21;;;28177:2;28157:18;;;28150:30;28216:34;28211:2;28196:18;;28189:62;-1:-1:-1;;;28282:2:23;28267:18;;28260:46;28338:3;28323:19;;28110:238::o;30025:473::-;30227:2;30209:21;;;30266:2;30246:18;;;30239:30;30305:34;30300:2;30285:18;;30278:62;30376:34;30371:2;30356:18;;30349:62;-1:-1:-1;;;30442:3:23;30427:19;;30420:36;30488:3;30473:19;;30199:299::o;30503:410::-;30705:2;30687:21;;;30744:2;30724:18;;;30717:30;30783:34;30778:2;30763:18;;30756:62;-1:-1:-1;;;30849:2:23;30834:18;;30827:44;30903:3;30888:19;;30677:236::o;31738:340::-;31940:2;31922:21;;;31979:2;31959:18;;;31952:30;-1:-1:-1;;;32013:2:23;31998:18;;31991:46;32069:2;32054:18;;31912:166::o;32917:423::-;33119:2;33101:21;;;33158:2;33138:18;;;33131:30;33197:34;33192:2;33177:18;;33170:62;33268:29;33263:2;33248:18;;33241:57;33330:3;33315:19;;33091:249::o;40676:417::-;40878:2;40860:21;;;40917:2;40897:18;;;40890:30;40956:34;40951:2;40936:18;;40929:62;-1:-1:-1;;;41022:2:23;41007:18;;41000:51;41083:3;41068:19;;40850:243::o;42733:534::-;42811:4;42817:6;42877:11;42864:25;42971:2;42967:7;42956:8;42940:14;42936:29;42932:43;42912:18;42908:68;42898:2;;42993:4;42987;42980:18;42898:2;43023:33;;43075:20;;;-1:-1:-1;;;;;;43107:30:23;;43104:2;;;43153:4;43147;43140:18;43104:2;43189:4;43177:17;;-1:-1:-1;43220:14:23;43216:27;;;43206:38;;43203:2;;;43257:1;43254;43247:12;43203:2;42828:439;;;;;:::o;43272:183::-;43332:4;-1:-1:-1;;;;;43357:6:23;43354:30;43351:2;;;43387:18;;:::i;:::-;-1:-1:-1;43432:1:23;43428:14;43444:4;43424:25;;43341:114::o;43460:186::-;43508:4;-1:-1:-1;;;;;43533:6:23;43530:30;43527:2;;;43563:18;;:::i;:::-;-1:-1:-1;43629:2:23;43608:15;-1:-1:-1;;43604:29:23;43635:4;43600:40;;43517:129::o;43651:128::-;43691:3;43722:1;43718:6;43715:1;43712:13;43709:2;;;43728:18;;:::i;:::-;-1:-1:-1;43764:9:23;;43699:80::o;43784:204::-;43822:3;43858:4;43855:1;43851:12;43890:4;43887:1;43883:12;43925:3;43919:4;43915:14;43910:3;43907:23;43904:2;;;43933:18;;:::i;:::-;43969:13;;43830:158;-1:-1:-1;;;43830:158:23:o;43993:125::-;44033:4;44061:1;44058;44055:8;44052:2;;;44066:18;;:::i;:::-;-1:-1:-1;44103:9:23;;44042:76::o;44123:258::-;44195:1;44205:113;44219:6;44216:1;44213:13;44205:113;;;44295:11;;;44289:18;44276:11;;;44269:39;44241:2;44234:10;44205:113;;;44336:6;44333:1;44330:13;44327:2;;;-1:-1:-1;;44371:1:23;44353:16;;44346:27;44176:205::o;44386:380::-;44465:1;44461:12;;;;44508;;;44529:2;;44583:4;44575:6;44571:17;44561:27;;44529:2;44636;44628:6;44625:14;44605:18;44602:38;44599:2;;;44682:10;44677:3;44673:20;44670:1;44663:31;44717:4;44714:1;44707:15;44745:4;44742:1;44735:15;44599:2;;44441:325;;;:::o;44771:223::-;44857:2;44849:6;44845:15;44926:6;44914:10;44911:22;-1:-1:-1;;;;;44878:10:23;44875:34;44872:62;44869:2;;;44937:18;;:::i;:::-;44973:2;44966:22;-1:-1:-1;44817:177:23:o;44999:249::-;45109:2;45090:13;;-1:-1:-1;;45086:27:23;45074:40;;-1:-1:-1;;;;;45129:34:23;;45165:22;;;45126:62;45123:2;;;45191:18;;:::i;:::-;45227:2;45220:22;-1:-1:-1;;45046:202:23:o;45253:135::-;45292:3;-1:-1:-1;;45313:17:23;;45310:2;;;45333:18;;:::i;:::-;-1:-1:-1;45380:1:23;45369:13;;45300:88::o;45393:127::-;45454:10;45449:3;45445:20;45442:1;45435:31;45485:4;45482:1;45475:15;45509:4;45506:1;45499:15;45525:127;45586:10;45581:3;45577:20;45574:1;45567:31;45617:4;45614:1;45607:15;45641:4;45638:1;45631:15;45657:185;45692:3;45734:1;45716:16;45713:23;45710:2;;;45784:1;45779:3;45774;45759:27;45815:10;45810:3;45806:20;45700:142;:::o;45847:671::-;45886:3;45928:4;45910:16;45907:26;45904:2;;;45894:624;:::o;45904:2::-;45970;45964:9;-1:-1:-1;;46035:16:23;46031:25;;46028:1;45964:9;46007:50;46086:4;46080:11;46110:16;-1:-1:-1;;;;;46216:2:23;46209:4;46201:6;46197:17;46194:25;46189:2;46181:6;46178:14;46175:45;46172:2;;;46223:5;;;;;45894:624;:::o;46172:2::-;46260:6;46254:4;46250:17;46239:28;;46296:3;46290:10;46323:2;46315:6;46312:14;46309:2;;;46329:5;;;;;;45894:624;:::o;46309:2::-;46413;46394:16;46388:4;46384:27;46380:36;46373:4;46364:6;46359:3;46355:16;46351:27;46348:69;46345:2;;;46420:5;;;;;;45894:624;:::o;46345:2::-;46436:57;46487:4;46478:6;46470;46466:19;46462:30;46456:4;46436:57;:::i;:::-;-1:-1:-1;46509:3:23;;45894:624;-1:-1:-1;;;;;45894:624:23:o;46523:131::-;-1:-1:-1;;;;;46598:31:23;;46588:42;;46578:2;;46644:1;46641;46634:12;46659:131;-1:-1:-1;;;;;;46733:32:23;;46723:43;;46713:2;;46780:1;46777;46770:12
Swarm Source
ipfs://714df7e1b9751ed4aba2b9372ef5532387301bf21fdcb3fd64b361ade173a556
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.