Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
CannonRegistry
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {SetUtil} from "@synthetixio/core-contracts/contracts/utils/SetUtil.sol"; import {OwnedUpgradable} from "./OwnedUpgradable.sol"; import {EfficientStorage} from "./EfficientStorage.sol"; import {Storage} from "./Storage.sol"; contract CannonRegistry is Storage, EfficientStorage, OwnedUpgradable { using SetUtil for SetUtil.Bytes32Set; error Unauthorized(); error InvalidUrl(string url); error InvalidName(bytes32 name); error InvalidTags(); error PackageNotFound(); event PackagePublish( bytes32 indexed name, bytes32 indexed tag, bytes32 indexed variant, string deployUrl, string metaUrl, address owner ); event PackageVerify(bytes32 indexed name, address indexed verifier); event PackageUnverify(bytes32 indexed name, address indexed verifier); uint public constant MIN_PACKAGE_NAME_LENGTH = 3; function validatePackageName(bytes32 _name) public pure returns (bool) { // each character must be in the supported charset for (uint i = 0; i < 32; i++) { if (_name[i] == bytes1(0)) { // must be long enough if (i < MIN_PACKAGE_NAME_LENGTH) { return false; } // last character cannot be `-` if (_name[i - 1] == "-") { return false; } break; } // must be in valid character set if ( (_name[i] < "0" || _name[i] > "9") && (_name[i] < "a" || _name[i] > "z") && // first character cannot be `-` (i == 0 || _name[i] != "-") ) { return false; } } return true; } function publish( bytes32 _packageName, bytes32 _variant, bytes32[] memory _packageTags, string memory _packageDeployUrl, string memory _packageMetaUrl ) external { if (_packageTags.length == 0 || _packageTags.length > 5) { revert InvalidTags(); } if (bytes(_packageDeployUrl).length == 0) { revert InvalidUrl(_packageDeployUrl); } Package storage _p = _store().packages[_packageName]; address owner = _p.owner != address(0) ? _p.owner : _oldStore().packages[_packageName].owner; if (owner != address(0) && owner != msg.sender) { uint additionalDeployersLength = _p.additionalDeployersLength; bool foundAdditionalDeployer = false; for (uint i = 0; i < additionalDeployersLength; i++) { foundAdditionalDeployer = foundAdditionalDeployer || _p.additionalDeployers[i] == msg.sender; } if (!foundAdditionalDeployer) { revert Unauthorized(); } } else if (owner == address(0)) { if (!validatePackageName(_packageName)) { revert InvalidName(_packageName); } _p.owner = msg.sender; } bytes16 packageDeployString = bytes16(_writeString(_packageDeployUrl)); bytes16 packageMetaString = bytes16(_writeString(_packageMetaUrl)); bytes32 _firstTag = _packageTags[0]; _p.deployments[_firstTag][_variant] = CannonDeployInfo({deploy: packageDeployString, meta: packageMetaString}); CannonDeployInfo storage _deployInfo = _p.deployments[_firstTag][_variant]; emit PackagePublish(_packageName, _firstTag, _variant, _packageDeployUrl, _packageMetaUrl, msg.sender); if (_packageTags.length > 1) { for (uint i = 1; i < _packageTags.length; i++) { bytes32 _tag = _packageTags[i]; _p.deployments[_tag][_variant] = _deployInfo; emit PackagePublish(_packageName, _tag, _variant, _packageDeployUrl, _packageMetaUrl, msg.sender); } } } function setAdditionalDeployers(bytes32 _packageName, address[] memory additionalDeployers) external { Package storage _p = _store().packages[_packageName]; address owner = _p.owner != address(0) ? _p.owner : _oldStore().packages[_packageName].owner; if (owner != msg.sender) { revert Unauthorized(); } for (uint i = 0; i < additionalDeployers.length; i++) { _p.additionalDeployers[i] = additionalDeployers[i]; } _p.additionalDeployersLength = additionalDeployers.length; } function getAdditionalDeployers(bytes32 _packageName) external view returns (address[] memory additionalDeployers) { Package storage _p = _store().packages[_packageName]; additionalDeployers = new address[](_p.additionalDeployersLength); for (uint i = 0; i < additionalDeployers.length; i++) { additionalDeployers[i] = _p.additionalDeployers[i]; } } function nominatePackageOwner(bytes32 _packageName, address _newPackageOwner) external { Package storage _p = _store().packages[_packageName]; address owner = _p.owner != address(0) ? _p.owner : _oldStore().packages[_packageName].owner; if (owner != msg.sender) { revert Unauthorized(); } _p.nominatedOwner = _newPackageOwner; } function acceptPackageOwnership(bytes32 _packageName) external { Package storage _p = _store().packages[_packageName]; address newOwner = _p.nominatedOwner; if (msg.sender != newOwner) { revert Unauthorized(); } _p.owner = newOwner; _p.nominatedOwner = address(0); _p.additionalDeployersLength = 0; } function verifyPackage(bytes32 _packageName) external { if (_store().packages[_packageName].owner == address(0)) { revert PackageNotFound(); } emit PackageVerify(_packageName, msg.sender); } function unverifyPackage(bytes32 _packageName) external { if (_store().packages[_packageName].owner == address(0)) { revert PackageNotFound(); } emit PackageUnverify(_packageName, msg.sender); } function getPackageOwner(bytes32 _packageName) external view returns (address) { Package storage _p = _store().packages[_packageName]; address owner = _p.owner != address(0) ? _p.owner : _oldStore().packages[_packageName].owner; return owner; } function getPackageNominatedOwner(bytes32 _packageName) external view returns (address) { return _store().packages[_packageName].nominatedOwner; } function getPackageUrl( bytes32 _packageName, bytes32 _packageVersionName, bytes32 _packageVariant ) external view returns (string memory) { string memory v = _store().strings[ _store().packages[_packageName].deployments[_packageVersionName][_packageVariant].deploy ]; if (bytes(v).length == 0) { v = _oldStore().packages[_packageName].deployments[_packageVersionName][_packageVariant].deploy; } return v; } function getPackageMeta( bytes32 _packageName, bytes32 _packageVersionName, bytes32 _packageVariant ) external view returns (string memory) { string memory v = _store().strings[ _store().packages[_packageName].deployments[_packageVersionName][_packageVariant].meta ]; if (bytes(v).length == 0) { v = _oldStore().packages[_packageName].deployments[_packageVersionName][_packageVariant].meta; } return v; } function _writeString(string memory str) internal returns (bytes32) { bytes16 k = bytes16(keccak256(bytes(str))); if (bytes(_store().strings[k]).length == 0) { _store().strings[k] = str; } return k; } // @title Function that enables calling multiple methods of the system in a single transaction. // @dev Implementation adapted from https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); if (!success) { // Next 6 lines from https://ethereum.stackexchange.com/a/83577 // solhint-disable-next-line reason-string if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } results[i] = result; } } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title Library for access related errors. */ library AccessError { /** * @dev Thrown when an address tries to perform an unauthorized action. * @param addr The address that attempts the action. */ error Unauthorized(address addr); }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title Library for address related errors. */ library AddressError { /** * @dev Thrown when a zero address was passed as a function parameter (0x0000000000000000000000000000000000000000). */ error ZeroAddress(); /** * @dev Thrown when an address representing a contract is expected, but no code is found at the address. * @param contr The address that was expected to be a contract. */ error NotAContract(address contr); }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title Library for change related errors. */ library ChangeError { /** * @dev Thrown when a change is expected but none is detected. */ error NoChange(); }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title Contract for facilitating ownership by a single address. */ interface IOwnable { /** * @notice Thrown when an address tries to accept ownership but has not been nominated. * @param addr The address that is trying to accept ownership. */ error NotNominated(address addr); /** * @notice Emitted when an address has been nominated. * @param newOwner The address that has been nominated. */ event OwnerNominated(address newOwner); /** * @notice Emitted when the owner of the contract has changed. * @param oldOwner The previous owner of the contract. * @param newOwner The new owner of the contract. */ event OwnerChanged(address oldOwner, address newOwner); /** * @notice Allows a nominated address to accept ownership of the contract. * @dev Reverts if the caller is not nominated. */ function acceptOwnership() external; /** * @notice Allows the current owner to nominate a new owner. * @dev The nominated owner will have to call `acceptOwnership` in a separate transaction in order to finalize the action and become the new contract owner. * @param newNominatedOwner The address that is to become nominated. */ function nominateNewOwner(address newNominatedOwner) external; /** * @notice Allows a nominated owner to reject the nomination. */ function renounceNomination() external; /** * @notice Returns the current owner of the contract. */ function owner() external view returns (address); /** * @notice Returns the current nominated owner of the contract. * @dev Only one address can be nominated at a time. */ function nominatedOwner() external view returns (address); }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title Contract to be used as the implementation of a Universal Upgradeable Proxy Standard (UUPS) proxy. * * Important: A UUPS proxy requires its upgradeability functions to be in the implementation as opposed to the proxy. This means that if the proxy is upgraded to an implementation that does not support this interface, it will no longer be upgradeable. */ interface IUUPSImplementation { /** * @notice Thrown when an incoming implementation will not be able to receive future upgrades. */ error ImplementationIsSterile(address implementation); /** * @notice Thrown intentionally when testing future upgradeability of an implementation. */ error UpgradeSimulationFailed(); /** * @notice Emitted when the implementation of the proxy has been upgraded. * @param self The address of the proxy whose implementation was upgraded. * @param implementation The address of the proxy's new implementation. */ event Upgraded(address indexed self, address implementation); /** * @notice Allows the proxy to be upgraded to a new implementation. * @param newImplementation The address of the proxy's new implementation. * @dev Will revert if `newImplementation` is not upgradeable. * @dev The implementation of this function needs to be protected by some sort of access control such as `onlyOwner`. */ function upgradeTo(address newImplementation) external; /** * @notice Function used to determine if a new implementation will be able to receive future upgrades in `upgradeTo`. * @param newImplementation The address of the new implementation being tested for future upgradeability. * @dev This function will always revert, but will revert with different error messages. The function `upgradeTo` uses this error to determine the future upgradeability of the implementation in question. */ function simulateUpgradeTo(address newImplementation) external; /** * @notice Retrieves the current implementation of the proxy. * @return The address of the current implementation. */ function getImplementation() external view returns (address); }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; import "./OwnableStorage.sol"; import "../interfaces/IOwnable.sol"; import "../errors/AddressError.sol"; import "../errors/ChangeError.sol"; /** * @title Contract for facilitating ownership by a single address. * See IOwnable. */ contract Ownable is IOwnable { /** * @inheritdoc IOwnable */ function acceptOwnership() public override { OwnableStorage.Data storage store = OwnableStorage.load(); address currentNominatedOwner = store.nominatedOwner; if (msg.sender != currentNominatedOwner) { revert NotNominated(msg.sender); } emit OwnerChanged(store.owner, currentNominatedOwner); store.owner = currentNominatedOwner; store.nominatedOwner = address(0); } /** * @inheritdoc IOwnable */ function nominateNewOwner(address newNominatedOwner) public override onlyOwnerIfSet { OwnableStorage.Data storage store = OwnableStorage.load(); if (newNominatedOwner == address(0)) { revert AddressError.ZeroAddress(); } if (newNominatedOwner == store.nominatedOwner) { revert ChangeError.NoChange(); } store.nominatedOwner = newNominatedOwner; emit OwnerNominated(newNominatedOwner); } /** * @inheritdoc IOwnable */ function renounceNomination() external override { OwnableStorage.Data storage store = OwnableStorage.load(); if (store.nominatedOwner != msg.sender) { revert NotNominated(msg.sender); } store.nominatedOwner = address(0); } /** * @inheritdoc IOwnable */ function owner() external view override returns (address) { return OwnableStorage.load().owner; } /** * @inheritdoc IOwnable */ function nominatedOwner() external view override returns (address) { return OwnableStorage.load().nominatedOwner; } /** * @dev Reverts if the caller is not the owner. */ modifier onlyOwner() { OwnableStorage.onlyOwner(); _; } /** * @dev Reverts if the caller is not the owner, except if it is not set yet. */ modifier onlyOwnerIfSet() { address theOwner = OwnableStorage.getOwner(); // if owner is set then check if msg.sender is the owner if (theOwner != address(0)) { OwnableStorage.onlyOwner(); } _; } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; import "../errors/AccessError.sol"; library OwnableStorage { bytes32 private constant _SLOT_OWNABLE_STORAGE = keccak256(abi.encode("io.synthetix.core-contracts.Ownable")); struct Data { bool initialized; address owner; address nominatedOwner; } function load() internal pure returns (Data storage store) { bytes32 s = _SLOT_OWNABLE_STORAGE; assembly { store.slot := s } } function onlyOwner() internal view { if (msg.sender != getOwner()) { revert AccessError.Unauthorized(msg.sender); } } function getOwner() internal view returns (address) { return OwnableStorage.load().owner; } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; contract ProxyStorage { bytes32 private constant _SLOT_PROXY_STORAGE = keccak256(abi.encode("io.synthetix.core-contracts.Proxy")); struct ProxyStore { address implementation; bool simulatingUpgrade; } function _proxyStore() internal pure returns (ProxyStore storage store) { bytes32 s = _SLOT_PROXY_STORAGE; assembly { store.slot := s } } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; import "../interfaces/IUUPSImplementation.sol"; import "../errors/AddressError.sol"; import "../errors/ChangeError.sol"; import "../utils/AddressUtil.sol"; import "./ProxyStorage.sol"; abstract contract UUPSImplementation is IUUPSImplementation, ProxyStorage { /** * @inheritdoc IUUPSImplementation */ function simulateUpgradeTo(address newImplementation) public override { ProxyStore storage store = _proxyStore(); store.simulatingUpgrade = true; address currentImplementation = store.implementation; store.implementation = newImplementation; (bool rollbackSuccessful, ) = newImplementation.delegatecall( abi.encodeCall(this.upgradeTo, (currentImplementation)) ); if (!rollbackSuccessful || _proxyStore().implementation != currentImplementation) { revert UpgradeSimulationFailed(); } store.simulatingUpgrade = false; // solhint-disable-next-line reason-string revert(); } /** * @inheritdoc IUUPSImplementation */ function getImplementation() external view override returns (address) { return _proxyStore().implementation; } function _upgradeTo(address newImplementation) internal virtual { if (newImplementation == address(0)) { revert AddressError.ZeroAddress(); } if (!AddressUtil.isContract(newImplementation)) { revert AddressError.NotAContract(newImplementation); } ProxyStore storage store = _proxyStore(); if (newImplementation == store.implementation) { revert ChangeError.NoChange(); } if (!store.simulatingUpgrade && _implementationIsSterile(newImplementation)) { revert ImplementationIsSterile(newImplementation); } store.implementation = newImplementation; emit Upgraded(address(this), newImplementation); } function _implementationIsSterile( address candidateImplementation ) internal virtual returns (bool) { (bool simulationReverted, bytes memory simulationResponse) = address(this).delegatecall( abi.encodeCall(this.simulateUpgradeTo, (candidateImplementation)) ); return !simulationReverted && keccak256(abi.encodePacked(simulationResponse)) == keccak256(abi.encodePacked(UpgradeSimulationFailed.selector)); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; library AddressUtil { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * Utilities that convert numeric types avoiding silent overflows. */ import "./SafeCast/SafeCastU32.sol"; import "./SafeCast/SafeCastI32.sol"; import "./SafeCast/SafeCastI24.sol"; import "./SafeCast/SafeCastU56.sol"; import "./SafeCast/SafeCastI56.sol"; import "./SafeCast/SafeCastU64.sol"; import "./SafeCast/SafeCastI128.sol"; import "./SafeCast/SafeCastI256.sol"; import "./SafeCast/SafeCastU128.sol"; import "./SafeCast/SafeCastU160.sol"; import "./SafeCast/SafeCastU256.sol"; import "./SafeCast/SafeCastAddress.sol"; import "./SafeCast/SafeCastBytes32.sol";
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastAddress { function toBytes32(address x) internal pure returns (bytes32) { return bytes32(uint256(uint160(x))); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastBytes32 { function toAddress(bytes32 x) internal pure returns (address) { return address(uint160(uint256(x))); } function toUint(bytes32 x) internal pure returns (uint) { return uint(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastI128 { error OverflowInt128ToUint128(); error OverflowInt128ToInt32(); function toUint(int128 x) internal pure returns (uint128) { // ----------------<==============o==============>----------------- // ----------------xxxxxxxxxxxxxxxo===============>---------------- if (x < 0) { revert OverflowInt128ToUint128(); } return uint128(x); } function to256(int128 x) internal pure returns (int256) { return int256(x); } function to32(int128 x) internal pure returns (int32) { // ----------------<==============o==============>----------------- // ----------------xxxxxxxxxxxx<==o==>xxxxxxxxxxxx----------------- if (x < int(type(int32).min) || x > int(type(int32).max)) { revert OverflowInt128ToInt32(); } return int32(x); } function zero() internal pure returns (int128) { return int128(0); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastI24 { function to256(int24 x) internal pure returns (int256) { return int256(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastI256 { error OverflowInt256ToUint256(); error OverflowInt256ToInt128(); error OverflowInt256ToInt24(); function to128(int256 x) internal pure returns (int128) { // ----<==========================o===========================>---- // ----xxxxxxxxxxxx<==============o==============>xxxxxxxxxxxxx---- if (x < int256(type(int128).min) || x > int256(type(int128).max)) { revert OverflowInt256ToInt128(); } return int128(x); } function to24(int256 x) internal pure returns (int24) { // ----<==========================o===========================>---- // ----xxxxxxxxxxxxxxxxxxxx<======o=======>xxxxxxxxxxxxxxxxxxxx---- if (x < int256(type(int24).min) || x > int256(type(int24).max)) { revert OverflowInt256ToInt24(); } return int24(x); } function toUint(int256 x) internal pure returns (uint256) { // ----<==========================o===========================>---- // ----xxxxxxxxxxxxxxxxxxxxxxxxxxxo===============================> if (x < 0) { revert OverflowInt256ToUint256(); } return uint256(x); } function zero() internal pure returns (int256) { return int256(0); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastI32 { error OverflowInt32ToUint32(); function toUint(int32 x) internal pure returns (uint32) { // ----------------------<========o========>---------------------- // ----------------------xxxxxxxxxo=========>---------------------- if (x < 0) { revert OverflowInt32ToUint32(); } return uint32(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastI56 { error OverflowInt56ToInt24(); function to24(int56 x) internal pure returns (int24) { // ----------------------<========o========>----------------------- // ----------------------xxx<=====o=====>xxx----------------------- if (x < int(type(int24).min) || x > int(type(int24).max)) { revert OverflowInt56ToInt24(); } return int24(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastU128 { error OverflowUint128ToInt128(); function to256(uint128 x) internal pure returns (uint256) { return uint256(x); } function toInt(uint128 x) internal pure returns (int128) { // -------------------------------o===============>---------------- // ----------------<==============o==============>x---------------- if (x > uint128(type(int128).max)) { revert OverflowUint128ToInt128(); } return int128(x); } function toBytes32(uint128 x) internal pure returns (bytes32) { return bytes32(uint256(x)); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastU160 { function to256(uint160 x) internal pure returns (uint256) { return uint256(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastU256 { error OverflowUint256ToUint128(); error OverflowUint256ToInt256(); error OverflowUint256ToUint64(); error OverflowUint256ToUint32(); error OverflowUint256ToUint160(); function to128(uint256 x) internal pure returns (uint128) { // -------------------------------o===============================> // -------------------------------o===============>xxxxxxxxxxxxxxxx if (x > type(uint128).max) { revert OverflowUint256ToUint128(); } return uint128(x); } function to64(uint256 x) internal pure returns (uint64) { // -------------------------------o===============================> // -------------------------------o======>xxxxxxxxxxxxxxxxxxxxxxxxx if (x > type(uint64).max) { revert OverflowUint256ToUint64(); } return uint64(x); } function to32(uint256 x) internal pure returns (uint32) { // -------------------------------o===============================> // -------------------------------o===>xxxxxxxxxxxxxxxxxxxxxxxxxxxx if (x > type(uint32).max) { revert OverflowUint256ToUint32(); } return uint32(x); } function to160(uint256 x) internal pure returns (uint160) { // -------------------------------o===============================> // -------------------------------o==================>xxxxxxxxxxxxx if (x > type(uint160).max) { revert OverflowUint256ToUint160(); } return uint160(x); } function toBytes32(uint256 x) internal pure returns (bytes32) { return bytes32(x); } function toInt(uint256 x) internal pure returns (int256) { // -------------------------------o===============================> // ----<==========================o===========================>xxxx if (x > uint256(type(int256).max)) { revert OverflowUint256ToInt256(); } return int256(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastU32 { error OverflowUint32ToInt32(); function toInt(uint32 x) internal pure returns (int32) { // -------------------------------o=========>---------------------- // ----------------------<========o========>x---------------------- if (x > uint32(type(int32).max)) { revert OverflowUint32ToInt32(); } return int32(x); } function to256(uint32 x) internal pure returns (uint256) { return uint256(x); } function to56(uint32 x) internal pure returns (uint56) { return uint56(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastU56 { error OverflowUint56ToInt56(); function toInt(uint56 x) internal pure returns (int56) { // -------------------------------o=========>---------------------- // ----------------------<========o========>x---------------------- if (x > uint56(type(int56).max)) { revert OverflowUint56ToInt56(); } return int56(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; /** * @title See SafeCast.sol. */ library SafeCastU64 { error OverflowUint64ToInt64(); function toInt(uint64 x) internal pure returns (int64) { // -------------------------------o=========>---------------------- // ----------------------<========o========>x---------------------- if (x > uint64(type(int64).max)) { revert OverflowUint64ToInt64(); } return int64(x); } }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.11 <0.9.0; import "./SafeCast.sol"; library SetUtil { using SafeCastAddress for address; using SafeCastBytes32 for bytes32; using SafeCastU256 for uint256; // ---------------------------------------- // Uint support // ---------------------------------------- struct UintSet { Bytes32Set raw; } function add(UintSet storage set, uint value) internal { add(set.raw, value.toBytes32()); } function remove(UintSet storage set, uint value) internal { remove(set.raw, value.toBytes32()); } function replace(UintSet storage set, uint value, uint newValue) internal { replace(set.raw, value.toBytes32(), newValue.toBytes32()); } function contains(UintSet storage set, uint value) internal view returns (bool) { return contains(set.raw, value.toBytes32()); } function length(UintSet storage set) internal view returns (uint) { return length(set.raw); } function valueAt(UintSet storage set, uint position) internal view returns (uint) { return valueAt(set.raw, position).toUint(); } function positionOf(UintSet storage set, uint value) internal view returns (uint) { return positionOf(set.raw, value.toBytes32()); } function values(UintSet storage set) internal view returns (uint[] memory) { bytes32[] memory store = values(set.raw); uint[] memory result; assembly { result := store } return result; } // ---------------------------------------- // Address support // ---------------------------------------- struct AddressSet { Bytes32Set raw; } function add(AddressSet storage set, address value) internal { add(set.raw, value.toBytes32()); } function remove(AddressSet storage set, address value) internal { remove(set.raw, value.toBytes32()); } function replace(AddressSet storage set, address value, address newValue) internal { replace(set.raw, value.toBytes32(), newValue.toBytes32()); } function contains(AddressSet storage set, address value) internal view returns (bool) { return contains(set.raw, value.toBytes32()); } function length(AddressSet storage set) internal view returns (uint) { return length(set.raw); } function valueAt(AddressSet storage set, uint position) internal view returns (address) { return valueAt(set.raw, position).toAddress(); } function positionOf(AddressSet storage set, address value) internal view returns (uint) { return positionOf(set.raw, value.toBytes32()); } function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = values(set.raw); address[] memory result; assembly { result := store } return result; } // ---------------------------------------- // Core bytes32 support // ---------------------------------------- error PositionOutOfBounds(); error ValueNotInSet(); error ValueAlreadyInSet(); struct Bytes32Set { bytes32[] _values; mapping(bytes32 => uint) _positions; // Position zero is never used. } function add(Bytes32Set storage set, bytes32 value) internal { if (contains(set, value)) { revert ValueAlreadyInSet(); } set._values.push(value); set._positions[value] = set._values.length; } function remove(Bytes32Set storage set, bytes32 value) internal { uint position = set._positions[value]; if (position == 0) { revert ValueNotInSet(); } uint index = position - 1; uint lastIndex = set._values.length - 1; // If the element being deleted is not the last in the values, // move the last element to its position. if (index != lastIndex) { bytes32 lastValue = set._values[lastIndex]; set._values[index] = lastValue; set._positions[lastValue] = position; } // Remove the last element in the values. set._values.pop(); delete set._positions[value]; } function replace(Bytes32Set storage set, bytes32 value, bytes32 newValue) internal { if (!contains(set, value)) { revert ValueNotInSet(); } if (contains(set, newValue)) { revert ValueAlreadyInSet(); } uint position = set._positions[value]; delete set._positions[value]; uint index = position - 1; set._values[index] = newValue; set._positions[newValue] = position; } function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return set._positions[value] != 0; } function length(Bytes32Set storage set) internal view returns (uint) { return set._values.length; } function valueAt(Bytes32Set storage set, uint position) internal view returns (bytes32) { if (position == 0 || position > set._values.length) { revert PositionOutOfBounds(); } uint index = position - 1; return set._values[index]; } function positionOf(Bytes32Set storage set, bytes32 value) internal view returns (uint) { if (!contains(set, value)) { revert ValueNotInSet(); } return set._positions[value]; } function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return set._values; } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {SetUtil} from "@synthetixio/core-contracts/contracts/utils/SetUtil.sol"; contract EfficientStorage { bytes32 private constant _SLOT_CANNON_REGISTRY_STORAGE = keccak256(abi.encode("usecannon.cannon.registry.efficient")); struct Store { mapping(bytes16 => string) strings; mapping(bytes32 => Package) packages; mapping(address => bool) verifiers; } struct Package { mapping(bytes32 => mapping(bytes32 => CannonDeployInfo)) deployments; address owner; address nominatedOwner; uint additionalDeployersLength; mapping(uint => address) additionalDeployers; } struct CannonDeployInfo { bytes16 deploy; bytes16 meta; } function _store() internal pure returns (Store storage store) { bytes32 s = _SLOT_CANNON_REGISTRY_STORAGE; assembly { store.slot := s } } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {Ownable} from "@synthetixio/core-contracts/contracts/ownership/Ownable.sol"; import {UUPSImplementation} from "@synthetixio/core-contracts/contracts/proxy/UUPSImplementation.sol"; contract OwnedUpgradable is Ownable, UUPSImplementation { function upgradeTo(address _newImplementation) public override onlyOwner { _upgradeTo(_newImplementation); } }
//SPDX-License-Identifier: MIT pragma solidity 0.8.17; import {SetUtil} from "@synthetixio/core-contracts/contracts/utils/SetUtil.sol"; contract Storage { bytes32 private constant _SLOT_CANNON_REGISTRY_STORAGE = keccak256(abi.encode("usecannon.cannon.registry")); struct OldStore { mapping(bytes32 => OldPackage) packages; mapping(address => bool) verifiers; } struct OldPackage { address owner; address nominatedOwner; SetUtil.Bytes32Set versions; mapping(bytes32 => mapping(bytes32 => OldCannonDeployInfo)) deployments; } struct OldCannonDeployInfo { string deploy; string meta; } function _oldStore() internal pure returns (OldStore storage store) { bytes32 s = _SLOT_CANNON_REGISTRY_STORAGE; assembly { store.slot := s } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ImplementationIsSterile","type":"error"},{"inputs":[{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"InvalidName","type":"error"},{"inputs":[],"name":"InvalidTags","type":"error"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"InvalidUrl","type":"error"},{"inputs":[],"name":"NoChange","type":"error"},{"inputs":[{"internalType":"address","name":"contr","type":"address"}],"name":"NotAContract","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"NotNominated","type":"error"},{"inputs":[],"name":"PackageNotFound","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UpgradeSimulationFailed","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"tag","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"variant","type":"bytes32"},{"indexed":false,"internalType":"string","name":"deployUrl","type":"string"},{"indexed":false,"internalType":"string","name":"metaUrl","type":"string"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"PackagePublish","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":true,"internalType":"address","name":"verifier","type":"address"}],"name":"PackageUnverify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"name","type":"bytes32"},{"indexed":true,"internalType":"address","name":"verifier","type":"address"}],"name":"PackageVerify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"self","type":"address"},{"indexed":false,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"MIN_PACKAGE_NAME_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"}],"name":"acceptPackageOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"}],"name":"getAdditionalDeployers","outputs":[{"internalType":"address[]","name":"additionalDeployers","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"},{"internalType":"bytes32","name":"_packageVersionName","type":"bytes32"},{"internalType":"bytes32","name":"_packageVariant","type":"bytes32"}],"name":"getPackageMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"}],"name":"getPackageNominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"}],"name":"getPackageOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"},{"internalType":"bytes32","name":"_packageVersionName","type":"bytes32"},{"internalType":"bytes32","name":"_packageVariant","type":"bytes32"}],"name":"getPackageUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newNominatedOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"},{"internalType":"address","name":"_newPackageOwner","type":"address"}],"name":"nominatePackageOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"},{"internalType":"bytes32","name":"_variant","type":"bytes32"},{"internalType":"bytes32[]","name":"_packageTags","type":"bytes32[]"},{"internalType":"string","name":"_packageDeployUrl","type":"string"},{"internalType":"string","name":"_packageMetaUrl","type":"string"}],"name":"publish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceNomination","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"},{"internalType":"address[]","name":"additionalDeployers","type":"address[]"}],"name":"setAdditionalDeployers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"simulateUpgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"}],"name":"unverifyPackage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"}],"name":"validatePackageName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packageName","type":"bytes32"}],"name":"verifyPackage","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613c34806100206000396000f3fe6080604052600436106101355760003560e01c806379ba5097116100ab578063aaf10f421161006f578063aaf10f4214610424578063ac9650d81461044f578063c5a7ff611461047f578063c7f62cda146104a8578063f52cbda5146104d1578063ffd81002146104fa57610135565b806379ba50971461033f5780637d67a99d146103565780638da5cb5b146103935780639628ba9b146103be578063982d7f49146103e757610135565b8063427a94d4116100fd578063427a94d414610231578063429d7f0e1461026e57806353a47bb71461029757806356de1053146102c25780635ce41a46146102eb578063718fe9281461032857610135565b80630e75313f1461013a5780631627540c146101775780632f402323146101a05780633659cfe6146101dd57806340142a6314610206575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612a2b565b610523565b60405161016e9190612b0e565b60405180910390f35b34801561018357600080fd5b5061019e60048036038101906101999190612b8e565b610729565b005b3480156101ac57600080fd5b506101c760048036038101906101c29190612bbb565b6108ec565b6040516101d49190612bf7565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff9190612b8e565b610935565b005b34801561021257600080fd5b5061021b610949565b6040516102289190612c2b565b60405180910390f35b34801561023d57600080fd5b5061025860048036038101906102539190612bbb565b61094e565b6040516102659190612bf7565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612e43565b610a3f565b005b3480156102a357600080fd5b506102ac61105d565b6040516102b99190612bf7565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190612bbb565b611090565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612a2b565b61117c565b60405161031f9190612b0e565b60405180910390f35b34801561033457600080fd5b5061033d611382565b005b34801561034b57600080fd5b50610354611469565b005b34801561036257600080fd5b5061037d60048036038101906103789190612bbb565b6115f6565b60405161038a9190612f2d565b60405180910390f35b34801561039f57600080fd5b506103a8611917565b6040516103b59190612bf7565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612bbb565b61194a565b005b3480156103f357600080fd5b5061040e60048036038101906104099190612bbb565b611a36565b60405161041b9190613006565b60405180910390f35b34801561043057600080fd5b50610439611b50565b6040516104469190612bf7565b60405180910390f35b61046960048036038101906104649190613083565b611b83565b60405161047691906131e7565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a191906132cc565b611d1d565b005b3480156104b457600080fd5b506104cf60048036038101906104ca9190612b8e565b611f06565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190612bbb565b612130565b005b34801561050657600080fd5b50610521600480360381019061051c9190613328565b612274565b005b6060600061052f612408565b600001600061053c612408565b60010160008881526020019081526020016000206000016000878152602001908152602001600020600086815260200190815260200160002060000160109054906101000a900460801b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002080546105c590613397565b80601f01602080910402602001604051908101604052809291908181526020018280546105f190613397565b801561063e5780601f106106135761010080835404028352916020019161063e565b820191906000526020600020905b81548152906001019060200180831161062157829003601f168201915b50505050509050600081510361071e57610656612439565b600001600086815260200190815260200160002060040160008581526020019081526020016000206000848152602001908152602001600020600101805461069d90613397565b80601f01602080910402602001604051908101604052809291908181526020018280546106c990613397565b80156107165780601f106106eb57610100808354040283529160200191610716565b820191906000526020600020905b8154815290600101906020018083116106f957829003601f168201915b505050505090505b809150509392505050565b600061073361246a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107725761077161249d565b5b600061077c612516565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107e4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086d576040517fa88ee57700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22836040516108df9190612bf7565b60405180910390a1505050565b60006108f6612408565b600101600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61093d61249d565b61094681612547565b50565b600381565b600080610959612408565b6001016000848152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a0d576109d0612439565b600001600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610a33565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90508092505050919050565b600083511480610a50575060058351115b15610a87576040517f42a3cc0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000825103610acd57816040517fb17265ae000000000000000000000000000000000000000000000000000000008152600401610ac49190612b0e565b60405180910390fd5b6000610ad7612408565b6001016000878152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610b8b57610b4e612439565b600001600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610bb1565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610c1c57503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15610cf6576000826003015490506000805b82811015610cb7578180610ca257503373ffffffffffffffffffffffffffffffffffffffff1685600401600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b91508080610caf906133f7565b915050610c2e565b5080610cef576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610db9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610db857610d33876115f6565b610d7457866040517f7de0e788000000000000000000000000000000000000000000000000000000008152600401610d6b919061344e565b60405180910390fd5b338260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6000610dc485612787565b90506000610dd185612787565b9050600087600081518110610de957610de8613469565b5b602002602001015190506040518060400160405280846fffffffffffffffffffffffffffffffff19168152602001836fffffffffffffffffffffffffffffffff191681525085600001600083815260200190815260200160002060008b815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908360801c021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff021916908360801c0217905550905050600085600001600083815260200190815260200160002060008b8152602001908152602001600020905089828c7f3e0ad7f27e5b52a020ecd925eec9840b6bc48a884646be7657023c81a9ba16bb8b8b33604051610f1793929190613498565b60405180910390a4600189511115611050576000600190505b895181101561104e5760008a8281518110610f4e57610f4d613469565b5b602002602001015190508288600001600083815260200190815260200160002060008e81526020019081526020016000206000820160009054906101000a900460801b8160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908360801c02179055506000820160109054906101000a900460801b8160000160106101000a8154816fffffffffffffffffffffffffffffffff021916908360801c02179055509050508b818e7f3e0ad7f27e5b52a020ecd925eec9840b6bc48a884646be7657023c81a9ba16bb8d8d3360405161103293929190613498565b60405180910390a4508080611046906133f7565b915050610f30565b505b5050505050505050505050565b6000611067612516565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff166110b0612408565b600101600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611135576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16817ffab284a6fa4d86f68e6240e9ad8f4d69d134a0450b8328166beb80f544d8946860405160405180910390a350565b60606000611188612408565b6000016000611195612408565b60010160008881526020019081526020016000206000016000878152602001908152602001600020600086815260200190815260200160002060000160009054906101000a900460801b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff19168152602001908152602001600020805461121e90613397565b80601f016020809104026020016040519081016040528092919081815260200182805461124a90613397565b80156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b505050505090506000815103611377576112af612439565b60000160008681526020019081526020016000206004016000858152602001908152602001600020600084815260200190815260200160002060000180546112f690613397565b80601f016020809104026020016040519081016040528092919081815260200182805461132290613397565b801561136f5780601f106113445761010080835404028352916020019161136f565b820191906000526020600020905b81548152906001019060200180831161135257829003601f168201915b505050505090505b809150509392505050565b600061138c612516565b90503373ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142257336040517fa0e5a0d70000000000000000000000000000000000000000000000000000000081526004016114199190612bf7565b60405180910390fd5b60008160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611473612516565b905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461150e57336040517fa0e5a0d70000000000000000000000000000000000000000000000000000000081526004016115059190612bf7565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c8260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516115639291906134dd565b60405180910390a1808260000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600080600090505b602081101561190c57600060f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191683826020811061164157611640613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036116f957600381101561167f576000915050611912565b7f2d00000000000000000000000000000000000000000000000000000000000000836001836116ae9190613506565b602081106116bf576116be613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036116f4576000915050611912565b61190c565b7f300000000000000000000000000000000000000000000000000000000000000083826020811061172d5761172c613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610806117b657507f390000000000000000000000000000000000000000000000000000000000000083826020811061178e5761178d613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916115b801561187b57507f61000000000000000000000000000000000000000000000000000000000000008382602081106117f1576117f0613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916108061187a57507f7a0000000000000000000000000000000000000000000000000000000000000083826020811061185257611851613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916115b5b80156118ea575060008114806118e957507f2d000000000000000000000000000000000000000000000000000000000000008382602081106118c0576118bf613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b5b156118f9576000915050611912565b8080611904906133f7565b9150506115fe565b50600190505b919050565b6000611921612516565b60000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff1661196a612408565b600101600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119ef576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16817fb677e8780a5830f06e4a4e536eea3e9c92b6935f0c52cf4560e8b7c846ee515060405160405180910390a350565b60606000611a42612408565b60010160008481526020019081526020016000209050806003015467ffffffffffffffff811115611a7657611a75612c4b565b5b604051908082528060200260200182016040528015611aa45781602001602082028036833780820191505090505b50915060005b8251811015611b495781600401600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110611afc57611afb613469565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611b41906133f7565b915050611aaa565b5050919050565b6000611b5a612857565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608282905067ffffffffffffffff811115611ba257611ba1612c4b565b5b604051908082528060200260200182016040528015611bd557816020015b6060815260200190600190039081611bc05790505b50905060005b83839050811015611d16576000803073ffffffffffffffffffffffffffffffffffffffff16868685818110611c1357611c12613469565b5b9050602002810190611c259190613549565b604051611c339291906135dc565b600060405180830381855af49150503d8060008114611c6e576040519150601f19603f3d011682016040523d82523d6000602084013e611c73565b606091505b509150915081611ce257604481511015611c8c57600080fd5b60048101905080806020019051810190611ca69190613665565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd99190612b0e565b60405180910390fd5b80848481518110611cf657611cf5613469565b5b602002602001018190525050508080611d0e906133f7565b915050611bdb565b5092915050565b6000611d27612408565b6001016000848152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ddb57611d9e612439565b600001600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e01565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e68576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8351811015611ef557838181518110611e8757611e86613469565b5b602002602001015183600401600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611eed906133f7565b915050611e6b565b508251826003018190555050505050565b6000611f10612857565b905060018160000160146101000a81548160ff02191690831515021790555060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16633659cfe684604051602401611fe19190612bf7565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161203091906136df565b600060405180830381855af49150503d806000811461206b576040519150601f19603f3d011682016040523d82523d6000602084013e612070565b606091505b505090508015806120d857508173ffffffffffffffffffffffffffffffffffffffff1661209b612857565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561210f576040517fa1cfa5a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008360000160146101000a81548160ff0219169083151502179055600080fd5b600061213a612408565b6001016000838152602001908152602001600020905060008160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121de576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260030181905550505050565b600061227e612408565b6001016000848152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612332576122f5612439565b600001600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612358565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146123bf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828260020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60008060405160200161241a90613768565b6040516020818303038152906040528051906020012090508091505090565b60008060405160200161244b906137d4565b6040516020818303038152906040528051906020012090508091505090565b6000612474612516565b60000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6124a561246a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251457336040517f8e4a23d600000000000000000000000000000000000000000000000000000000815260040161250b9190612bf7565b60405180910390fd5b565b60008060405160200161252890613866565b6040516020818303038152906040528051906020012090508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125ad576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125b681612888565b6125f757806040517f8a8b41ec0000000000000000000000000000000000000000000000000000000081526004016125ee9190612bf7565b60405180910390fd5b6000612601612857565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361268c576040517fa88ee57700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000160149054906101000a900460ff161580156126b057506126af8261289b565b5b156126f257816040517f155043010000000000000000000000000000000000000000000000000000000081526004016126e99190612bf7565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff167f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c78360405161277b9190612bf7565b60405180910390a25050565b60008082805190602001209050600061279e612408565b6000016000836fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002080546127e390613397565b90500361283b57826127f3612408565b6000016000836fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002090816128399190613a32565b505b806fffffffffffffffffffffffffffffffff1916915050919050565b60008060405160200161286990613b76565b6040516020818303038152906040528051906020012090508091505090565b600080823b905060008111915050919050565b60008060003073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1663c7f62cda866040516024016128e49190612bf7565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161293391906136df565b600060405180830381855af49150503d806000811461296e576040519150601f19603f3d011682016040523d82523d6000602084013e612973565b606091505b5091509150811580156129d8575063a1cfa5a860e01b6040516020016129999190613be3565b60405160208183030381529060405280519060200120816040516020016129c091906136df565b60405160208183030381529060405280519060200120145b92505050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612a08816129f5565b8114612a1357600080fd5b50565b600081359050612a25816129ff565b92915050565b600080600060608486031215612a4457612a436129eb565b5b6000612a5286828701612a16565b9350506020612a6386828701612a16565b9250506040612a7486828701612a16565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ab8578082015181840152602081019050612a9d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ae082612a7e565b612aea8185612a89565b9350612afa818560208601612a9a565b612b0381612ac4565b840191505092915050565b60006020820190508181036000830152612b288184612ad5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5b82612b30565b9050919050565b612b6b81612b50565b8114612b7657600080fd5b50565b600081359050612b8881612b62565b92915050565b600060208284031215612ba457612ba36129eb565b5b6000612bb284828501612b79565b91505092915050565b600060208284031215612bd157612bd06129eb565b5b6000612bdf84828501612a16565b91505092915050565b612bf181612b50565b82525050565b6000602082019050612c0c6000830184612be8565b92915050565b6000819050919050565b612c2581612c12565b82525050565b6000602082019050612c406000830184612c1c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c8382612ac4565b810181811067ffffffffffffffff82111715612ca257612ca1612c4b565b5b80604052505050565b6000612cb56129e1565b9050612cc18282612c7a565b919050565b600067ffffffffffffffff821115612ce157612ce0612c4b565b5b602082029050602081019050919050565b600080fd5b6000612d0a612d0584612cc6565b612cab565b90508083825260208201905060208402830185811115612d2d57612d2c612cf2565b5b835b81811015612d565780612d428882612a16565b845260208401935050602081019050612d2f565b5050509392505050565b600082601f830112612d7557612d74612c46565b5b8135612d85848260208601612cf7565b91505092915050565b600080fd5b600067ffffffffffffffff821115612dae57612dad612c4b565b5b612db782612ac4565b9050602081019050919050565b82818337600083830152505050565b6000612de6612de184612d93565b612cab565b905082815260208101848484011115612e0257612e01612d8e565b5b612e0d848285612dc4565b509392505050565b600082601f830112612e2a57612e29612c46565b5b8135612e3a848260208601612dd3565b91505092915050565b600080600080600060a08688031215612e5f57612e5e6129eb565b5b6000612e6d88828901612a16565b9550506020612e7e88828901612a16565b945050604086013567ffffffffffffffff811115612e9f57612e9e6129f0565b5b612eab88828901612d60565b935050606086013567ffffffffffffffff811115612ecc57612ecb6129f0565b5b612ed888828901612e15565b925050608086013567ffffffffffffffff811115612ef957612ef86129f0565b5b612f0588828901612e15565b9150509295509295909350565b60008115159050919050565b612f2781612f12565b82525050565b6000602082019050612f426000830184612f1e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f7d81612b50565b82525050565b6000612f8f8383612f74565b60208301905092915050565b6000602082019050919050565b6000612fb382612f48565b612fbd8185612f53565b9350612fc883612f64565b8060005b83811015612ff9578151612fe08882612f83565b9750612feb83612f9b565b925050600181019050612fcc565b5085935050505092915050565b600060208201905081810360008301526130208184612fa8565b905092915050565b600080fd5b60008083601f84011261304357613042612c46565b5b8235905067ffffffffffffffff8111156130605761305f613028565b5b60208301915083602082028301111561307c5761307b612cf2565b5b9250929050565b6000806020838503121561309a576130996129eb565b5b600083013567ffffffffffffffff8111156130b8576130b76129f0565b5b6130c48582860161302d565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000613123826130fc565b61312d8185613107565b935061313d818560208601612a9a565b61314681612ac4565b840191505092915050565b600061315d8383613118565b905092915050565b6000602082019050919050565b600061317d826130d0565b61318781856130db565b935083602082028501613199856130ec565b8060005b858110156131d557848403895281516131b68582613151565b94506131c183613165565b925060208a0199505060018101905061319d565b50829750879550505050505092915050565b600060208201905081810360008301526132018184613172565b905092915050565b600067ffffffffffffffff82111561322457613223612c4b565b5b602082029050602081019050919050565b600061324861324384613209565b612cab565b9050808382526020820190506020840283018581111561326b5761326a612cf2565b5b835b8181101561329457806132808882612b79565b84526020840193505060208101905061326d565b5050509392505050565b600082601f8301126132b3576132b2612c46565b5b81356132c3848260208601613235565b91505092915050565b600080604083850312156132e3576132e26129eb565b5b60006132f185828601612a16565b925050602083013567ffffffffffffffff811115613312576133116129f0565b5b61331e8582860161329e565b9150509250929050565b6000806040838503121561333f5761333e6129eb565b5b600061334d85828601612a16565b925050602061335e85828601612b79565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133af57607f821691505b6020821081036133c2576133c1613368565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061340282612c12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613434576134336133c8565b5b600182019050919050565b613448816129f5565b82525050565b6000602082019050613463600083018461343f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060608201905081810360008301526134b28186612ad5565b905081810360208301526134c68185612ad5565b90506134d56040830184612be8565b949350505050565b60006040820190506134f26000830185612be8565b6134ff6020830184612be8565b9392505050565b600061351182612c12565b915061351c83612c12565b9250828203905081811115613534576135336133c8565b5b92915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126135665761356561353a565b5b80840192508235915067ffffffffffffffff8211156135885761358761353f565b5b6020830192506001820236038313156135a4576135a3613544565b5b509250929050565b600081905092915050565b60006135c383856135ac565b93506135d0838584612dc4565b82840190509392505050565b60006135e98284866135b7565b91508190509392505050565b600061360861360384612d93565b612cab565b90508281526020810184848401111561362457613623612d8e565b5b61362f848285612a9a565b509392505050565b600082601f83011261364c5761364b612c46565b5b815161365c8482602086016135f5565b91505092915050565b60006020828403121561367b5761367a6129eb565b5b600082015167ffffffffffffffff811115613699576136986129f0565b5b6136a584828501613637565b91505092915050565b60006136b9826130fc565b6136c381856135ac565b93506136d3818560208601612a9a565b80840191505092915050565b60006136eb82846136ae565b915081905092915050565b7f75736563616e6e6f6e2e63616e6e6f6e2e72656769737472792e65666669636960008201527f656e740000000000000000000000000000000000000000000000000000000000602082015250565b6000613752602383612a89565b915061375d826136f6565b604082019050919050565b6000602082019050818103600083015261378181613745565b9050919050565b7f75736563616e6e6f6e2e63616e6e6f6e2e726567697374727900000000000000600082015250565b60006137be601983612a89565b91506137c982613788565b602082019050919050565b600060208201905081810360008301526137ed816137b1565b9050919050565b7f696f2e73796e7468657469782e636f72652d636f6e7472616374732e4f776e6160008201527f626c650000000000000000000000000000000000000000000000000000000000602082015250565b6000613850602383612a89565b915061385b826137f4565b604082019050919050565b6000602082019050818103600083015261387f81613843565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826138ab565b6138f286836138ab565b95508019841693508086168417925050509392505050565b6000819050919050565b600061392f61392a61392584612c12565b61390a565b612c12565b9050919050565b6000819050919050565b61394983613914565b61395d61395582613936565b8484546138b8565b825550505050565b600090565b613972613965565b61397d818484613940565b505050565b5b818110156139a15761399660008261396a565b600181019050613983565b5050565b601f8211156139e6576139b781613886565b6139c08461389b565b810160208510156139cf578190505b6139e36139db8561389b565b830182613982565b50505b505050565b600082821c905092915050565b6000613a09600019846008026139eb565b1980831691505092915050565b6000613a2283836139f8565b9150826002028217905092915050565b613a3b82612a7e565b67ffffffffffffffff811115613a5457613a53612c4b565b5b613a5e8254613397565b613a698282856139a5565b600060209050601f831160018114613a9c5760008415613a8a578287015190505b613a948582613a16565b865550613afc565b601f198416613aaa86613886565b60005b82811015613ad257848901518255600182019150602085019450602081019050613aad565b86831015613aef5784890151613aeb601f8916826139f8565b8355505b6001600288020188555050505b505050505050565b7f696f2e73796e7468657469782e636f72652d636f6e7472616374732e50726f7860008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b60602183612a89565b9150613b6b82613b04565b604082019050919050565b60006020820190508181036000830152613b8f81613b53565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b613bdd613bd882613b96565b613bc2565b82525050565b6000613bef8284613bcc565b6004820191508190509291505056fea264697066735822122020cb5472c05dec0a30ea0f90fb36ac6444693b24d270f9ad4dff48832a1ed8dc64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101355760003560e01c806379ba5097116100ab578063aaf10f421161006f578063aaf10f4214610424578063ac9650d81461044f578063c5a7ff611461047f578063c7f62cda146104a8578063f52cbda5146104d1578063ffd81002146104fa57610135565b806379ba50971461033f5780637d67a99d146103565780638da5cb5b146103935780639628ba9b146103be578063982d7f49146103e757610135565b8063427a94d4116100fd578063427a94d414610231578063429d7f0e1461026e57806353a47bb71461029757806356de1053146102c25780635ce41a46146102eb578063718fe9281461032857610135565b80630e75313f1461013a5780631627540c146101775780632f402323146101a05780633659cfe6146101dd57806340142a6314610206575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612a2b565b610523565b60405161016e9190612b0e565b60405180910390f35b34801561018357600080fd5b5061019e60048036038101906101999190612b8e565b610729565b005b3480156101ac57600080fd5b506101c760048036038101906101c29190612bbb565b6108ec565b6040516101d49190612bf7565b60405180910390f35b3480156101e957600080fd5b5061020460048036038101906101ff9190612b8e565b610935565b005b34801561021257600080fd5b5061021b610949565b6040516102289190612c2b565b60405180910390f35b34801561023d57600080fd5b5061025860048036038101906102539190612bbb565b61094e565b6040516102659190612bf7565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190612e43565b610a3f565b005b3480156102a357600080fd5b506102ac61105d565b6040516102b99190612bf7565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190612bbb565b611090565b005b3480156102f757600080fd5b50610312600480360381019061030d9190612a2b565b61117c565b60405161031f9190612b0e565b60405180910390f35b34801561033457600080fd5b5061033d611382565b005b34801561034b57600080fd5b50610354611469565b005b34801561036257600080fd5b5061037d60048036038101906103789190612bbb565b6115f6565b60405161038a9190612f2d565b60405180910390f35b34801561039f57600080fd5b506103a8611917565b6040516103b59190612bf7565b60405180910390f35b3480156103ca57600080fd5b506103e560048036038101906103e09190612bbb565b61194a565b005b3480156103f357600080fd5b5061040e60048036038101906104099190612bbb565b611a36565b60405161041b9190613006565b60405180910390f35b34801561043057600080fd5b50610439611b50565b6040516104469190612bf7565b60405180910390f35b61046960048036038101906104649190613083565b611b83565b60405161047691906131e7565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a191906132cc565b611d1d565b005b3480156104b457600080fd5b506104cf60048036038101906104ca9190612b8e565b611f06565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190612bbb565b612130565b005b34801561050657600080fd5b50610521600480360381019061051c9190613328565b612274565b005b6060600061052f612408565b600001600061053c612408565b60010160008881526020019081526020016000206000016000878152602001908152602001600020600086815260200190815260200160002060000160109054906101000a900460801b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002080546105c590613397565b80601f01602080910402602001604051908101604052809291908181526020018280546105f190613397565b801561063e5780601f106106135761010080835404028352916020019161063e565b820191906000526020600020905b81548152906001019060200180831161062157829003601f168201915b50505050509050600081510361071e57610656612439565b600001600086815260200190815260200160002060040160008581526020019081526020016000206000848152602001908152602001600020600101805461069d90613397565b80601f01602080910402602001604051908101604052809291908181526020018280546106c990613397565b80156107165780601f106106eb57610100808354040283529160200191610716565b820191906000526020600020905b8154815290600101906020018083116106f957829003601f168201915b505050505090505b809150509392505050565b600061073361246a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107725761077161249d565b5b600061077c612516565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107e4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086d576040517fa88ee57700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22836040516108df9190612bf7565b60405180910390a1505050565b60006108f6612408565b600101600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61093d61249d565b61094681612547565b50565b600381565b600080610959612408565b6001016000848152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610a0d576109d0612439565b600001600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610a33565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90508092505050919050565b600083511480610a50575060058351115b15610a87576040517f42a3cc0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000825103610acd57816040517fb17265ae000000000000000000000000000000000000000000000000000000008152600401610ac49190612b0e565b60405180910390fd5b6000610ad7612408565b6001016000878152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610b8b57610b4e612439565b600001600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610bb1565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610c1c57503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b15610cf6576000826003015490506000805b82811015610cb7578180610ca257503373ffffffffffffffffffffffffffffffffffffffff1685600401600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b91508080610caf906133f7565b915050610c2e565b5080610cef576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050610db9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610db857610d33876115f6565b610d7457866040517f7de0e788000000000000000000000000000000000000000000000000000000008152600401610d6b919061344e565b60405180910390fd5b338260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b6000610dc485612787565b90506000610dd185612787565b9050600087600081518110610de957610de8613469565b5b602002602001015190506040518060400160405280846fffffffffffffffffffffffffffffffff19168152602001836fffffffffffffffffffffffffffffffff191681525085600001600083815260200190815260200160002060008b815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908360801c021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff021916908360801c0217905550905050600085600001600083815260200190815260200160002060008b8152602001908152602001600020905089828c7f3e0ad7f27e5b52a020ecd925eec9840b6bc48a884646be7657023c81a9ba16bb8b8b33604051610f1793929190613498565b60405180910390a4600189511115611050576000600190505b895181101561104e5760008a8281518110610f4e57610f4d613469565b5b602002602001015190508288600001600083815260200190815260200160002060008e81526020019081526020016000206000820160009054906101000a900460801b8160000160006101000a8154816fffffffffffffffffffffffffffffffff021916908360801c02179055506000820160109054906101000a900460801b8160000160106101000a8154816fffffffffffffffffffffffffffffffff021916908360801c02179055509050508b818e7f3e0ad7f27e5b52a020ecd925eec9840b6bc48a884646be7657023c81a9ba16bb8d8d3360405161103293929190613498565b60405180910390a4508080611046906133f7565b915050610f30565b505b5050505050505050505050565b6000611067612516565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff166110b0612408565b600101600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611135576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16817ffab284a6fa4d86f68e6240e9ad8f4d69d134a0450b8328166beb80f544d8946860405160405180910390a350565b60606000611188612408565b6000016000611195612408565b60010160008881526020019081526020016000206000016000878152602001908152602001600020600086815260200190815260200160002060000160009054906101000a900460801b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff19168152602001908152602001600020805461121e90613397565b80601f016020809104026020016040519081016040528092919081815260200182805461124a90613397565b80156112975780601f1061126c57610100808354040283529160200191611297565b820191906000526020600020905b81548152906001019060200180831161127a57829003601f168201915b505050505090506000815103611377576112af612439565b60000160008681526020019081526020016000206004016000858152602001908152602001600020600084815260200190815260200160002060000180546112f690613397565b80601f016020809104026020016040519081016040528092919081815260200182805461132290613397565b801561136f5780601f106113445761010080835404028352916020019161136f565b820191906000526020600020905b81548152906001019060200180831161135257829003601f168201915b505050505090505b809150509392505050565b600061138c612516565b90503373ffffffffffffffffffffffffffffffffffffffff168160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461142257336040517fa0e5a0d70000000000000000000000000000000000000000000000000000000081526004016114199190612bf7565b60405180910390fd5b60008160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611473612516565b905060008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461150e57336040517fa0e5a0d70000000000000000000000000000000000000000000000000000000081526004016115059190612bf7565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c8260000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516115639291906134dd565b60405180910390a1808260000160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600080600090505b602081101561190c57600060f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191683826020811061164157611640613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036116f957600381101561167f576000915050611912565b7f2d00000000000000000000000000000000000000000000000000000000000000836001836116ae9190613506565b602081106116bf576116be613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036116f4576000915050611912565b61190c565b7f300000000000000000000000000000000000000000000000000000000000000083826020811061172d5761172c613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191610806117b657507f390000000000000000000000000000000000000000000000000000000000000083826020811061178e5761178d613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916115b801561187b57507f61000000000000000000000000000000000000000000000000000000000000008382602081106117f1576117f0613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916108061187a57507f7a0000000000000000000000000000000000000000000000000000000000000083826020811061185257611851613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916115b5b80156118ea575060008114806118e957507f2d000000000000000000000000000000000000000000000000000000000000008382602081106118c0576118bf613469565b5b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b5b156118f9576000915050611912565b8080611904906133f7565b9150506115fe565b50600190505b919050565b6000611921612516565b60000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff1661196a612408565b600101600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036119ef576040517fbdc474c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16817fb677e8780a5830f06e4a4e536eea3e9c92b6935f0c52cf4560e8b7c846ee515060405160405180910390a350565b60606000611a42612408565b60010160008481526020019081526020016000209050806003015467ffffffffffffffff811115611a7657611a75612c4b565b5b604051908082528060200260200182016040528015611aa45781602001602082028036833780820191505090505b50915060005b8251811015611b495781600401600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110611afc57611afb613469565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080611b41906133f7565b915050611aaa565b5050919050565b6000611b5a612857565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608282905067ffffffffffffffff811115611ba257611ba1612c4b565b5b604051908082528060200260200182016040528015611bd557816020015b6060815260200190600190039081611bc05790505b50905060005b83839050811015611d16576000803073ffffffffffffffffffffffffffffffffffffffff16868685818110611c1357611c12613469565b5b9050602002810190611c259190613549565b604051611c339291906135dc565b600060405180830381855af49150503d8060008114611c6e576040519150601f19603f3d011682016040523d82523d6000602084013e611c73565b606091505b509150915081611ce257604481511015611c8c57600080fd5b60048101905080806020019051810190611ca69190613665565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd99190612b0e565b60405180910390fd5b80848481518110611cf657611cf5613469565b5b602002602001018190525050508080611d0e906133f7565b915050611bdb565b5092915050565b6000611d27612408565b6001016000848152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ddb57611d9e612439565b600001600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611e01565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e68576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8351811015611ef557838181518110611e8757611e86613469565b5b602002602001015183600401600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611eed906133f7565b915050611e6b565b508251826003018190555050505050565b6000611f10612857565b905060018160000160146101000a81548160ff02191690831515021790555060008160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16633659cfe684604051602401611fe19190612bf7565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161203091906136df565b600060405180830381855af49150503d806000811461206b576040519150601f19603f3d011682016040523d82523d6000602084013e612070565b606091505b505090508015806120d857508173ffffffffffffffffffffffffffffffffffffffff1661209b612857565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b1561210f576040517fa1cfa5a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008360000160146101000a81548160ff0219169083151502179055600080fd5b600061213a612408565b6001016000838152602001908152602001600020905060008160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121de576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808260010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260030181905550505050565b600061227e612408565b6001016000848152602001908152602001600020905060008073ffffffffffffffffffffffffffffffffffffffff168260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612332576122f5612439565b600001600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612358565b8160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146123bf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828260020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60008060405160200161241a90613768565b6040516020818303038152906040528051906020012090508091505090565b60008060405160200161244b906137d4565b6040516020818303038152906040528051906020012090508091505090565b6000612474612516565b60000160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6124a561246a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251457336040517f8e4a23d600000000000000000000000000000000000000000000000000000000815260040161250b9190612bf7565b60405180910390fd5b565b60008060405160200161252890613866565b6040516020818303038152906040528051906020012090508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036125ad576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125b681612888565b6125f757806040517f8a8b41ec0000000000000000000000000000000000000000000000000000000081526004016125ee9190612bf7565b60405180910390fd5b6000612601612857565b90508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361268c576040517fa88ee57700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060000160149054906101000a900460ff161580156126b057506126af8261289b565b5b156126f257816040517f155043010000000000000000000000000000000000000000000000000000000081526004016126e99190612bf7565b60405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff167f5d611f318680d00598bb735d61bacf0c514c6b50e1e5ad30040a4df2b12791c78360405161277b9190612bf7565b60405180910390a25050565b60008082805190602001209050600061279e612408565b6000016000836fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002080546127e390613397565b90500361283b57826127f3612408565b6000016000836fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260200190815260200160002090816128399190613a32565b505b806fffffffffffffffffffffffffffffffff1916915050919050565b60008060405160200161286990613b76565b6040516020818303038152906040528051906020012090508091505090565b600080823b905060008111915050919050565b60008060003073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1663c7f62cda866040516024016128e49190612bf7565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161293391906136df565b600060405180830381855af49150503d806000811461296e576040519150601f19603f3d011682016040523d82523d6000602084013e612973565b606091505b5091509150811580156129d8575063a1cfa5a860e01b6040516020016129999190613be3565b60405160208183030381529060405280519060200120816040516020016129c091906136df565b60405160208183030381529060405280519060200120145b92505050919050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612a08816129f5565b8114612a1357600080fd5b50565b600081359050612a25816129ff565b92915050565b600080600060608486031215612a4457612a436129eb565b5b6000612a5286828701612a16565b9350506020612a6386828701612a16565b9250506040612a7486828701612a16565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ab8578082015181840152602081019050612a9d565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ae082612a7e565b612aea8185612a89565b9350612afa818560208601612a9a565b612b0381612ac4565b840191505092915050565b60006020820190508181036000830152612b288184612ad5565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b5b82612b30565b9050919050565b612b6b81612b50565b8114612b7657600080fd5b50565b600081359050612b8881612b62565b92915050565b600060208284031215612ba457612ba36129eb565b5b6000612bb284828501612b79565b91505092915050565b600060208284031215612bd157612bd06129eb565b5b6000612bdf84828501612a16565b91505092915050565b612bf181612b50565b82525050565b6000602082019050612c0c6000830184612be8565b92915050565b6000819050919050565b612c2581612c12565b82525050565b6000602082019050612c406000830184612c1c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c8382612ac4565b810181811067ffffffffffffffff82111715612ca257612ca1612c4b565b5b80604052505050565b6000612cb56129e1565b9050612cc18282612c7a565b919050565b600067ffffffffffffffff821115612ce157612ce0612c4b565b5b602082029050602081019050919050565b600080fd5b6000612d0a612d0584612cc6565b612cab565b90508083825260208201905060208402830185811115612d2d57612d2c612cf2565b5b835b81811015612d565780612d428882612a16565b845260208401935050602081019050612d2f565b5050509392505050565b600082601f830112612d7557612d74612c46565b5b8135612d85848260208601612cf7565b91505092915050565b600080fd5b600067ffffffffffffffff821115612dae57612dad612c4b565b5b612db782612ac4565b9050602081019050919050565b82818337600083830152505050565b6000612de6612de184612d93565b612cab565b905082815260208101848484011115612e0257612e01612d8e565b5b612e0d848285612dc4565b509392505050565b600082601f830112612e2a57612e29612c46565b5b8135612e3a848260208601612dd3565b91505092915050565b600080600080600060a08688031215612e5f57612e5e6129eb565b5b6000612e6d88828901612a16565b9550506020612e7e88828901612a16565b945050604086013567ffffffffffffffff811115612e9f57612e9e6129f0565b5b612eab88828901612d60565b935050606086013567ffffffffffffffff811115612ecc57612ecb6129f0565b5b612ed888828901612e15565b925050608086013567ffffffffffffffff811115612ef957612ef86129f0565b5b612f0588828901612e15565b9150509295509295909350565b60008115159050919050565b612f2781612f12565b82525050565b6000602082019050612f426000830184612f1e565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612f7d81612b50565b82525050565b6000612f8f8383612f74565b60208301905092915050565b6000602082019050919050565b6000612fb382612f48565b612fbd8185612f53565b9350612fc883612f64565b8060005b83811015612ff9578151612fe08882612f83565b9750612feb83612f9b565b925050600181019050612fcc565b5085935050505092915050565b600060208201905081810360008301526130208184612fa8565b905092915050565b600080fd5b60008083601f84011261304357613042612c46565b5b8235905067ffffffffffffffff8111156130605761305f613028565b5b60208301915083602082028301111561307c5761307b612cf2565b5b9250929050565b6000806020838503121561309a576130996129eb565b5b600083013567ffffffffffffffff8111156130b8576130b76129f0565b5b6130c48582860161302d565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000613123826130fc565b61312d8185613107565b935061313d818560208601612a9a565b61314681612ac4565b840191505092915050565b600061315d8383613118565b905092915050565b6000602082019050919050565b600061317d826130d0565b61318781856130db565b935083602082028501613199856130ec565b8060005b858110156131d557848403895281516131b68582613151565b94506131c183613165565b925060208a0199505060018101905061319d565b50829750879550505050505092915050565b600060208201905081810360008301526132018184613172565b905092915050565b600067ffffffffffffffff82111561322457613223612c4b565b5b602082029050602081019050919050565b600061324861324384613209565b612cab565b9050808382526020820190506020840283018581111561326b5761326a612cf2565b5b835b8181101561329457806132808882612b79565b84526020840193505060208101905061326d565b5050509392505050565b600082601f8301126132b3576132b2612c46565b5b81356132c3848260208601613235565b91505092915050565b600080604083850312156132e3576132e26129eb565b5b60006132f185828601612a16565b925050602083013567ffffffffffffffff811115613312576133116129f0565b5b61331e8582860161329e565b9150509250929050565b6000806040838503121561333f5761333e6129eb565b5b600061334d85828601612a16565b925050602061335e85828601612b79565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133af57607f821691505b6020821081036133c2576133c1613368565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061340282612c12565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613434576134336133c8565b5b600182019050919050565b613448816129f5565b82525050565b6000602082019050613463600083018461343f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060608201905081810360008301526134b28186612ad5565b905081810360208301526134c68185612ad5565b90506134d56040830184612be8565b949350505050565b60006040820190506134f26000830185612be8565b6134ff6020830184612be8565b9392505050565b600061351182612c12565b915061351c83612c12565b9250828203905081811115613534576135336133c8565b5b92915050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126135665761356561353a565b5b80840192508235915067ffffffffffffffff8211156135885761358761353f565b5b6020830192506001820236038313156135a4576135a3613544565b5b509250929050565b600081905092915050565b60006135c383856135ac565b93506135d0838584612dc4565b82840190509392505050565b60006135e98284866135b7565b91508190509392505050565b600061360861360384612d93565b612cab565b90508281526020810184848401111561362457613623612d8e565b5b61362f848285612a9a565b509392505050565b600082601f83011261364c5761364b612c46565b5b815161365c8482602086016135f5565b91505092915050565b60006020828403121561367b5761367a6129eb565b5b600082015167ffffffffffffffff811115613699576136986129f0565b5b6136a584828501613637565b91505092915050565b60006136b9826130fc565b6136c381856135ac565b93506136d3818560208601612a9a565b80840191505092915050565b60006136eb82846136ae565b915081905092915050565b7f75736563616e6e6f6e2e63616e6e6f6e2e72656769737472792e65666669636960008201527f656e740000000000000000000000000000000000000000000000000000000000602082015250565b6000613752602383612a89565b915061375d826136f6565b604082019050919050565b6000602082019050818103600083015261378181613745565b9050919050565b7f75736563616e6e6f6e2e63616e6e6f6e2e726567697374727900000000000000600082015250565b60006137be601983612a89565b91506137c982613788565b602082019050919050565b600060208201905081810360008301526137ed816137b1565b9050919050565b7f696f2e73796e7468657469782e636f72652d636f6e7472616374732e4f776e6160008201527f626c650000000000000000000000000000000000000000000000000000000000602082015250565b6000613850602383612a89565b915061385b826137f4565b604082019050919050565b6000602082019050818103600083015261387f81613843565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826138ab565b6138f286836138ab565b95508019841693508086168417925050509392505050565b6000819050919050565b600061392f61392a61392584612c12565b61390a565b612c12565b9050919050565b6000819050919050565b61394983613914565b61395d61395582613936565b8484546138b8565b825550505050565b600090565b613972613965565b61397d818484613940565b505050565b5b818110156139a15761399660008261396a565b600181019050613983565b5050565b601f8211156139e6576139b781613886565b6139c08461389b565b810160208510156139cf578190505b6139e36139db8561389b565b830182613982565b50505b505050565b600082821c905092915050565b6000613a09600019846008026139eb565b1980831691505092915050565b6000613a2283836139f8565b9150826002028217905092915050565b613a3b82612a7e565b67ffffffffffffffff811115613a5457613a53612c4b565b5b613a5e8254613397565b613a698282856139a5565b600060209050601f831160018114613a9c5760008415613a8a578287015190505b613a948582613a16565b865550613afc565b601f198416613aaa86613886565b60005b82811015613ad257848901518255600182019150602085019450602081019050613aad565b86831015613aef5784890151613aeb601f8916826139f8565b8355505b6001600288020188555050505b505050505050565b7f696f2e73796e7468657469782e636f72652d636f6e7472616374732e50726f7860008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b60602183612a89565b9150613b6b82613b04565b604082019050919050565b60006020820190508181036000830152613b8f81613b53565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b613bdd613bd882613b96565b613bc2565b82525050565b6000613bef8284613bcc565b6004820191508190509291505056fea264697066735822122020cb5472c05dec0a30ea0f90fb36ac6444693b24d270f9ad4dff48832a1ed8dc64736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.