Overview
CELO Balance
CELO Value
$0.00More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
View more zero value Internal Transactions in Advanced View mode
Loading...
Loading
Contract Name:
StableTokenEUR
Compiler Version
v0.5.13+commit.5b0b510c
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.5.13; import "./StableToken.sol"; contract StableTokenEUR is StableToken { /** * @notice Sets initialized == true on implementation contracts. * @param test Set to true to skip implementation initialization. */ constructor(bool test) public StableToken(test) {} /** * @notice Returns the storage, major, minor, and patch version of the contract. * @dev This function is overloaded to maintain a distinct version from StableToken.sol. * @return The storage, major, minor, and patch version of the contract. */ function getVersionNumber() external pure returns (uint256, uint256, uint256, uint256) { return (1, 1, 0, 1); } }
pragma solidity ^0.5.13; contract CalledByVm { modifier onlyVm() { require(msg.sender == address(0), "Only VM can call"); _; } }
pragma solidity ^0.5.13; /** * @title FixidityLib * @author Gadi Guy, Alberto Cuesta Canada * @notice This library provides fixed point arithmetic with protection against * overflow. * All operations are done with uint256 and the operands must have been created * with any of the newFrom* functions, which shift the comma digits() to the * right and check for limits, or with wrap() which expects a number already * in the internal representation of a fraction. * When using this library be sure to use maxNewFixed() as the upper limit for * creation of fixed point numbers. * @dev All contained functions are pure and thus marked internal to be inlined * on consuming contracts at compile time for gas efficiency. */ library FixidityLib { struct Fraction { uint256 value; } /** * @notice Number of positions that the comma is shifted to the right. */ function digits() internal pure returns (uint8) { return 24; } uint256 private constant FIXED1_UINT = 1000000000000000000000000; /** * @notice This is 1 in the fixed point units used in this library. * @dev Test fixed1() equals 10^digits() * Hardcoded to 24 digits. */ function fixed1() internal pure returns (Fraction memory) { return Fraction(FIXED1_UINT); } /** * @notice Wrap a uint256 that represents a 24-decimal fraction in a Fraction * struct. * @param x Number that already represents a 24-decimal fraction. * @return A Fraction struct with contents x. */ function wrap(uint256 x) internal pure returns (Fraction memory) { return Fraction(x); } /** * @notice Unwraps the uint256 inside of a Fraction struct. */ function unwrap(Fraction memory x) internal pure returns (uint256) { return x.value; } /** * @notice The amount of decimals lost on each multiplication operand. * @dev Test mulPrecision() equals sqrt(fixed1) */ function mulPrecision() internal pure returns (uint256) { return 1000000000000; } /** * @notice Maximum value that can be converted to fixed point. Optimize for deployment. * @dev * Test maxNewFixed() equals maxUint256() / fixed1() */ function maxNewFixed() internal pure returns (uint256) { return 115792089237316195423570985008687907853269984665640564; } /** * @notice Converts a uint256 to fixed point Fraction * @dev Test newFixed(0) returns 0 * Test newFixed(1) returns fixed1() * Test newFixed(maxNewFixed()) returns maxNewFixed() * fixed1() * Test newFixed(maxNewFixed()+1) fails */ function newFixed(uint256 x) internal pure returns (Fraction memory) { require(x <= maxNewFixed(), "can't create fixidity number larger than maxNewFixed()"); return Fraction(x * FIXED1_UINT); } /** * @notice Converts a uint256 in the fixed point representation of this * library to a non decimal. All decimal digits will be truncated. */ function fromFixed(Fraction memory x) internal pure returns (uint256) { return x.value / FIXED1_UINT; } /** * @notice Converts two uint256 representing a fraction to fixed point units, * equivalent to multiplying dividend and divisor by 10^digits(). * @param numerator numerator must be <= maxNewFixed() * @param denominator denominator must be <= maxNewFixed() and denominator can't be 0 * @dev * Test newFixedFraction(1,0) fails * Test newFixedFraction(0,1) returns 0 * Test newFixedFraction(1,1) returns fixed1() * Test newFixedFraction(1,fixed1()) returns 1 */ function newFixedFraction(uint256 numerator, uint256 denominator) internal pure returns (Fraction memory) { Fraction memory convertedNumerator = newFixed(numerator); Fraction memory convertedDenominator = newFixed(denominator); return divide(convertedNumerator, convertedDenominator); } /** * @notice Returns the integer part of a fixed point number. * @dev * Test integer(0) returns 0 * Test integer(fixed1()) returns fixed1() * Test integer(newFixed(maxNewFixed())) returns maxNewFixed()*fixed1() */ function integer(Fraction memory x) internal pure returns (Fraction memory) { return Fraction((x.value / FIXED1_UINT) * FIXED1_UINT); // Can't overflow } /** * @notice Returns the fractional part of a fixed point number. * In the case of a negative number the fractional is also negative. * @dev * Test fractional(0) returns 0 * Test fractional(fixed1()) returns 0 * Test fractional(fixed1()-1) returns 10^24-1 */ function fractional(Fraction memory x) internal pure returns (Fraction memory) { return Fraction(x.value - (x.value / FIXED1_UINT) * FIXED1_UINT); // Can't overflow } /** * @notice x+y. * @dev The maximum value that can be safely used as an addition operator is defined as * maxFixedAdd = maxUint256()-1 / 2, or * 57896044618658097711785492504343953926634992332820282019728792003956564819967. * Test add(maxFixedAdd,maxFixedAdd) equals maxFixedAdd + maxFixedAdd * Test add(maxFixedAdd+1,maxFixedAdd+1) throws */ function add(Fraction memory x, Fraction memory y) internal pure returns (Fraction memory) { uint256 z = x.value + y.value; require(z >= x.value, "add overflow detected"); return Fraction(z); } /** * @notice x-y. * @dev * Test subtract(6, 10) fails */ function subtract(Fraction memory x, Fraction memory y) internal pure returns (Fraction memory) { require(x.value >= y.value, "substraction underflow detected"); return Fraction(x.value - y.value); } /** * @notice x*y. If any of the operators is higher than the max multiplier value it * might overflow. * @dev The maximum value that can be safely used as a multiplication operator * (maxFixedMul) is calculated as sqrt(maxUint256()*fixed1()), * or 340282366920938463463374607431768211455999999999999 * Test multiply(0,0) returns 0 * Test multiply(maxFixedMul,0) returns 0 * Test multiply(0,maxFixedMul) returns 0 * Test multiply(fixed1()/mulPrecision(),fixed1()*mulPrecision()) returns fixed1() * Test multiply(maxFixedMul,maxFixedMul) is around maxUint256() * Test multiply(maxFixedMul+1,maxFixedMul+1) fails */ function multiply(Fraction memory x, Fraction memory y) internal pure returns (Fraction memory) { if (x.value == 0 || y.value == 0) return Fraction(0); if (y.value == FIXED1_UINT) return x; if (x.value == FIXED1_UINT) return y; // Separate into integer and fractional parts // x = x1 + x2, y = y1 + y2 uint256 x1 = integer(x).value / FIXED1_UINT; uint256 x2 = fractional(x).value; uint256 y1 = integer(y).value / FIXED1_UINT; uint256 y2 = fractional(y).value; // (x1 + x2) * (y1 + y2) = (x1 * y1) + (x1 * y2) + (x2 * y1) + (x2 * y2) uint256 x1y1 = x1 * y1; if (x1 != 0) require(x1y1 / x1 == y1, "overflow x1y1 detected"); // x1y1 needs to be multiplied back by fixed1 // solium-disable-next-line mixedcase uint256 fixed_x1y1 = x1y1 * FIXED1_UINT; if (x1y1 != 0) require(fixed_x1y1 / x1y1 == FIXED1_UINT, "overflow x1y1 * fixed1 detected"); x1y1 = fixed_x1y1; uint256 x2y1 = x2 * y1; if (x2 != 0) require(x2y1 / x2 == y1, "overflow x2y1 detected"); uint256 x1y2 = x1 * y2; if (x1 != 0) require(x1y2 / x1 == y2, "overflow x1y2 detected"); x2 = x2 / mulPrecision(); y2 = y2 / mulPrecision(); uint256 x2y2 = x2 * y2; if (x2 != 0) require(x2y2 / x2 == y2, "overflow x2y2 detected"); // result = fixed1() * x1 * y1 + x1 * y2 + x2 * y1 + x2 * y2 / fixed1(); Fraction memory result = Fraction(x1y1); result = add(result, Fraction(x2y1)); // Add checks for overflow result = add(result, Fraction(x1y2)); // Add checks for overflow result = add(result, Fraction(x2y2)); // Add checks for overflow return result; } /** * @notice 1/x * @dev * Test reciprocal(0) fails * Test reciprocal(fixed1()) returns fixed1() * Test reciprocal(fixed1()*fixed1()) returns 1 // Testing how the fractional is truncated * Test reciprocal(1+fixed1()*fixed1()) returns 0 // Testing how the fractional is truncated * Test reciprocal(newFixedFraction(1, 1e24)) returns newFixed(1e24) */ function reciprocal(Fraction memory x) internal pure returns (Fraction memory) { require(x.value != 0, "can't call reciprocal(0)"); return Fraction((FIXED1_UINT * FIXED1_UINT) / x.value); // Can't overflow } /** * @notice x/y. If the dividend is higher than the max dividend value, it * might overflow. You can use multiply(x,reciprocal(y)) instead. * @dev The maximum value that can be safely used as a dividend (maxNewFixed) is defined as * divide(maxNewFixed,newFixedFraction(1,fixed1())) is around maxUint256(). * This yields the value 115792089237316195423570985008687907853269984665640564. * Test maxNewFixed equals maxUint256()/fixed1() * Test divide(maxNewFixed,1) equals maxNewFixed*(fixed1) * Test divide(maxNewFixed+1,multiply(mulPrecision(),mulPrecision())) throws * Test divide(fixed1(),0) fails * Test divide(maxNewFixed,1) = maxNewFixed*(10^digits()) * Test divide(maxNewFixed+1,1) throws */ function divide(Fraction memory x, Fraction memory y) internal pure returns (Fraction memory) { require(y.value != 0, "can't divide by 0"); uint256 X = x.value * FIXED1_UINT; require(X / FIXED1_UINT == x.value, "overflow at divide"); return Fraction(X / y.value); } /** * @notice x > y */ function gt(Fraction memory x, Fraction memory y) internal pure returns (bool) { return x.value > y.value; } /** * @notice x >= y */ function gte(Fraction memory x, Fraction memory y) internal pure returns (bool) { return x.value >= y.value; } /** * @notice x < y */ function lt(Fraction memory x, Fraction memory y) internal pure returns (bool) { return x.value < y.value; } /** * @notice x <= y */ function lte(Fraction memory x, Fraction memory y) internal pure returns (bool) { return x.value <= y.value; } /** * @notice x == y */ function equals(Fraction memory x, Fraction memory y) internal pure returns (bool) { return x.value == y.value; } /** * @notice x <= 1 */ function isProperFraction(Fraction memory x) internal pure returns (bool) { return lte(x, fixed1()); } }
pragma solidity ^0.5.13; import "./UsingRegistry.sol"; contract Freezable is UsingRegistry { // onlyWhenNotFrozen functions can only be called when `frozen` is false, otherwise they will // revert. modifier onlyWhenNotFrozen() { require(!getFreezer().isFrozen(address(this)), "can't call when contract is frozen"); _; } }
pragma solidity ^0.5.13; contract Initializable { bool public initialized; constructor(bool testingDeployment) public { if (!testingDeployment) { initialized = true; } } modifier initializer() { require(!initialized, "contract already initialized"); initialized = true; _; } }
pragma solidity ^0.5.13; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "../common/interfaces/ICeloVersionedContract.sol"; contract UsingPrecompiles { using SafeMath for uint256; address constant TRANSFER = address(0xff - 2); address constant FRACTION_MUL = address(0xff - 3); address constant PROOF_OF_POSSESSION = address(0xff - 4); address constant GET_VALIDATOR = address(0xff - 5); address constant NUMBER_VALIDATORS = address(0xff - 6); address constant EPOCH_SIZE = address(0xff - 7); address constant BLOCK_NUMBER_FROM_HEADER = address(0xff - 8); address constant HASH_HEADER = address(0xff - 9); address constant GET_PARENT_SEAL_BITMAP = address(0xff - 10); address constant GET_VERIFIED_SEAL_BITMAP = address(0xff - 11); /** * @notice calculate a * b^x for fractions a, b to `decimals` precision * @param aNumerator Numerator of first fraction * @param aDenominator Denominator of first fraction * @param bNumerator Numerator of exponentiated fraction * @param bDenominator Denominator of exponentiated fraction * @param exponent exponent to raise b to * @param _decimals precision * @return numerator/denominator of the computed quantity (not reduced). */ function fractionMulExp( uint256 aNumerator, uint256 aDenominator, uint256 bNumerator, uint256 bDenominator, uint256 exponent, uint256 _decimals ) public view returns (uint256, uint256) { require(aDenominator != 0 && bDenominator != 0, "a denominator is zero"); uint256 returnNumerator; uint256 returnDenominator; bool success; bytes memory out; (success, out) = FRACTION_MUL.staticcall( abi.encodePacked(aNumerator, aDenominator, bNumerator, bDenominator, exponent, _decimals) ); require(success, "error calling fractionMulExp precompile"); returnNumerator = getUint256FromBytes(out, 0); returnDenominator = getUint256FromBytes(out, 32); return (returnNumerator, returnDenominator); } /** * @notice Returns the current epoch size in blocks. * @return The current epoch size in blocks. */ function getEpochSize() public view returns (uint256) { bytes memory out; bool success; (success, out) = EPOCH_SIZE.staticcall(abi.encodePacked()); require(success, "error calling getEpochSize precompile"); return getUint256FromBytes(out, 0); } /** * @notice Returns the epoch number at a block. * @param blockNumber Block number where epoch number is calculated. * @return Epoch number. */ function getEpochNumberOfBlock(uint256 blockNumber) public view returns (uint256) { return epochNumberOfBlock(blockNumber, getEpochSize()); } /** * @notice Returns the epoch number at a block. * @return Current epoch number. */ function getEpochNumber() public view returns (uint256) { return getEpochNumberOfBlock(block.number); } /** * @notice Returns the epoch number at a block. * @param blockNumber Block number where epoch number is calculated. * @param epochSize The epoch size in blocks. * @return Epoch number. */ function epochNumberOfBlock(uint256 blockNumber, uint256 epochSize) internal pure returns (uint256) { // Follows GetEpochNumber from celo-blockchain/blob/master/consensus/istanbul/utils.go uint256 epochNumber = blockNumber / epochSize; if (blockNumber % epochSize == 0) { return epochNumber; } else { return epochNumber.add(1); } } /** * @notice Gets a validator address from the current validator set. * @param index Index of requested validator in the validator set. * @return Address of validator at the requested index. */ function validatorSignerAddressFromCurrentSet(uint256 index) public view returns (address) { bytes memory out; bool success; (success, out) = GET_VALIDATOR.staticcall(abi.encodePacked(index, uint256(block.number))); require(success, "error calling validatorSignerAddressFromCurrentSet precompile"); return address(getUint256FromBytes(out, 0)); } /** * @notice Gets a validator address from the validator set at the given block number. * @param index Index of requested validator in the validator set. * @param blockNumber Block number to retrieve the validator set from. * @return Address of validator at the requested index. */ function validatorSignerAddressFromSet(uint256 index, uint256 blockNumber) public view returns (address) { bytes memory out; bool success; (success, out) = GET_VALIDATOR.staticcall(abi.encodePacked(index, blockNumber)); require(success, "error calling validatorSignerAddressFromSet precompile"); return address(getUint256FromBytes(out, 0)); } /** * @notice Gets the size of the current elected validator set. * @return Size of the current elected validator set. */ function numberValidatorsInCurrentSet() public view returns (uint256) { bytes memory out; bool success; (success, out) = NUMBER_VALIDATORS.staticcall(abi.encodePacked(uint256(block.number))); require(success, "error calling numberValidatorsInCurrentSet precompile"); return getUint256FromBytes(out, 0); } /** * @notice Gets the size of the validator set that must sign the given block number. * @param blockNumber Block number to retrieve the validator set from. * @return Size of the validator set. */ function numberValidatorsInSet(uint256 blockNumber) public view returns (uint256) { bytes memory out; bool success; (success, out) = NUMBER_VALIDATORS.staticcall(abi.encodePacked(blockNumber)); require(success, "error calling numberValidatorsInSet precompile"); return getUint256FromBytes(out, 0); } /** * @notice Checks a BLS proof of possession. * @param sender The address signed by the BLS key to generate the proof of possession. * @param blsKey The BLS public key that the validator is using for consensus, should pass proof * of possession. 48 bytes. * @param blsPop The BLS public key proof-of-possession, which consists of a signature on the * account address. 96 bytes. * @return True upon success. */ function checkProofOfPossession(address sender, bytes memory blsKey, bytes memory blsPop) public view returns (bool) { bool success; (success, ) = PROOF_OF_POSSESSION.staticcall(abi.encodePacked(sender, blsKey, blsPop)); return success; } /** * @notice Parses block number out of header. * @param header RLP encoded header * @return Block number. */ function getBlockNumberFromHeader(bytes memory header) public view returns (uint256) { bytes memory out; bool success; (success, out) = BLOCK_NUMBER_FROM_HEADER.staticcall(abi.encodePacked(header)); require(success, "error calling getBlockNumberFromHeader precompile"); return getUint256FromBytes(out, 0); } /** * @notice Computes hash of header. * @param header RLP encoded header * @return Header hash. */ function hashHeader(bytes memory header) public view returns (bytes32) { bytes memory out; bool success; (success, out) = HASH_HEADER.staticcall(abi.encodePacked(header)); require(success, "error calling hashHeader precompile"); return getBytes32FromBytes(out, 0); } /** * @notice Gets the parent seal bitmap from the header at the given block number. * @param blockNumber Block number to retrieve. Must be within 4 epochs of the current number. * @return Bitmap parent seal with set bits at indices corresponding to signing validators. */ function getParentSealBitmap(uint256 blockNumber) public view returns (bytes32) { bytes memory out; bool success; (success, out) = GET_PARENT_SEAL_BITMAP.staticcall(abi.encodePacked(blockNumber)); require(success, "error calling getParentSealBitmap precompile"); return getBytes32FromBytes(out, 0); } /** * @notice Verifies the BLS signature on the header and returns the seal bitmap. * The validator set used for verification is retrieved based on the parent hash field of the * header. If the parent hash is not in the blockchain, verification fails. * @param header RLP encoded header * @return Bitmap parent seal with set bits at indices correspoinding to signing validators. */ function getVerifiedSealBitmapFromHeader(bytes memory header) public view returns (bytes32) { bytes memory out; bool success; (success, out) = GET_VERIFIED_SEAL_BITMAP.staticcall(abi.encodePacked(header)); require(success, "error calling getVerifiedSealBitmapFromHeader precompile"); return getBytes32FromBytes(out, 0); } /** * @notice Converts bytes to uint256. * @param bs byte[] data * @param start offset into byte data to convert * @return uint256 data */ function getUint256FromBytes(bytes memory bs, uint256 start) internal pure returns (uint256) { return uint256(getBytes32FromBytes(bs, start)); } /** * @notice Converts bytes to bytes32. * @param bs byte[] data * @param start offset into byte data to convert * @return bytes32 data */ function getBytes32FromBytes(bytes memory bs, uint256 start) internal pure returns (bytes32) { require(bs.length >= start.add(32), "slicing out of range"); bytes32 x; assembly { x := mload(add(bs, add(start, 32))) } return x; } /** * @notice Returns the minimum number of required signers for a given block number. * @dev Computed in celo-blockchain as int(math.Ceil(float64(2*valSet.Size()) / 3)) */ function minQuorumSize(uint256 blockNumber) public view returns (uint256) { return numberValidatorsInSet(blockNumber).mul(2).add(2).div(3); } /** * @notice Computes byzantine quorum from current validator set size * @return Byzantine quorum of validators. */ function minQuorumSizeInCurrentSet() public view returns (uint256) { return minQuorumSize(block.number); } }
pragma solidity ^0.5.13; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IAccounts.sol"; import "./interfaces/IFeeCurrencyWhitelist.sol"; import "./interfaces/IFreezer.sol"; import "./interfaces/IRegistry.sol"; import "../governance/interfaces/IElection.sol"; import "../governance/interfaces/IGovernance.sol"; import "../governance/interfaces/ILockedGold.sol"; import "../governance/interfaces/IValidators.sol"; import "../identity/interfaces/IRandom.sol"; import "../identity/interfaces/IAttestations.sol"; import "../stability/interfaces/IExchange.sol"; import "../stability/interfaces/IReserve.sol"; import "../stability/interfaces/ISortedOracles.sol"; import "../stability/interfaces/IStableToken.sol"; contract UsingRegistry is Ownable { event RegistrySet(address indexed registryAddress); // solhint-disable state-visibility bytes32 constant ACCOUNTS_REGISTRY_ID = keccak256(abi.encodePacked("Accounts")); bytes32 constant ATTESTATIONS_REGISTRY_ID = keccak256(abi.encodePacked("Attestations")); bytes32 constant DOWNTIME_SLASHER_REGISTRY_ID = keccak256(abi.encodePacked("DowntimeSlasher")); bytes32 constant DOUBLE_SIGNING_SLASHER_REGISTRY_ID = keccak256( abi.encodePacked("DoubleSigningSlasher") ); bytes32 constant ELECTION_REGISTRY_ID = keccak256(abi.encodePacked("Election")); bytes32 constant EXCHANGE_REGISTRY_ID = keccak256(abi.encodePacked("Exchange")); bytes32 constant FEE_CURRENCY_WHITELIST_REGISTRY_ID = keccak256( abi.encodePacked("FeeCurrencyWhitelist") ); bytes32 constant FREEZER_REGISTRY_ID = keccak256(abi.encodePacked("Freezer")); bytes32 constant GOLD_TOKEN_REGISTRY_ID = keccak256(abi.encodePacked("GoldToken")); bytes32 constant GOVERNANCE_REGISTRY_ID = keccak256(abi.encodePacked("Governance")); bytes32 constant GOVERNANCE_SLASHER_REGISTRY_ID = keccak256( abi.encodePacked("GovernanceSlasher") ); bytes32 constant LOCKED_GOLD_REGISTRY_ID = keccak256(abi.encodePacked("LockedGold")); bytes32 constant RESERVE_REGISTRY_ID = keccak256(abi.encodePacked("Reserve")); bytes32 constant RANDOM_REGISTRY_ID = keccak256(abi.encodePacked("Random")); bytes32 constant SORTED_ORACLES_REGISTRY_ID = keccak256(abi.encodePacked("SortedOracles")); bytes32 constant STABLE_TOKEN_REGISTRY_ID = keccak256(abi.encodePacked("StableToken")); bytes32 constant VALIDATORS_REGISTRY_ID = keccak256(abi.encodePacked("Validators")); // solhint-enable state-visibility IRegistry public registry; modifier onlyRegisteredContract(bytes32 identifierHash) { require(registry.getAddressForOrDie(identifierHash) == msg.sender, "only registered contract"); _; } modifier onlyRegisteredContracts(bytes32[] memory identifierHashes) { require(registry.isOneOf(identifierHashes, msg.sender), "only registered contracts"); _; } /** * @notice Updates the address pointing to a Registry contract. * @param registryAddress The address of a registry contract for routing to other contracts. */ function setRegistry(address registryAddress) public onlyOwner { require(registryAddress != address(0), "Cannot register the null address"); registry = IRegistry(registryAddress); emit RegistrySet(registryAddress); } function getAccounts() internal view returns (IAccounts) { return IAccounts(registry.getAddressForOrDie(ACCOUNTS_REGISTRY_ID)); } function getAttestations() internal view returns (IAttestations) { return IAttestations(registry.getAddressForOrDie(ATTESTATIONS_REGISTRY_ID)); } function getElection() internal view returns (IElection) { return IElection(registry.getAddressForOrDie(ELECTION_REGISTRY_ID)); } function getExchange() internal view returns (IExchange) { return IExchange(registry.getAddressForOrDie(EXCHANGE_REGISTRY_ID)); } function getFeeCurrencyWhitelistRegistry() internal view returns (IFeeCurrencyWhitelist) { return IFeeCurrencyWhitelist(registry.getAddressForOrDie(FEE_CURRENCY_WHITELIST_REGISTRY_ID)); } function getFreezer() internal view returns (IFreezer) { return IFreezer(registry.getAddressForOrDie(FREEZER_REGISTRY_ID)); } function getGoldToken() internal view returns (IERC20) { return IERC20(registry.getAddressForOrDie(GOLD_TOKEN_REGISTRY_ID)); } function getGovernance() internal view returns (IGovernance) { return IGovernance(registry.getAddressForOrDie(GOVERNANCE_REGISTRY_ID)); } function getLockedGold() internal view returns (ILockedGold) { return ILockedGold(registry.getAddressForOrDie(LOCKED_GOLD_REGISTRY_ID)); } function getRandom() internal view returns (IRandom) { return IRandom(registry.getAddressForOrDie(RANDOM_REGISTRY_ID)); } function getReserve() internal view returns (IReserve) { return IReserve(registry.getAddressForOrDie(RESERVE_REGISTRY_ID)); } function getSortedOracles() internal view returns (ISortedOracles) { return ISortedOracles(registry.getAddressForOrDie(SORTED_ORACLES_REGISTRY_ID)); } function getStableToken() internal view returns (IStableToken) { return IStableToken(registry.getAddressForOrDie(STABLE_TOKEN_REGISTRY_ID)); } function getValidators() internal view returns (IValidators) { return IValidators(registry.getAddressForOrDie(VALIDATORS_REGISTRY_ID)); } }
pragma solidity ^0.5.13; interface IAccounts { function isAccount(address) external view returns (bool); function voteSignerToAccount(address) external view returns (address); function validatorSignerToAccount(address) external view returns (address); function attestationSignerToAccount(address) external view returns (address); function signerToAccount(address) external view returns (address); function getAttestationSigner(address) external view returns (address); function getValidatorSigner(address) external view returns (address); function getVoteSigner(address) external view returns (address); function hasAuthorizedVoteSigner(address) external view returns (bool); function hasAuthorizedValidatorSigner(address) external view returns (bool); function hasAuthorizedAttestationSigner(address) external view returns (bool); function setAccountDataEncryptionKey(bytes calldata) external; function setMetadataURL(string calldata) external; function setName(string calldata) external; function setWalletAddress(address, uint8, bytes32, bytes32) external; function setAccount(string calldata, bytes calldata, address, uint8, bytes32, bytes32) external; function getDataEncryptionKey(address) external view returns (bytes memory); function getWalletAddress(address) external view returns (address); function getMetadataURL(address) external view returns (string memory); function batchGetMetadataURL(address[] calldata) external view returns (uint256[] memory, bytes memory); function getName(address) external view returns (string memory); function authorizeVoteSigner(address, uint8, bytes32, bytes32) external; function authorizeValidatorSigner(address, uint8, bytes32, bytes32) external; function authorizeValidatorSignerWithPublicKey(address, uint8, bytes32, bytes32, bytes calldata) external; function authorizeValidatorSignerWithKeys( address, uint8, bytes32, bytes32, bytes calldata, bytes calldata, bytes calldata ) external; function authorizeAttestationSigner(address, uint8, bytes32, bytes32) external; function createAccount() external returns (bool); }
pragma solidity ^0.5.13; /** * @title This interface describes the non- ERC20 shared interface for all Celo Tokens, and * in the absence of interface inheritance is intended as a companion to IERC20.sol. */ interface ICeloToken { function transferWithComment(address, uint256, string calldata) external returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); }
pragma solidity ^0.5.13; interface ICeloVersionedContract { /** * @notice Returns the storage, major, minor, and patch version of the contract. * @return The storage, major, minor, and patch version of the contract. */ function getVersionNumber() external pure returns (uint256, uint256, uint256, uint256); }
pragma solidity ^0.5.13; interface IFeeCurrencyWhitelist { function addToken(address) external; function getWhitelist() external view returns (address[] memory); }
pragma solidity ^0.5.13; interface IFreezer { function isFrozen(address) external view returns (bool); }
pragma solidity ^0.5.13; interface IRegistry { function setAddressFor(string calldata, address) external; function getAddressForOrDie(bytes32) external view returns (address); function getAddressFor(bytes32) external view returns (address); function getAddressForStringOrDie(string calldata identifier) external view returns (address); function getAddressForString(string calldata identifier) external view returns (address); function isOneOf(bytes32[] calldata, address) external view returns (bool); }
pragma solidity ^0.5.13; interface IElection { function electValidatorSigners() external view returns (address[] memory); function electNValidatorSigners(uint256, uint256) external view returns (address[] memory); function vote(address, uint256, address, address) external returns (bool); function activate(address) external returns (bool); function revokeActive(address, uint256, address, address, uint256) external returns (bool); function revokeAllActive(address, address, address, uint256) external returns (bool); function revokePending(address, uint256, address, address, uint256) external returns (bool); function markGroupIneligible(address) external; function markGroupEligible(address, address, address) external; function forceDecrementVotes( address, uint256, address[] calldata, address[] calldata, uint256[] calldata ) external returns (uint256); // view functions function getElectableValidators() external view returns (uint256, uint256); function getElectabilityThreshold() external view returns (uint256); function getNumVotesReceivable(address) external view returns (uint256); function getTotalVotes() external view returns (uint256); function getActiveVotes() external view returns (uint256); function getTotalVotesByAccount(address) external view returns (uint256); function getPendingVotesForGroupByAccount(address, address) external view returns (uint256); function getActiveVotesForGroupByAccount(address, address) external view returns (uint256); function getTotalVotesForGroupByAccount(address, address) external view returns (uint256); function getActiveVoteUnitsForGroupByAccount(address, address) external view returns (uint256); function getTotalVotesForGroup(address) external view returns (uint256); function getActiveVotesForGroup(address) external view returns (uint256); function getPendingVotesForGroup(address) external view returns (uint256); function getGroupEligibility(address) external view returns (bool); function getGroupEpochRewards(address, uint256, uint256[] calldata) external view returns (uint256); function getGroupsVotedForByAccount(address) external view returns (address[] memory); function getEligibleValidatorGroups() external view returns (address[] memory); function getTotalVotesForEligibleValidatorGroups() external view returns (address[] memory, uint256[] memory); function getCurrentValidatorSigners() external view returns (address[] memory); function canReceiveVotes(address, uint256) external view returns (bool); function hasActivatablePendingVotes(address, address) external view returns (bool); // only owner function setElectableValidators(uint256, uint256) external returns (bool); function setMaxNumGroupsVotedFor(uint256) external returns (bool); function setElectabilityThreshold(uint256) external returns (bool); // only VM function distributeEpochRewards(address, uint256, address, address) external; }
pragma solidity ^0.5.13; interface IGovernance { function isVoting(address) external view returns (bool); }
pragma solidity ^0.5.13; interface ILockedGold { function incrementNonvotingAccountBalance(address, uint256) external; function decrementNonvotingAccountBalance(address, uint256) external; function getAccountTotalLockedGold(address) external view returns (uint256); function getTotalLockedGold() external view returns (uint256); function getPendingWithdrawals(address) external view returns (uint256[] memory, uint256[] memory); function getTotalPendingWithdrawals(address) external view returns (uint256); function lock() external payable; function unlock(uint256) external; function relock(uint256, uint256) external; function withdraw(uint256) external; function slash( address account, uint256 penalty, address reporter, uint256 reward, address[] calldata lessers, address[] calldata greaters, uint256[] calldata indices ) external; function isSlasher(address) external view returns (bool); }
pragma solidity ^0.5.13; interface IValidators { function registerValidator(bytes calldata, bytes calldata, bytes calldata) external returns (bool); function deregisterValidator(uint256) external returns (bool); function affiliate(address) external returns (bool); function deaffiliate() external returns (bool); function updateBlsPublicKey(bytes calldata, bytes calldata) external returns (bool); function registerValidatorGroup(uint256) external returns (bool); function deregisterValidatorGroup(uint256) external returns (bool); function addMember(address) external returns (bool); function addFirstMember(address, address, address) external returns (bool); function removeMember(address) external returns (bool); function reorderMember(address, address, address) external returns (bool); function updateCommission() external; function setNextCommissionUpdate(uint256) external; function resetSlashingMultiplier() external; // only owner function setCommissionUpdateDelay(uint256) external; function setMaxGroupSize(uint256) external returns (bool); function setMembershipHistoryLength(uint256) external returns (bool); function setValidatorScoreParameters(uint256, uint256) external returns (bool); function setGroupLockedGoldRequirements(uint256, uint256) external returns (bool); function setValidatorLockedGoldRequirements(uint256, uint256) external returns (bool); function setSlashingMultiplierResetPeriod(uint256) external; // view functions function getMaxGroupSize() external view returns (uint256); function getCommissionUpdateDelay() external view returns (uint256); function getValidatorScoreParameters() external view returns (uint256, uint256); function getMembershipHistory(address) external view returns (uint256[] memory, address[] memory, uint256, uint256); function calculateEpochScore(uint256) external view returns (uint256); function calculateGroupEpochScore(uint256[] calldata) external view returns (uint256); function getAccountLockedGoldRequirement(address) external view returns (uint256); function meetsAccountLockedGoldRequirements(address) external view returns (bool); function getValidatorBlsPublicKeyFromSigner(address) external view returns (bytes memory); function getValidator(address account) external view returns (bytes memory, bytes memory, address, uint256, address); function getValidatorGroup(address) external view returns (address[] memory, uint256, uint256, uint256, uint256[] memory, uint256, uint256); function getGroupNumMembers(address) external view returns (uint256); function getTopGroupValidators(address, uint256) external view returns (address[] memory); function getGroupsNumMembers(address[] calldata accounts) external view returns (uint256[] memory); function getNumRegisteredValidators() external view returns (uint256); function groupMembershipInEpoch(address, uint256, uint256) external view returns (address); // only registered contract function updateEcdsaPublicKey(address, address, bytes calldata) external returns (bool); function updatePublicKeys(address, address, bytes calldata, bytes calldata, bytes calldata) external returns (bool); function getValidatorLockedGoldRequirements() external view returns (uint256, uint256); function getGroupLockedGoldRequirements() external view returns (uint256, uint256); function getRegisteredValidators() external view returns (address[] memory); function getRegisteredValidatorSigners() external view returns (address[] memory); function getRegisteredValidatorGroups() external view returns (address[] memory); function isValidatorGroup(address) external view returns (bool); function isValidator(address) external view returns (bool); function getValidatorGroupSlashingMultiplier(address) external view returns (uint256); function getMembershipInLastEpoch(address) external view returns (address); function getMembershipInLastEpochFromSigner(address) external view returns (address); // only VM function updateValidatorScoreFromSigner(address, uint256) external; function distributeEpochPaymentsFromSigner(address, uint256) external returns (uint256); // only slasher function forceDeaffiliateIfValidator(address) external; function halveSlashingMultiplier(address) external; }
pragma solidity ^0.5.13; interface IAttestations { function request(bytes32, uint256, address) external; function selectIssuers(bytes32) external; function complete(bytes32, uint8, bytes32, bytes32) external; function revoke(bytes32, uint256) external; function withdraw(address) external; function approveTransfer(bytes32, uint256, address, address, bool) external; // view functions function getUnselectedRequest(bytes32, address) external view returns (uint32, uint32, address); function getAttestationIssuers(bytes32, address) external view returns (address[] memory); function getAttestationStats(bytes32, address) external view returns (uint32, uint32); function batchGetAttestationStats(bytes32[] calldata) external view returns (uint256[] memory, address[] memory, uint64[] memory, uint64[] memory); function getAttestationState(bytes32, address, address) external view returns (uint8, uint32, address); function getCompletableAttestations(bytes32, address) external view returns (uint32[] memory, address[] memory, uint256[] memory, bytes memory); function getAttestationRequestFee(address) external view returns (uint256); function getMaxAttestations() external view returns (uint256); function validateAttestationCode(bytes32, address, uint8, bytes32, bytes32) external view returns (address); function lookupAccountsForIdentifier(bytes32) external view returns (address[] memory); function requireNAttestationsRequested(bytes32, address, uint32) external view; // only owner function setAttestationRequestFee(address, uint256) external; function setAttestationExpiryBlocks(uint256) external; function setSelectIssuersWaitBlocks(uint256) external; function setMaxAttestations(uint256) external; }
pragma solidity ^0.5.13; interface IRandom { function revealAndCommit(bytes32, bytes32, address) external; function randomnessBlockRetentionWindow() external view returns (uint256); function random() external view returns (bytes32); function getBlockRandomness(uint256) external view returns (bytes32); }
pragma solidity ^0.5.13; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IStableToken.sol"; import "../common/interfaces/ICeloToken.sol"; import "../common/interfaces/ICeloVersionedContract.sol"; import "../common/CalledByVm.sol"; import "../common/Initializable.sol"; import "../common/FixidityLib.sol"; import "../common/Freezable.sol"; import "../common/UsingRegistry.sol"; import "../common/UsingPrecompiles.sol"; /** * @title An ERC20 compliant token with adjustable supply. */ // solhint-disable-next-line max-line-length contract StableToken is ICeloVersionedContract, Ownable, Initializable, UsingRegistry, UsingPrecompiles, Freezable, CalledByVm, IStableToken, IERC20, ICeloToken { using FixidityLib for FixidityLib.Fraction; using SafeMath for uint256; event InflationFactorUpdated(uint256 factor, uint256 lastUpdated); event InflationParametersUpdated(uint256 rate, uint256 updatePeriod, uint256 lastUpdated); event Transfer(address indexed from, address indexed to, uint256 value); event TransferComment(string comment); bytes32 constant GRANDA_MENTO_REGISTRY_ID = keccak256(abi.encodePacked("GrandaMento")); string internal name_; string internal symbol_; uint8 internal decimals_; // Stored as units. Value can be found using unitsToValue(). mapping(address => uint256) internal balances; uint256 internal totalSupply_; // Stored as values. Units can be found using valueToUnits(). mapping(address => mapping(address => uint256)) internal allowed; // STABILITY FEE PARAMETERS // The `rate` is how much the `factor` is adjusted by per `updatePeriod`. // The `factor` describes units/value of StableToken, and is greater than or equal to 1. // The `updatePeriod` governs how often the `factor` is updated. // `factorLastUpdated` indicates when the inflation factor was last updated. struct InflationState { FixidityLib.Fraction rate; FixidityLib.Fraction factor; uint256 updatePeriod; uint256 factorLastUpdated; } InflationState inflationState; // The registry ID of the exchange contract with permission to mint and burn this token. // Unique per StableToken instance. bytes32 exchangeRegistryId; /** * @notice Recomputes and updates inflation factor if more than `updatePeriod` * has passed since last update. */ modifier updateInflationFactor() { FixidityLib.Fraction memory updatedInflationFactor; uint256 lastUpdated; (updatedInflationFactor, lastUpdated) = getUpdatedInflationFactor(); if (lastUpdated != inflationState.factorLastUpdated) { inflationState.factor = updatedInflationFactor; inflationState.factorLastUpdated = lastUpdated; emit InflationFactorUpdated(inflationState.factor.unwrap(), inflationState.factorLastUpdated); } _; } /** * @notice Returns the storage, major, minor, and patch version of the contract. * @return The storage, major, minor, and patch version of the contract. */ function getVersionNumber() external pure returns (uint256, uint256, uint256, uint256) { return (1, 2, 0, 1); } /** * @notice Sets initialized == true on implementation contracts * @param test Set to true to skip implementation initialization */ constructor(bool test) public Initializable(test) {} /** * @param _name The name of the stable token (English) * @param _symbol A short symbol identifying the token (e.g. "cUSD") * @param _decimals Tokens are divisible to this many decimal places. * @param registryAddress Address of the Registry contract. * @param inflationRate Weekly inflation rate. * @param inflationFactorUpdatePeriod How often the inflation factor is updated, in seconds. * @param initialBalanceAddresses Array of addresses with an initial balance. * @param initialBalanceValues Array of balance values corresponding to initialBalanceAddresses. * @param exchangeIdentifier String identifier of exchange in registry (for specific fiat pairs) */ function initialize( string calldata _name, string calldata _symbol, uint8 _decimals, address registryAddress, uint256 inflationRate, uint256 inflationFactorUpdatePeriod, address[] calldata initialBalanceAddresses, uint256[] calldata initialBalanceValues, string calldata exchangeIdentifier ) external initializer { require(inflationRate != 0, "Must provide a non-zero inflation rate"); require(inflationFactorUpdatePeriod > 0, "inflationFactorUpdatePeriod must be > 0"); _transferOwnership(msg.sender); totalSupply_ = 0; name_ = _name; symbol_ = _symbol; decimals_ = _decimals; inflationState.rate = FixidityLib.wrap(inflationRate); inflationState.factor = FixidityLib.fixed1(); inflationState.updatePeriod = inflationFactorUpdatePeriod; // solhint-disable-next-line not-rely-on-time inflationState.factorLastUpdated = now; require(initialBalanceAddresses.length == initialBalanceValues.length, "Array length mismatch"); for (uint256 i = 0; i < initialBalanceAddresses.length; i = i.add(1)) { _mint(initialBalanceAddresses[i], initialBalanceValues[i]); } setRegistry(registryAddress); exchangeRegistryId = keccak256(abi.encodePacked(exchangeIdentifier)); } /** * @notice Updates Inflation Parameters. * @param rate New rate. * @param updatePeriod How often inflationFactor is updated. */ function setInflationParameters(uint256 rate, uint256 updatePeriod) external onlyOwner updateInflationFactor { require(rate != 0, "Must provide a non-zero inflation rate."); require(updatePeriod > 0, "updatePeriod must be > 0"); inflationState.rate = FixidityLib.wrap(rate); inflationState.updatePeriod = updatePeriod; emit InflationParametersUpdated( rate, updatePeriod, // solhint-disable-next-line not-rely-on-time now ); } /** * @notice Increase the allowance of another user. * @param spender The address which is being approved to spend StableToken. * @param value The increment of the amount of StableToken approved to the spender. * @return True if the transaction succeeds. */ function increaseAllowance(address spender, uint256 value) external updateInflationFactor returns (bool) { require(spender != address(0), "reserved address 0x0 cannot have allowance"); uint256 oldValue = allowed[msg.sender][spender]; uint256 newValue = oldValue.add(value); allowed[msg.sender][spender] = newValue; emit Approval(msg.sender, spender, newValue); return true; } /** * @notice Decrease the allowance of another user. * @param spender The address which is being approved to spend StableToken. * @param value The decrement of the amount of StableToken approved to the spender. * @return True if the transaction succeeds. */ function decreaseAllowance(address spender, uint256 value) external updateInflationFactor returns (bool) { uint256 oldValue = allowed[msg.sender][spender]; uint256 newValue = oldValue.sub(value); allowed[msg.sender][spender] = newValue; emit Approval(msg.sender, spender, newValue); return true; } /** * @notice Approve a user to transfer StableToken on behalf of another user. * @param spender The address which is being approved to spend StableToken. * @param value The amount of StableToken approved to the spender. * @return True if the transaction succeeds. */ function approve(address spender, uint256 value) external updateInflationFactor returns (bool) { require(spender != address(0), "reserved address 0x0 cannot have allowance"); allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @notice Mints new StableToken and gives it to 'to'. * @param to The account for which to mint tokens. * @param value The amount of StableToken to mint. */ function mint(address to, uint256 value) external updateInflationFactor returns (bool) { require( msg.sender == registry.getAddressForOrDie(getExchangeRegistryId()) || msg.sender == registry.getAddressFor(VALIDATORS_REGISTRY_ID) || msg.sender == registry.getAddressFor(GRANDA_MENTO_REGISTRY_ID), "Sender not authorized to mint" ); return _mint(to, value); } /** * @notice Mints new StableToken and gives it to 'to'. * @param to The account for which to mint tokens. * @param value The amount of StableToken to mint. */ function _mint(address to, uint256 value) private returns (bool) { require(to != address(0), "0 is a reserved address"); if (value == 0) { return true; } uint256 units = _valueToUnits(inflationState.factor, value); totalSupply_ = totalSupply_.add(units); balances[to] = balances[to].add(units); emit Transfer(address(0), to, value); return true; } /** * @notice Transfer token for a specified address * @param to The address to transfer to. * @param value The amount to be transferred. * @param comment The transfer comment. * @return True if the transaction succeeds. */ function transferWithComment(address to, uint256 value, string calldata comment) external updateInflationFactor onlyWhenNotFrozen returns (bool) { bool succeeded = transfer(to, value); emit TransferComment(comment); return succeeded; } /** * @notice Burns StableToken from the balance of msg.sender. * @param value The amount of StableToken to burn. */ function burn(uint256 value) external updateInflationFactor returns (bool) { require( msg.sender == registry.getAddressForOrDie(getExchangeRegistryId()) || msg.sender == registry.getAddressFor(GRANDA_MENTO_REGISTRY_ID), "Sender not authorized to burn" ); uint256 units = _valueToUnits(inflationState.factor, value); require(units <= balances[msg.sender], "value exceeded balance of sender"); totalSupply_ = totalSupply_.sub(units); balances[msg.sender] = balances[msg.sender].sub(units); emit Transfer(msg.sender, address(0), units); return true; } /** * @notice Transfers StableToken from one address to another on behalf of a user. * @param from The address to transfer StableToken from. * @param to The address to transfer StableToken to. * @param value The amount of StableToken to transfer. * @return True if the transaction succeeds. */ function transferFrom(address from, address to, uint256 value) external updateInflationFactor onlyWhenNotFrozen returns (bool) { uint256 units = _valueToUnits(inflationState.factor, value); require(to != address(0), "transfer attempted to reserved address 0x0"); require(units <= balances[from], "transfer value exceeded balance of sender"); require( value <= allowed[from][msg.sender], "transfer value exceeded sender's allowance for recipient" ); balances[to] = balances[to].add(units); balances[from] = balances[from].sub(units); allowed[from][msg.sender] = allowed[from][msg.sender].sub(value); emit Transfer(from, to, value); return true; } /** * @return The name of the stable token. */ function name() external view returns (string memory) { return name_; } /** * @return The symbol of the stable token. */ function symbol() external view returns (string memory) { return symbol_; } /** * @return The number of decimal places to which StableToken is divisible. */ function decimals() external view returns (uint8) { return decimals_; } /** * @notice Gets the amount of owner's StableToken allowed to be spent by spender. * @param accountOwner The owner of the StableToken. * @param spender The spender of the StableToken. * @return The amount of StableToken owner is allowing spender to spend. */ function allowance(address accountOwner, address spender) external view returns (uint256) { return allowed[accountOwner][spender]; } /** * @notice Gets the balance of the specified address using the presently stored inflation factor. * @param accountOwner The address to query the balance of. * @return The balance of the specified address. */ function balanceOf(address accountOwner) external view returns (uint256) { return unitsToValue(balances[accountOwner]); } /** * @return The total value of StableToken in existence * @dev Though totalSupply_ is stored in units, this returns value. */ function totalSupply() external view returns (uint256) { return unitsToValue(totalSupply_); } /** * @notice gets inflation parameters. * @return rate * @return factor * @return updatePeriod * @return factorLastUpdated */ function getInflationParameters() external view returns (uint256, uint256, uint256, uint256) { return ( inflationState.rate.unwrap(), inflationState.factor.unwrap(), inflationState.updatePeriod, inflationState.factorLastUpdated ); } /** * @notice Returns the units for a given value given the current inflation factor. * @param value The value to convert to units. * @return The units corresponding to `value` given the current inflation factor. * @dev We don't compute the updated inflationFactor here because * we assume any function calling this will have updated the inflation factor. */ function valueToUnits(uint256 value) external view returns (uint256) { FixidityLib.Fraction memory updatedInflationFactor; (updatedInflationFactor, ) = getUpdatedInflationFactor(); return _valueToUnits(updatedInflationFactor, value); } /** * @notice Returns the exchange id in the registry of the corresponding fiat pair exchange. * @dev When this storage is uninitialized, it falls back to the default EXCHANGE_REGISTRY_ID. * exchangeRegistryId was introduced after the initial release of cUSD's StableToken, * so exchangeRegistryId will be uninitialized for that contract. If cUSD's StableToken * exchangeRegistryId were to be correctly initialized, this function could be deprecated * in favor of using exchangeRegistryId directly. * @return Registry id for the corresponding exchange. */ function getExchangeRegistryId() public view returns (bytes32) { if (exchangeRegistryId == bytes32(0)) { return EXCHANGE_REGISTRY_ID; } else { return exchangeRegistryId; } } /** * @notice Returns the value of a given number of units given the current inflation factor. * @param units The units to convert to value. * @return The value corresponding to `units` given the current inflation factor. */ function unitsToValue(uint256 units) public view returns (uint256) { FixidityLib.Fraction memory updatedInflationFactor; (updatedInflationFactor, ) = getUpdatedInflationFactor(); // We're ok using FixidityLib.divide here because updatedInflationFactor is // not going to surpass maxFixedDivisor any time soon. // Quick upper-bound estimation: if annual inflation were 5% (an order of // magnitude more than the initial proposal of 0.5%), in 500 years, the // inflation factor would be on the order of 10**10, which is still a safe // divisor. return FixidityLib.newFixed(units).divide(updatedInflationFactor).fromFixed(); } /** * @notice Returns the units for a given value given the current inflation factor. * @param inflationFactor The current inflation factor. * @param value The value to convert to units. * @return The units corresponding to `value` given the current inflation factor. * @dev We assume any function calling this will have updated the inflation factor. */ function _valueToUnits(FixidityLib.Fraction memory inflationFactor, uint256 value) private pure returns (uint256) { return inflationFactor.multiply(FixidityLib.newFixed(value)).fromFixed(); } /** * @notice Computes the up-to-date inflation factor. * @return Current inflation factor. * @return Last time when the returned inflation factor was updated. */ function getUpdatedInflationFactor() private view returns (FixidityLib.Fraction memory, uint256) { /* solhint-disable not-rely-on-time */ if (now < inflationState.factorLastUpdated.add(inflationState.updatePeriod)) { return (inflationState.factor, inflationState.factorLastUpdated); } uint256 numerator; uint256 denominator; // TODO: handle retroactive updates given decreases to updatePeriod uint256 timesToApplyInflation = now.sub(inflationState.factorLastUpdated).div( inflationState.updatePeriod ); (numerator, denominator) = fractionMulExp( inflationState.factor.unwrap(), FixidityLib.fixed1().unwrap(), inflationState.rate.unwrap(), FixidityLib.fixed1().unwrap(), timesToApplyInflation, decimals_ ); // This should never happen. If something went wrong updating the // inflation factor, keep the previous factor if (numerator == 0 || denominator == 0) { return (inflationState.factor, inflationState.factorLastUpdated); } FixidityLib.Fraction memory currentInflationFactor = FixidityLib.wrap(numerator).divide( FixidityLib.wrap(denominator) ); uint256 lastUpdated = inflationState.factorLastUpdated.add( inflationState.updatePeriod.mul(timesToApplyInflation) ); return (currentInflationFactor, lastUpdated); /* solhint-enable not-rely-on-time */ } /** * @notice Transfers `value` from `msg.sender` to `to` * @param to The address to transfer to. * @param value The amount to be transferred. */ // solhint-disable-next-line no-simple-event-func-name function transfer(address to, uint256 value) public updateInflationFactor onlyWhenNotFrozen returns (bool) { return _transfer(to, value); } /** * @notice Transfers StableToken from one address to another * @param to The address to transfer StableToken to. * @param value The amount of StableToken to be transferred. */ function _transfer(address to, uint256 value) internal returns (bool) { require(to != address(0), "transfer attempted to reserved address 0x0"); uint256 units = _valueToUnits(inflationState.factor, value); require(balances[msg.sender] >= units, "transfer value exceeded balance of sender"); balances[msg.sender] = balances[msg.sender].sub(units); balances[to] = balances[to].add(units); emit Transfer(msg.sender, to, value); return true; } /** * @notice Reserve balance for making payments for gas in this StableToken currency. * @param from The account to reserve balance from * @param value The amount of balance to reserve * @dev Note that this function is called by the protocol when paying for tx fees in this * currency. After the tx is executed, gas is refunded to the sender and credited to the * various tx fee recipients via a call to `creditGasFees`. Note too that the events emitted * by `creditGasFees` reflect the *net* gas fee payments for the transaction. */ function debitGasFees(address from, uint256 value) external onlyVm onlyWhenNotFrozen updateInflationFactor { uint256 units = _valueToUnits(inflationState.factor, value); balances[from] = balances[from].sub(units); totalSupply_ = totalSupply_.sub(units); } /** * @notice Alternative function to credit balance after making payments * for gas in this StableToken currency. * @param from The account to debit balance from * @param feeRecipient Coinbase address * @param gatewayFeeRecipient Gateway address * @param communityFund Community fund address * @param tipTxFee Coinbase fee * @param baseTxFee Community fund fee * @param gatewayFee Gateway fee * @dev Note that this function is called by the protocol when paying for tx fees in this * currency. Before the tx is executed, gas is debited from the sender via a call to * `debitGasFees`. Note too that the events emitted by `creditGasFees` reflect the *net* gas fee * payments for the transaction. */ function creditGasFees( address from, address feeRecipient, address gatewayFeeRecipient, address communityFund, uint256 refund, uint256 tipTxFee, uint256 gatewayFee, uint256 baseTxFee ) external onlyVm onlyWhenNotFrozen { uint256 units = _valueToUnits(inflationState.factor, refund); balances[from] = balances[from].add(units); units = units.add(_creditGas(from, communityFund, baseTxFee)); units = units.add(_creditGas(from, feeRecipient, tipTxFee)); units = units.add(_creditGas(from, gatewayFeeRecipient, gatewayFee)); totalSupply_ = totalSupply_.add(units); } function _creditGas(address from, address to, uint256 value) internal returns (uint256) { if (to == address(0)) { return 0; } uint256 units = _valueToUnits(inflationState.factor, value); balances[to] = balances[to].add(units); emit Transfer(from, to, value); return units; } }
pragma solidity ^0.5.13; interface IExchange { function buy(uint256, uint256, bool) external returns (uint256); function sell(uint256, uint256, bool) external returns (uint256); function exchange(uint256, uint256, bool) external returns (uint256); function setUpdateFrequency(uint256) external; function getBuyTokenAmount(uint256, bool) external view returns (uint256); function getSellTokenAmount(uint256, bool) external view returns (uint256); function getBuyAndSellBuckets(bool) external view returns (uint256, uint256); }
pragma solidity ^0.5.13; interface IReserve { function setTobinTaxStalenessThreshold(uint256) external; function addToken(address) external returns (bool); function removeToken(address, uint256) external returns (bool); function transferGold(address payable, uint256) external returns (bool); function transferExchangeGold(address payable, uint256) external returns (bool); function getReserveGoldBalance() external view returns (uint256); function getUnfrozenReserveGoldBalance() external view returns (uint256); function getOrComputeTobinTax() external returns (uint256, uint256); function getTokens() external view returns (address[] memory); function getReserveRatio() external view returns (uint256); function addExchangeSpender(address) external; function removeExchangeSpender(address, uint256) external; function addSpender(address) external; function removeSpender(address) external; }
pragma solidity ^0.5.13; interface ISortedOracles { function addOracle(address, address) external; function removeOracle(address, address, uint256) external; function report(address, uint256, address, address) external; function removeExpiredReports(address, uint256) external; function isOldestReportExpired(address token) external view returns (bool, address); function numRates(address) external view returns (uint256); function medianRate(address) external view returns (uint256, uint256); function numTimestamps(address) external view returns (uint256); function medianTimestamp(address) external view returns (uint256); }
pragma solidity ^0.5.13; /** * @title This interface describes the functions specific to Celo Stable Tokens, and in the * absence of interface inheritance is intended as a companion to IERC20.sol and ICeloToken.sol. */ interface IStableToken { function mint(address, uint256) external returns (bool); function burn(uint256) external returns (bool); function setInflationParameters(uint256, uint256) external; function valueToUnits(uint256) external view returns (uint256); function unitsToValue(uint256) external view returns (uint256); function getInflationParameters() external view returns (uint256, uint256, uint256, uint256); // NOTE: duplicated with IERC20.sol, remove once interface inheritance is supported. function balanceOf(address) external view returns (uint256); }
pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
pragma solidity ^0.5.0; import "../GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
{ "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "istanbul", "remappings": [], "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"bool","name":"test","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"factor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"name":"InflationFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"updatePeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastUpdated","type":"uint256"}],"name":"InflationParametersUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registryAddress","type":"address"}],"name":"RegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"comment","type":"string"}],"name":"TransferComment","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"accountOwner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"accountOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"blsKey","type":"bytes"},{"internalType":"bytes","name":"blsPop","type":"bytes"}],"name":"checkProofOfPossession","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"address","name":"gatewayFeeRecipient","type":"address"},{"internalType":"address","name":"communityFund","type":"address"},{"internalType":"uint256","name":"refund","type":"uint256"},{"internalType":"uint256","name":"tipTxFee","type":"uint256"},{"internalType":"uint256","name":"gatewayFee","type":"uint256"},{"internalType":"uint256","name":"baseTxFee","type":"uint256"}],"name":"creditGasFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"debitGasFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"aNumerator","type":"uint256"},{"internalType":"uint256","name":"aDenominator","type":"uint256"},{"internalType":"uint256","name":"bNumerator","type":"uint256"},{"internalType":"uint256","name":"bDenominator","type":"uint256"},{"internalType":"uint256","name":"exponent","type":"uint256"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"fractionMulExp","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"header","type":"bytes"}],"name":"getBlockNumberFromHeader","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getEpochNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getEpochNumberOfBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getEpochSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getExchangeRegistryId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInflationParameters","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getParentSealBitmap","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"header","type":"bytes"}],"name":"getVerifiedSealBitmapFromHeader","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVersionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes","name":"header","type":"bytes"}],"name":"hashHeader","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"registryAddress","type":"address"},{"internalType":"uint256","name":"inflationRate","type":"uint256"},{"internalType":"uint256","name":"inflationFactorUpdatePeriod","type":"uint256"},{"internalType":"address[]","name":"initialBalanceAddresses","type":"address[]"},{"internalType":"uint256[]","name":"initialBalanceValues","type":"uint256[]"},{"internalType":"string","name":"exchangeIdentifier","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"minQuorumSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minQuorumSizeInCurrentSet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numberValidatorsInCurrentSet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"numberValidatorsInSet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"internalType":"contract IRegistry","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"updatePeriod","type":"uint256"}],"name":"setInflationParameters","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"name":"setRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"comment","type":"string"}],"name":"transferWithComment","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"units","type":"uint256"}],"name":"unitsToValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"validatorSignerAddressFromCurrentSet","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"validatorSignerAddressFromSet","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"valueToUnits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620070bf380380620070bf833981810160405260208110156200003757600080fd5b8101908080519060200190929190505050808060006200005c6200012560201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350806200011c576001600060146101000a81548160ff0219169083151502179055505b5050506200012d565b600033905090565b616f82806200013d6000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c806370a082311161015c578063a457c2d7116100ce578063df4da46111610087578063df4da461146112b1578063e1d6aceb146112cf578063e50e652d1461138a578063ec683072146113cc578063f2fde38b14611447578063fae8db0a1461148b5761027f565b8063a457c2d7146110b4578063a67f87471461111a578063a9059cbb1461114d578063a91ee0dc146111b3578063af31f587146111f7578063dd62ed3e146112395761027f565b80638a883626116101205780638a88362614610e965780638da5cb5b14610f655780638f32d59b14610faf57806395d89b4114610fd15780639a7b3be7146110545780639b2b592f146110725761027f565b806370a0823114610dae578063715018a614610e065780637385e5da14610e105780637b10399914610e2e57806387ee8a0f14610e785761027f565b806339509351116101f55780634b2c2f44116101b95780634b2c2f4414610a4a57806354255be014610b1957806358cf967214610b4c5780635d180adb14610b9a57806367960e9114610c125780636a30b25314610ce15761027f565b806339509351146108d85780633b1eb4bf1461093e57806340a12f641461098057806340c10f191461099e57806342966c6814610a045761027f565b806318160ddd1161024757806318160ddd1461043f5780631e4f0e031461045d578063222836ad1461066c57806323b872dd146106a457806323f0ab651461072a578063313ce567146108b45761027f565b806306fdde0314610284578063095ea7b314610307578063123633ea1461036d57806312c6c099146103db578063158ef93e1461041d575b600080fd5b61028c6114cd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103536004803603604081101561031d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061156f565b604051808215151515815260200191505060405180910390f35b6103996004803603602081101561038357600080fd5b8101908080359060200190929190505050611792565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610407600480360360208110156103f157600080fd5b81019080803590602001909291905050506118e3565b6040518082815260200191505060405180910390f35b61042561190c565b604051808215151515815260200191505060405180910390f35b61044761191f565b6040518082815260200191505060405180910390f35b61066a600480360361012081101561047457600080fd5b810190808035906020019064010000000081111561049157600080fd5b8201836020820111156104a357600080fd5b803590602001918460018302840111640100000000831117156104c557600080fd5b9091929391929390803590602001906401000000008111156104e657600080fd5b8201836020820111156104f857600080fd5b8035906020019184600183028401116401000000008311171561051a57600080fd5b9091929391929390803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561057c57600080fd5b82018360208201111561058e57600080fd5b803590602001918460208302840111640100000000831117156105b057600080fd5b9091929391929390803590602001906401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b90919293919293908035906020019064010000000081111561062657600080fd5b82018360208201111561063857600080fd5b8035906020019184600183028401116401000000008311171561065a57600080fd5b9091929391929390505050611931565b005b6106a26004803603604081101561068257600080fd5b810190808035906020019092919080359060200190929190505050611c57565b005b610710600480360360608110156106ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ebc565b604051808215151515815260200191505060405180910390f35b61089a6004803603606081101561074057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561077d57600080fd5b82018360208201111561078f57600080fd5b803590602001918460018302840111640100000000831117156107b157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561081457600080fd5b82018360208201111561082657600080fd5b8035906020019184600183028401116401000000008311171561084857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612542565b604051808215151515815260200191505060405180910390f35b6108bc6126fb565b604051808260ff1660ff16815260200191505060405180910390f35b610924600480360360408110156108ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612712565b604051808215151515815260200191505060405180910390f35b61096a6004803603602081101561095457600080fd5b81019080803590602001909291905050506129cf565b6040518082815260200191505060405180910390f35b6109886129e9565b6040518082815260200191505060405180910390f35b6109ea600480360360408110156109b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a4f565b604051808215151515815260200191505060405180910390f35b610a3060048036036020811015610a1a57600080fd5b8101908080359060200190929190505050612eb5565b604051808215151515815260200191505060405180910390f35b610b0360048036036020811015610a6057600080fd5b8101908080359060200190640100000000811115610a7d57600080fd5b820183602082011115610a8f57600080fd5b80359060200191846001830284011164010000000083111715610ab157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506133dc565b6040518082815260200191505060405180910390f35b610b21613570565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610b9860048036036040811015610b6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613597565b005b610bd060048036036040811015610bb057600080fd5b8101908080359060200190929190803590602001909291905050506138d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ccb60048036036020811015610c2857600080fd5b8101908080359060200190640100000000811115610c4557600080fd5b820183602082011115610c5757600080fd5b80359060200191846001830284011164010000000083111715610c7957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613a27565b6040518082815260200191505060405180910390f35b610dac6004803603610100811015610cf857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613bbb565b005b610df060048036036020811015610dc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613eb1565b6040518082815260200191505060405180910390f35b610e0e613f02565b005b610e1861403b565b6040518082815260200191505060405180910390f35b610e3661404b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610e80614071565b6040518082815260200191505060405180910390f35b610f4f60048036036020811015610eac57600080fd5b8101908080359060200190640100000000811115610ec957600080fd5b820183602082011115610edb57600080fd5b80359060200191846001830284011164010000000083111715610efd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506141b8565b6040518082815260200191505060405180910390f35b610f6d61434c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610fb7614375565b604051808215151515815260200191505060405180910390f35b610fd96143d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611019578082015181840152602081019050610ffe565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61105c614475565b6040518082815260200191505060405180910390f35b61109e6004803603602081101561108857600080fd5b8101908080359060200190929190505050614485565b6040518082815260200191505060405180910390f35b611100600480360360408110156110ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506145ce565b604051808215151515815260200191505060405180910390f35b611122614805565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6111996004803603604081101561116357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614869565b604051808215151515815260200191505060405180910390f35b6111f5600480360360208110156111c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a3d565b005b6112236004803603602081101561120d57600080fd5b8101908080359060200190929190505050614be1565b6040518082815260200191505060405180910390f35b61129b6004803603604081101561124f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614c23565b6040518082815260200191505060405180910390f35b6112b9614caa565b6040518082815260200191505060405180910390f35b611370600480360360608110156112e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561132c57600080fd5b82018360208201111561133e57600080fd5b8035906020019184600183028401116401000000008311171561136057600080fd5b9091929391929390505050614de6565b604051808215151515815260200191505060405180910390f35b6113b6600480360360208110156113a057600080fd5b8101908080359060200190929190505050615025565b6040518082815260200191505060405180910390f35b61142a600480360360c08110156113e257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050615070565b604051808381526020018281526020019250505060405180910390f35b6114896004803603602081101561145d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050615284565b005b6114b7600480360360208110156114a157600080fd5b810190808035906020019092919050505061530a565b6040518082815260200191505060405180910390f35b606060028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115655780601f1061153a57610100808354040283529160200191611565565b820191906000526020600020905b81548152906001019060200180831161154857829003601f168201915b5050505050905090565b6000611579616af3565b6000611583615453565b8092508193505050600860030154811461161a5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a976115f7600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616dac602a913960400191505060405180910390fd5b83600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040518082815260200191505060405180910390a360019250505092915050565b60006060600060fa73ffffffffffffffffffffffffffffffffffffffff16844360405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061180b57805182526020820191506020810190506020830392506117e8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811461186b576040519150601f19603f3d011682016040523d82523d6000602084013e611870565b606091505b508093508192505050806118cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180616d04603d913960400191505060405180910390fd5b6118da82600061562c565b92505050919050565b60006118ed616af3565b6118f5615453565b50809150506119048184615643565b915050919050565b600060149054906101000a900460ff1681565b600061192c600654614be1565b905090565b600060149054906101000a900460ff16156119b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f636f6e747261637420616c726561647920696e697469616c697a65640000000081525060200191505060405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506000881415611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180616c276026913960400191505060405180910390fd5b60008711611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180616bda6027913960400191505060405180910390fd5b611a8b33615670565b60006006819055508d8d60029190611aa4929190616b06565b508b8b60039190611ab6929190616b06565b5089600460006101000a81548160ff021916908360ff160217905550611adb886157b4565b600860000160008201518160000155905050611af56157d2565b6008600101600082015181600001559050508660086002018190555042600860030181905550838390508686905014611b96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4172726179206c656e677468206d69736d61746368000000000000000000000081525060200191505060405180910390fd5b60008090505b86869050811015611c0757611beb878783818110611bb657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868684818110611bdf57fe5b905060200201356157f8565b50611c006001826159f790919063ffffffff16565b9050611b9c565b50611c1189614a3d565b818160405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600c819055505050505050505050505050505050565b611c5f614375565b611cd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611cd9616af3565b6000611ce3615453565b80925081935050506008600301548114611d7a5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97611d57600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b6000841415611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180616c4d6027913960400191505060405180910390fd5b60008311611e4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f757064617465506572696f64206d757374206265203e2030000000000000000081525060200191505060405180910390fd5b611e53846157b4565b600860000160008201518160000155905050826008600201819055507fa0035d6667ffb7d387c86c7228141c4a877e8ed831b267ac928a2f5b651c155d84844260405180848152602001838152602001828152602001935050505060405180910390a150505050565b6000611ec6616af3565b6000611ed0615453565b80925081935050506008600301548114611f675781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97611f44600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b611f6f615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611feb57600080fd5b505afa158015611fff573d6000803e3d6000fd5b505050506040513d602081101561201557600080fd5b81019080805190602001909291905050501561207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b60006120a1600860010160405180602001604052908160008201548152505086615643565b9050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616f01602a913960400191505060405180910390fd5b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156121c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180616df76029913960400191505060405180910390fd5b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054851115612296576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180616e206038913960400191505060405180910390fd5b6122e881600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061237d81600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061244f85600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600193505050509392505050565b60008060fb73ffffffffffffffffffffffffffffffffffffffff16858585604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140183805190602001908083835b602083106125cb57805182526020820191506020810190506020830392506125a8565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061261c57805182526020820191506020810190506020830392506125f9565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040526040518082805190602001908083835b602083106126855780518252602082019150602081019050602083039250612662565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146126e5576040519150601f19603f3d011682016040523d82523d6000602084013e6126ea565b606091505b505080915050809150509392505050565b6000600460009054906101000a900460ff16905090565b600061271c616af3565b6000612726615453565b809250819350505060086003015481146127bd5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a9761279a600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616dac602a913960400191505060405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006128d986836159f790919063ffffffff16565b905080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3600194505050505092915050565b60006129e2826129dd614caa565b615bc4565b9050919050565b60008060001b600c541415612a465760405160200180807f45786368616e67650000000000000000000000000000000000000000000000008152506008019050604051602081830303815290604052805190602001209050612a4c565b600c5490505b90565b6000612a59616af3565b6000612a63615453565b80925081935050506008600301548114612afa5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97612ad7600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcf0aaed612b406129e9565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612b7457600080fd5b505afa158015612b88573d6000803e3d6000fd5b505050506040513d6020811015612b9e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612d065750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd92723360405160200180807f56616c696461746f727300000000000000000000000000000000000000000000815250600a019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612c9c57600080fd5b505afa158015612cb0573d6000803e3d6000fd5b505050506040513d6020811015612cc657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e2f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd92723360405160200180807f4772616e64614d656e746f000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612dc557600080fd5b505afa158015612dd9573d6000803e3d6000fd5b505050506040513d6020811015612def57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53656e646572206e6f7420617574686f72697a656420746f206d696e7400000081525060200191505060405180910390fd5b612eab85856157f8565b9250505092915050565b6000612ebf616af3565b6000612ec9615453565b80925081935050506008600301548114612f605781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97612f3d600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcf0aaed612fa66129e9565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612fda57600080fd5b505afa158015612fee573d6000803e3d6000fd5b505050506040513d602081101561300457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061316c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd92723360405160200180807f4772616e64614d656e746f000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561310257600080fd5b505afa158015613116573d6000803e3d6000fd5b505050506040513d602081101561312c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6131de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53656e646572206e6f7420617574686f72697a656420746f206275726e00000081525060200191505060405180910390fd5b6000613203600860010160405180602001604052908160008201548152505086615643565b9050600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f76616c75652065786365656465642062616c616e6365206f662073656e64657281525060200191505060405180910390fd5b6132cf81600654615b7a90919063ffffffff16565b60068190555061332781600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a360019350505050919050565b60006060600060f473ffffffffffffffffffffffffffffffffffffffff16846040516020018082805190602001908083835b60208310613431578051825260208201915060208101905060208303925061340e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106134985780518252602082019150602081019050602083039250613475565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146134f8576040519150601f19603f3d011682016040523d82523d6000602084013e6134fd565b606091505b5080935081925050508061355c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180616c746038913960400191505060405180910390fd5b613567826000615c0c565b92505050919050565b60008060008060018060006001839350829250819150809050935093509350935090919293565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613639576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c7920564d2063616e2063616c6c0000000000000000000000000000000081525060200191505060405180910390fd5b613641615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156136bd57600080fd5b505afa1580156136d1573d6000803e3d6000fd5b505050506040513d60208110156136e757600080fd5b81019080805190602001909291905050501561374e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b613756616af3565b6000613760615453565b809250819350505060086003015481146137f75781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a976137d4600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600061381c600860010160405180602001604052908160008201548152505085615643565b905061387081600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138c881600654615b7a90919063ffffffff16565b6006819055505050505050565b60006060600060fa73ffffffffffffffffffffffffffffffffffffffff16858560405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061394e578051825260208201915060208101905060208303925061392b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146139ae576040519150601f19603f3d011682016040523d82523d6000602084013e6139b3565b606091505b50809350819250505080613a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180616d766036913960400191505060405180910390fd5b613a1d82600061562c565b9250505092915050565b60006060600060f673ffffffffffffffffffffffffffffffffffffffff16846040516020018082805190602001908083835b60208310613a7c5780518252602082019150602081019050602083039250613a59565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310613ae35780518252602082019150602081019050602083039250613ac0565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613b43576040519150601f19603f3d011682016040523d82523d6000602084013e613b48565b606091505b50809350819250505080613ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180616f2b6023913960400191505060405180910390fd5b613bb2826000615c0c565b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613c5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c7920564d2063616e2063616c6c0000000000000000000000000000000081525060200191505060405180910390fd5b613c65615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613ce157600080fd5b505afa158015613cf5573d6000803e3d6000fd5b505050506040513d6020811015613d0b57600080fd5b810190808051906020019092919050505015613d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b6000613d97600860010160405180602001604052908160008201548152505086615643565b9050613deb81600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e4b613e3c8a8885615cad565b826159f790919063ffffffff16565b9050613e6a613e5b8a8a87615cad565b826159f790919063ffffffff16565b9050613e89613e7a8a8986615cad565b826159f790919063ffffffff16565b9050613ea0816006546159f790919063ffffffff16565b600681905550505050505050505050565b6000613efb600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614be1565b9050919050565b613f0a614375565b613f7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061404643615025565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600060f973ffffffffffffffffffffffffffffffffffffffff1643604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106140e257805182526020820191506020810190506020830392506140bf565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114614142576040519150601f19603f3d011682016040523d82523d6000602084013e614147565b606091505b508093508192505050806141a6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180616d416035913960400191505060405180910390fd5b6141b182600061562c565b9250505090565b60006060600060f773ffffffffffffffffffffffffffffffffffffffff16846040516020018082805190602001908083835b6020831061420d57805182526020820191506020810190506020830392506141ea565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106142745780518252602082019150602081019050602083039250614251565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146142d4576040519150601f19603f3d011682016040523d82523d6000602084013e6142d9565b606091505b50809350819250505080614338576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180616ed06031913960400191505060405180910390fd5b61434382600061562c565b92505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166143b7615e19565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561446b5780601f106144405761010080835404028352916020019161446b565b820191906000526020600020905b81548152906001019060200180831161444e57829003601f168201915b5050505050905090565b6000614480436129cf565b905090565b60006060600060f973ffffffffffffffffffffffffffffffffffffffff1684604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106144f657805182526020820191506020810190506020830392506144d3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114614556576040519150601f19603f3d011682016040523d82523d6000602084013e61455b565b606091505b508093508192505050806145ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180616bac602e913960400191505060405180910390fd5b6145c582600061562c565b92505050919050565b60006145d8616af3565b60006145e2615453565b809250819350505060086003015481146146795781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97614656600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061470f8683615b7a90919063ffffffff16565b905080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3600194505050505092915050565b60008060008061482d600860000160405180602001604052908160008201548152505061561e565b61484f600860010160405180602001604052908160008201548152505061561e565b600860020154600860030154935093509350935090919293565b6000614873616af3565b600061487d615453565b809250819350505060086003015481146149145781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a976148f1600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b61491c615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561499857600080fd5b505afa1580156149ac573d6000803e3d6000fd5b505050506040513d60208110156149c257600080fd5b810190808051906020019092919050505015614a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b614a338585615e21565b9250505092915050565b614a45614375565b614ab7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f7420726567697374657220746865206e756c6c206164647265737381525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f27fe5f0c1c3b1ed427cc63d0f05759ffdecf9aec9e18d31ef366fc8a6cb5dc3b60405160405180910390a250565b6000614beb616af3565b614bf3615453565b5080915050614c1b614c1682614c0886616101565b61618b90919063ffffffff16565b6162d4565b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006060600060f873ffffffffffffffffffffffffffffffffffffffff166040516020016040516020818303038152906040526040518082805190602001908083835b60208310614d105780518252602082019150602081019050602083039250614ced565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114614d70576040519150601f19603f3d011682016040523d82523d6000602084013e614d75565b606091505b50809350819250505080614dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180616e7f6025913960400191505060405180910390fd5b614ddf82600061562c565b9250505090565b6000614df0616af3565b6000614dfa615453565b80925081935050506008600301548114614e915781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97614e6e600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b614e99615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614f1557600080fd5b505afa158015614f29573d6000803e3d6000fd5b505050506040513d6020811015614f3f57600080fd5b810190808051906020019092919050505015614fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b6000614fb28888614869565b90507fe5d4e30fb8364e57bc4d662a07d0cf36f4c34552004c4c3624620a2c1d1c03dc868660405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a1809350505050949350505050565b6000615069600361505b600261504d600261503f88614485565b6162f590919063ffffffff16565b6159f790919063ffffffff16565b61637b90919063ffffffff16565b9050919050565b60008060008714158015615085575060008514155b6150f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f612064656e6f6d696e61746f72206973207a65726f000000000000000000000081525060200191505060405180910390fd5b6000806000606060fc73ffffffffffffffffffffffffffffffffffffffff168c8c8c8c8c8c6040516020018087815260200186815260200185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040526040518082805190602001908083835b60208310615191578051825260208201915060208101905060208303925061516e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146151f1576040519150601f19603f3d011682016040523d82523d6000602084013e6151f6565b606091505b50809250819350505081615255576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180616e586027913960400191505060405180910390fd5b61526081600061562c565b935061526d81602061562c565b925083839550955050505050965096945050505050565b61528c614375565b6152fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61530781615670565b50565b60006060600060f573ffffffffffffffffffffffffffffffffffffffff1684604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061537b5780518252602082019150602081019050602083039250615358565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146153db576040519150601f19603f3d011682016040523d82523d6000602084013e6153e0565b606091505b5080935081925050508061543f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180616ea4602c913960400191505060405180910390fd5b61544a826000615c0c565b92505050919050565b61545b616af3565b600061547a6008600201546008600301546159f790919063ffffffff16565b4210156154ad5760086001016008600301548160405180602001604052908160008201548152505091509150915061561a565b60008060006154e16008600201546154d360086003015442615b7a90919063ffffffff16565b61637b90919063ffffffff16565b9050615563615508600860010160405180602001604052908160008201548152505061561e565b6155186155136157d2565b61561e565b61553a600860000160405180602001604052908160008201548152505061561e565b61554a6155456157d2565b61561e565b85600460009054906101000a900460ff1660ff16615070565b8093508194505050600083148061557a5750600082145b156155ae5760086001016008600301548160405180602001604052908160008201548152505091509450945050505061561a565b6155b6616af3565b6155d96155c2846157b4565b6155cb866157b4565b61618b90919063ffffffff16565b9050600061560c6155f8846008600201546162f590919063ffffffff16565b6008600301546159f790919063ffffffff16565b905081819650965050505050505b9091565b600081600001519050919050565b60006156388383615c0c565b60001c905092915050565b600061566861566361565484616101565b856163c590919063ffffffff16565b6162d4565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156156f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180616c016026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6157bc616af3565b6040518060200160405280838152509050919050565b6157da616af3565b604051806020016040528069d3c21bcecceda1000000815250905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561589c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f302069732061207265736572766564206164647265737300000000000000000081525060200191505060405180910390fd5b60008214156158ae57600190506159f1565b60006158d3600860010160405180602001604052908160008201548152505084615643565b90506158ea816006546159f790919063ffffffff16565b60068190555061594281600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150505b92915050565b600080828401905083811015615a75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcf0aaed60405160200180807f467265657a6572000000000000000000000000000000000000000000000000008152506007019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015615b3a57600080fd5b505afa158015615b4e573d6000803e3d6000fd5b505050506040513d6020811015615b6457600080fd5b8101908080519060200190929190505050905090565b6000615bbc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250616824565b905092915050565b600080828481615bd057fe5b0490506000838581615bde57fe5b061415615bee5780915050615c06565b615c026001826159f790919063ffffffff16565b9150505b92915050565b6000615c226020836159f790919063ffffffff16565b83511015615c98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f736c6963696e67206f7574206f662072616e676500000000000000000000000081525060200191505060405180910390fd5b60006020830184015190508091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415615cec5760009050615e12565b6000615d11600860010160405180602001604052908160008201548152505084615643565b9050615d6581600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3809150505b9392505050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415615ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616f01602a913960400191505060405180910390fd5b6000615ecd600860010160405180602001604052908160008201548152505084615643565b905080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015615f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180616df76029913960400191505060405180910390fd5b615fb981600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061604e81600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191505092915050565b616109616af3565b6161116168e4565b821115616169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180616cce6036913960400191505060405180910390fd5b604051806020016040528069d3c21bcecceda100000084028152509050919050565b616193616af3565b60008260000151141561620e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f63616e277420646976696465206279203000000000000000000000000000000081525060200191505060405180910390fd5b600069d3c21bcecceda10000008460000151029050836000015169d3c21bcecceda1000000828161623b57fe5b04146162af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6f766572666c6f7720617420646976696465000000000000000000000000000081525060200191505060405180910390fd5b6040518060200160405280846000015183816162c757fe5b0481525091505092915050565b600069d3c21bcecceda10000008260000151816162ed57fe5b049050919050565b6000808314156163085760009050616375565b600082840290508284828161631957fe5b0414616370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180616dd66021913960400191505060405180910390fd5b809150505b92915050565b60006163bd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250616903565b905092915050565b6163cd616af3565b6000836000015114806163e4575060008260000151145b156164005760405180602001604052806000815250905061681e565b69d3c21bcecceda10000008260000151141561641e5782905061681e565b69d3c21bcecceda10000008360000151141561643c5781905061681e565b600069d3c21bcecceda1000000616452856169c9565b600001518161645d57fe5b049050600061646b85616a00565b600001519050600069d3c21bcecceda1000000616487866169c9565b600001518161649257fe5b04905060006164a086616a00565b600001519050600082850290506000851461653457828582816164bf57fe5b0414616533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783179312064657465637465640000000000000000000081525060200191505060405180910390fd5b5b600069d3c21bcecceda100000082029050600082146165d65769d3c21bcecceda100000082828161656157fe5b04146165d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f766572666c6f772078317931202a206669786564312064657465637465640081525060200191505060405180910390fd5b5b809150600084860290506000861461666757848682816165f257fe5b0414616666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783279312064657465637465640000000000000000000081525060200191505060405180910390fd5b5b60008488029050600088146166f5578488828161668057fe5b04146166f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783179322064657465637465640000000000000000000081525060200191505060405180910390fd5b5b6166fd616a3d565b878161670557fe5b049650616710616a3d565b858161671857fe5b04945060008588029050600088146167a9578588828161673457fe5b04146167a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783279322064657465637465640000000000000000000081525060200191505060405180910390fd5b5b6167b1616af3565b60405180602001604052808781525090506167da81604051806020016040528087815250616a4a565b90506167f481604051806020016040528086815250616a4a565b905061680e81604051806020016040528085815250616a4a565b9050809a50505050505050505050505b92915050565b60008383111582906168d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561689657808201518184015260208101905061687b565b50505050905090810190601f1680156168c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60007601357c299a88ea76a58924d52ce4f26a85af186c2b9e74905090565b600080831182906169af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015616974578082015181840152602081019050616959565b50505050905090810190601f1680156169a15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816169bb57fe5b049050809150509392505050565b6169d1616af3565b604051806020016040528069d3c21bcecceda1000000808560000151816169f457fe5b04028152509050919050565b616a08616af3565b604051806020016040528069d3c21bcecceda100000080856000015181616a2b57fe5b04028460000151038152509050919050565b600064e8d4a51000905090565b616a52616af3565b6000826000015184600001510190508360000151811015616adb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f616464206f766572666c6f77206465746563746564000000000000000000000081525060200191505060405180910390fd5b60405180602001604052808281525091505092915050565b6040518060200160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10616b4757803560ff1916838001178555616b75565b82800160010185558215616b75579182015b82811115616b74578235825591602001919060010190616b59565b5b509050616b829190616b86565b5090565b616ba891905b80821115616ba4576000816000905550600101616b8c565b5090565b9056fe6572726f722063616c6c696e67206e756d62657256616c696461746f7273496e53657420707265636f6d70696c65696e666c6174696f6e466163746f72557064617465506572696f64206d757374206265203e20304f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d7573742070726f766964652061206e6f6e2d7a65726f20696e666c6174696f6e20726174654d7573742070726f766964652061206e6f6e2d7a65726f20696e666c6174696f6e20726174652e6572726f722063616c6c696e672067657456657269666965645365616c4269746d617046726f6d48656164657220707265636f6d70696c6563616e27742063616c6c207768656e20636f6e74726163742069732066726f7a656e63616e277420637265617465206669786964697479206e756d626572206c6172676572207468616e206d61784e6577466978656428296572726f722063616c6c696e672076616c696461746f725369676e65724164647265737346726f6d43757272656e7453657420707265636f6d70696c656572726f722063616c6c696e67206e756d62657256616c696461746f7273496e43757272656e7453657420707265636f6d70696c656572726f722063616c6c696e672076616c696461746f725369676e65724164647265737346726f6d53657420707265636f6d70696c6572657365727665642061646472657373203078302063616e6e6f74206861766520616c6c6f77616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777472616e736665722076616c75652065786365656465642062616c616e6365206f662073656e6465727472616e736665722076616c75652065786365656465642073656e646572277320616c6c6f77616e636520666f7220726563697069656e746572726f722063616c6c696e67206672616374696f6e4d756c45787020707265636f6d70696c656572726f722063616c6c696e672067657445706f636853697a6520707265636f6d70696c656572726f722063616c6c696e6720676574506172656e745365616c4269746d617020707265636f6d70696c656572726f722063616c6c696e6720676574426c6f636b4e756d62657246726f6d48656164657220707265636f6d70696c657472616e7366657220617474656d7074656420746f2072657365727665642061646472657373203078306572726f722063616c6c696e67206861736848656164657220707265636f6d70696c65a265627a7a723158209cdbb39b2f64fc5a4a86de97254593c375812f274d4f7893849665ac3c036f4b64736f6c634300050d00320000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061027f5760003560e01c806370a082311161015c578063a457c2d7116100ce578063df4da46111610087578063df4da461146112b1578063e1d6aceb146112cf578063e50e652d1461138a578063ec683072146113cc578063f2fde38b14611447578063fae8db0a1461148b5761027f565b8063a457c2d7146110b4578063a67f87471461111a578063a9059cbb1461114d578063a91ee0dc146111b3578063af31f587146111f7578063dd62ed3e146112395761027f565b80638a883626116101205780638a88362614610e965780638da5cb5b14610f655780638f32d59b14610faf57806395d89b4114610fd15780639a7b3be7146110545780639b2b592f146110725761027f565b806370a0823114610dae578063715018a614610e065780637385e5da14610e105780637b10399914610e2e57806387ee8a0f14610e785761027f565b806339509351116101f55780634b2c2f44116101b95780634b2c2f4414610a4a57806354255be014610b1957806358cf967214610b4c5780635d180adb14610b9a57806367960e9114610c125780636a30b25314610ce15761027f565b806339509351146108d85780633b1eb4bf1461093e57806340a12f641461098057806340c10f191461099e57806342966c6814610a045761027f565b806318160ddd1161024757806318160ddd1461043f5780631e4f0e031461045d578063222836ad1461066c57806323b872dd146106a457806323f0ab651461072a578063313ce567146108b45761027f565b806306fdde0314610284578063095ea7b314610307578063123633ea1461036d57806312c6c099146103db578063158ef93e1461041d575b600080fd5b61028c6114cd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103536004803603604081101561031d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061156f565b604051808215151515815260200191505060405180910390f35b6103996004803603602081101561038357600080fd5b8101908080359060200190929190505050611792565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610407600480360360208110156103f157600080fd5b81019080803590602001909291905050506118e3565b6040518082815260200191505060405180910390f35b61042561190c565b604051808215151515815260200191505060405180910390f35b61044761191f565b6040518082815260200191505060405180910390f35b61066a600480360361012081101561047457600080fd5b810190808035906020019064010000000081111561049157600080fd5b8201836020820111156104a357600080fd5b803590602001918460018302840111640100000000831117156104c557600080fd5b9091929391929390803590602001906401000000008111156104e657600080fd5b8201836020820111156104f857600080fd5b8035906020019184600183028401116401000000008311171561051a57600080fd5b9091929391929390803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561057c57600080fd5b82018360208201111561058e57600080fd5b803590602001918460208302840111640100000000831117156105b057600080fd5b9091929391929390803590602001906401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b90919293919293908035906020019064010000000081111561062657600080fd5b82018360208201111561063857600080fd5b8035906020019184600183028401116401000000008311171561065a57600080fd5b9091929391929390505050611931565b005b6106a26004803603604081101561068257600080fd5b810190808035906020019092919080359060200190929190505050611c57565b005b610710600480360360608110156106ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ebc565b604051808215151515815260200191505060405180910390f35b61089a6004803603606081101561074057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561077d57600080fd5b82018360208201111561078f57600080fd5b803590602001918460018302840111640100000000831117156107b157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561081457600080fd5b82018360208201111561082657600080fd5b8035906020019184600183028401116401000000008311171561084857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612542565b604051808215151515815260200191505060405180910390f35b6108bc6126fb565b604051808260ff1660ff16815260200191505060405180910390f35b610924600480360360408110156108ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612712565b604051808215151515815260200191505060405180910390f35b61096a6004803603602081101561095457600080fd5b81019080803590602001909291905050506129cf565b6040518082815260200191505060405180910390f35b6109886129e9565b6040518082815260200191505060405180910390f35b6109ea600480360360408110156109b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a4f565b604051808215151515815260200191505060405180910390f35b610a3060048036036020811015610a1a57600080fd5b8101908080359060200190929190505050612eb5565b604051808215151515815260200191505060405180910390f35b610b0360048036036020811015610a6057600080fd5b8101908080359060200190640100000000811115610a7d57600080fd5b820183602082011115610a8f57600080fd5b80359060200191846001830284011164010000000083111715610ab157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506133dc565b6040518082815260200191505060405180910390f35b610b21613570565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610b9860048036036040811015610b6257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613597565b005b610bd060048036036040811015610bb057600080fd5b8101908080359060200190929190803590602001909291905050506138d5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610ccb60048036036020811015610c2857600080fd5b8101908080359060200190640100000000811115610c4557600080fd5b820183602082011115610c5757600080fd5b80359060200191846001830284011164010000000083111715610c7957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050613a27565b6040518082815260200191505060405180910390f35b610dac6004803603610100811015610cf857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050613bbb565b005b610df060048036036020811015610dc457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613eb1565b6040518082815260200191505060405180910390f35b610e0e613f02565b005b610e1861403b565b6040518082815260200191505060405180910390f35b610e3661404b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610e80614071565b6040518082815260200191505060405180910390f35b610f4f60048036036020811015610eac57600080fd5b8101908080359060200190640100000000811115610ec957600080fd5b820183602082011115610edb57600080fd5b80359060200191846001830284011164010000000083111715610efd57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506141b8565b6040518082815260200191505060405180910390f35b610f6d61434c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610fb7614375565b604051808215151515815260200191505060405180910390f35b610fd96143d3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611019578082015181840152602081019050610ffe565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61105c614475565b6040518082815260200191505060405180910390f35b61109e6004803603602081101561108857600080fd5b8101908080359060200190929190505050614485565b6040518082815260200191505060405180910390f35b611100600480360360408110156110ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506145ce565b604051808215151515815260200191505060405180910390f35b611122614805565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6111996004803603604081101561116357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050614869565b604051808215151515815260200191505060405180910390f35b6111f5600480360360208110156111c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614a3d565b005b6112236004803603602081101561120d57600080fd5b8101908080359060200190929190505050614be1565b6040518082815260200191505060405180910390f35b61129b6004803603604081101561124f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614c23565b6040518082815260200191505060405180910390f35b6112b9614caa565b6040518082815260200191505060405180910390f35b611370600480360360608110156112e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561132c57600080fd5b82018360208201111561133e57600080fd5b8035906020019184600183028401116401000000008311171561136057600080fd5b9091929391929390505050614de6565b604051808215151515815260200191505060405180910390f35b6113b6600480360360208110156113a057600080fd5b8101908080359060200190929190505050615025565b6040518082815260200191505060405180910390f35b61142a600480360360c08110156113e257600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050615070565b604051808381526020018281526020019250505060405180910390f35b6114896004803603602081101561145d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050615284565b005b6114b7600480360360208110156114a157600080fd5b810190808035906020019092919050505061530a565b6040518082815260200191505060405180910390f35b606060028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115655780601f1061153a57610100808354040283529160200191611565565b820191906000526020600020905b81548152906001019060200180831161154857829003601f168201915b5050505050905090565b6000611579616af3565b6000611583615453565b8092508193505050600860030154811461161a5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a976115f7600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616dac602a913960400191505060405180910390fd5b83600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040518082815260200191505060405180910390a360019250505092915050565b60006060600060fa73ffffffffffffffffffffffffffffffffffffffff16844360405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061180b57805182526020820191506020810190506020830392506117e8565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811461186b576040519150601f19603f3d011682016040523d82523d6000602084013e611870565b606091505b508093508192505050806118cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180616d04603d913960400191505060405180910390fd5b6118da82600061562c565b92505050919050565b60006118ed616af3565b6118f5615453565b50809150506119048184615643565b915050919050565b600060149054906101000a900460ff1681565b600061192c600654614be1565b905090565b600060149054906101000a900460ff16156119b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f636f6e747261637420616c726561647920696e697469616c697a65640000000081525060200191505060405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506000881415611a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180616c276026913960400191505060405180910390fd5b60008711611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180616bda6027913960400191505060405180910390fd5b611a8b33615670565b60006006819055508d8d60029190611aa4929190616b06565b508b8b60039190611ab6929190616b06565b5089600460006101000a81548160ff021916908360ff160217905550611adb886157b4565b600860000160008201518160000155905050611af56157d2565b6008600101600082015181600001559050508660086002018190555042600860030181905550838390508686905014611b96576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4172726179206c656e677468206d69736d61746368000000000000000000000081525060200191505060405180910390fd5b60008090505b86869050811015611c0757611beb878783818110611bb657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16868684818110611bdf57fe5b905060200201356157f8565b50611c006001826159f790919063ffffffff16565b9050611b9c565b50611c1189614a3d565b818160405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120600c819055505050505050505050505050505050565b611c5f614375565b611cd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611cd9616af3565b6000611ce3615453565b80925081935050506008600301548114611d7a5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97611d57600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b6000841415611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180616c4d6027913960400191505060405180910390fd5b60008311611e4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f757064617465506572696f64206d757374206265203e2030000000000000000081525060200191505060405180910390fd5b611e53846157b4565b600860000160008201518160000155905050826008600201819055507fa0035d6667ffb7d387c86c7228141c4a877e8ed831b267ac928a2f5b651c155d84844260405180848152602001838152602001828152602001935050505060405180910390a150505050565b6000611ec6616af3565b6000611ed0615453565b80925081935050506008600301548114611f675781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97611f44600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b611f6f615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611feb57600080fd5b505afa158015611fff573d6000803e3d6000fd5b505050506040513d602081101561201557600080fd5b81019080805190602001909291905050501561207c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b60006120a1600860010160405180602001604052908160008201548152505086615643565b9050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415612129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616f01602a913960400191505060405180910390fd5b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156121c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180616df76029913960400191505060405180910390fd5b600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054851115612296576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180616e206038913960400191505060405180910390fd5b6122e881600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061237d81600560008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061244f85600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a3600193505050509392505050565b60008060fb73ffffffffffffffffffffffffffffffffffffffff16858585604051602001808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140183805190602001908083835b602083106125cb57805182526020820191506020810190506020830392506125a8565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061261c57805182526020820191506020810190506020830392506125f9565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040526040518082805190602001908083835b602083106126855780518252602082019150602081019050602083039250612662565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146126e5576040519150601f19603f3d011682016040523d82523d6000602084013e6126ea565b606091505b505080915050809150509392505050565b6000600460009054906101000a900460ff16905090565b600061271c616af3565b6000612726615453565b809250819350505060086003015481146127bd5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a9761279a600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616dac602a913960400191505060405180910390fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006128d986836159f790919063ffffffff16565b905080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3600194505050505092915050565b60006129e2826129dd614caa565b615bc4565b9050919050565b60008060001b600c541415612a465760405160200180807f45786368616e67650000000000000000000000000000000000000000000000008152506008019050604051602081830303815290604052805190602001209050612a4c565b600c5490505b90565b6000612a59616af3565b6000612a63615453565b80925081935050506008600301548114612afa5781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97612ad7600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcf0aaed612b406129e9565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612b7457600080fd5b505afa158015612b88573d6000803e3d6000fd5b505050506040513d6020811015612b9e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612d065750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd92723360405160200180807f56616c696461746f727300000000000000000000000000000000000000000000815250600a019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612c9c57600080fd5b505afa158015612cb0573d6000803e3d6000fd5b505050506040513d6020811015612cc657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80612e2f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd92723360405160200180807f4772616e64614d656e746f000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612dc557600080fd5b505afa158015612dd9573d6000803e3d6000fd5b505050506040513d6020811015612def57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53656e646572206e6f7420617574686f72697a656420746f206d696e7400000081525060200191505060405180910390fd5b612eab85856157f8565b9250505092915050565b6000612ebf616af3565b6000612ec9615453565b80925081935050506008600301548114612f605781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97612f3d600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcf0aaed612fa66129e9565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612fda57600080fd5b505afa158015612fee573d6000803e3d6000fd5b505050506040513d602081101561300457600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061316c5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd92723360405160200180807f4772616e64614d656e746f000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561310257600080fd5b505afa158015613116573d6000803e3d6000fd5b505050506040513d602081101561312c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6131de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53656e646572206e6f7420617574686f72697a656420746f206275726e00000081525060200191505060405180910390fd5b6000613203600860010160405180602001604052908160008201548152505086615643565b9050600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156132ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f76616c75652065786365656465642062616c616e6365206f662073656e64657281525060200191505060405180910390fd5b6132cf81600654615b7a90919063ffffffff16565b60068190555061332781600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a360019350505050919050565b60006060600060f473ffffffffffffffffffffffffffffffffffffffff16846040516020018082805190602001908083835b60208310613431578051825260208201915060208101905060208303925061340e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106134985780518252602082019150602081019050602083039250613475565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146134f8576040519150601f19603f3d011682016040523d82523d6000602084013e6134fd565b606091505b5080935081925050508061355c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180616c746038913960400191505060405180910390fd5b613567826000615c0c565b92505050919050565b60008060008060018060006001839350829250819150809050935093509350935090919293565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613639576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c7920564d2063616e2063616c6c0000000000000000000000000000000081525060200191505060405180910390fd5b613641615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156136bd57600080fd5b505afa1580156136d1573d6000803e3d6000fd5b505050506040513d60208110156136e757600080fd5b81019080805190602001909291905050501561374e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b613756616af3565b6000613760615453565b809250819350505060086003015481146137f75781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a976137d4600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b600061381c600860010160405180602001604052908160008201548152505085615643565b905061387081600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506138c881600654615b7a90919063ffffffff16565b6006819055505050505050565b60006060600060fa73ffffffffffffffffffffffffffffffffffffffff16858560405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061394e578051825260208201915060208101905060208303925061392b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146139ae576040519150601f19603f3d011682016040523d82523d6000602084013e6139b3565b606091505b50809350819250505080613a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180616d766036913960400191505060405180910390fd5b613a1d82600061562c565b9250505092915050565b60006060600060f673ffffffffffffffffffffffffffffffffffffffff16846040516020018082805190602001908083835b60208310613a7c5780518252602082019150602081019050602083039250613a59565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310613ae35780518252602082019150602081019050602083039250613ac0565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613b43576040519150601f19603f3d011682016040523d82523d6000602084013e613b48565b606091505b50809350819250505080613ba7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180616f2b6023913960400191505060405180910390fd5b613bb2826000615c0c565b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613c5d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c7920564d2063616e2063616c6c0000000000000000000000000000000081525060200191505060405180910390fd5b613c65615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613ce157600080fd5b505afa158015613cf5573d6000803e3d6000fd5b505050506040513d6020811015613d0b57600080fd5b810190808051906020019092919050505015613d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b6000613d97600860010160405180602001604052908160008201548152505086615643565b9050613deb81600560008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e4b613e3c8a8885615cad565b826159f790919063ffffffff16565b9050613e6a613e5b8a8a87615cad565b826159f790919063ffffffff16565b9050613e89613e7a8a8986615cad565b826159f790919063ffffffff16565b9050613ea0816006546159f790919063ffffffff16565b600681905550505050505050505050565b6000613efb600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054614be1565b9050919050565b613f0a614375565b613f7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600061404643615025565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600060f973ffffffffffffffffffffffffffffffffffffffff1643604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106140e257805182526020820191506020810190506020830392506140bf565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114614142576040519150601f19603f3d011682016040523d82523d6000602084013e614147565b606091505b508093508192505050806141a6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180616d416035913960400191505060405180910390fd5b6141b182600061562c565b9250505090565b60006060600060f773ffffffffffffffffffffffffffffffffffffffff16846040516020018082805190602001908083835b6020831061420d57805182526020820191506020810190506020830392506141ea565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106142745780518252602082019150602081019050602083039250614251565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146142d4576040519150601f19603f3d011682016040523d82523d6000602084013e6142d9565b606091505b50809350819250505080614338576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180616ed06031913960400191505060405180910390fd5b61434382600061562c565b92505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166143b7615e19565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060038054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561446b5780601f106144405761010080835404028352916020019161446b565b820191906000526020600020905b81548152906001019060200180831161444e57829003601f168201915b5050505050905090565b6000614480436129cf565b905090565b60006060600060f973ffffffffffffffffffffffffffffffffffffffff1684604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106144f657805182526020820191506020810190506020830392506144d3565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114614556576040519150601f19603f3d011682016040523d82523d6000602084013e61455b565b606091505b508093508192505050806145ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180616bac602e913960400191505060405180910390fd5b6145c582600061562c565b92505050919050565b60006145d8616af3565b60006145e2615453565b809250819350505060086003015481146146795781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97614656600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061470f8683615b7a90919063ffffffff16565b905080600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3600194505050505092915050565b60008060008061482d600860000160405180602001604052908160008201548152505061561e565b61484f600860010160405180602001604052908160008201548152505061561e565b600860020154600860030154935093509350935090919293565b6000614873616af3565b600061487d615453565b809250819350505060086003015481146149145781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a976148f1600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b61491c615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561499857600080fd5b505afa1580156149ac573d6000803e3d6000fd5b505050506040513d60208110156149c257600080fd5b810190808051906020019092919050505015614a29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b614a338585615e21565b9250505092915050565b614a45614375565b614ab7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415614b5a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f7420726567697374657220746865206e756c6c206164647265737381525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f27fe5f0c1c3b1ed427cc63d0f05759ffdecf9aec9e18d31ef366fc8a6cb5dc3b60405160405180910390a250565b6000614beb616af3565b614bf3615453565b5080915050614c1b614c1682614c0886616101565b61618b90919063ffffffff16565b6162d4565b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006060600060f873ffffffffffffffffffffffffffffffffffffffff166040516020016040516020818303038152906040526040518082805190602001908083835b60208310614d105780518252602082019150602081019050602083039250614ced565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114614d70576040519150601f19603f3d011682016040523d82523d6000602084013e614d75565b606091505b50809350819250505080614dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180616e7f6025913960400191505060405180910390fd5b614ddf82600061562c565b9250505090565b6000614df0616af3565b6000614dfa615453565b80925081935050506008600301548114614e915781600860010160008201518160000155905050806008600301819055507f08f3ed03ec9e579d1f6ab2f9e0d3dc661704696deabe37a6b6df7014f1b30a97614e6e600860010160405180602001604052908160008201548152505061561e565b600860030154604051808381526020018281526020019250505060405180910390a15b614e99615a7f565b73ffffffffffffffffffffffffffffffffffffffff1663e5839836306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614f1557600080fd5b505afa158015614f29573d6000803e3d6000fd5b505050506040513d6020811015614f3f57600080fd5b810190808051906020019092919050505015614fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180616cac6022913960400191505060405180910390fd5b6000614fb28888614869565b90507fe5d4e30fb8364e57bc4d662a07d0cf36f4c34552004c4c3624620a2c1d1c03dc868660405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a1809350505050949350505050565b6000615069600361505b600261504d600261503f88614485565b6162f590919063ffffffff16565b6159f790919063ffffffff16565b61637b90919063ffffffff16565b9050919050565b60008060008714158015615085575060008514155b6150f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f612064656e6f6d696e61746f72206973207a65726f000000000000000000000081525060200191505060405180910390fd5b6000806000606060fc73ffffffffffffffffffffffffffffffffffffffff168c8c8c8c8c8c6040516020018087815260200186815260200185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040526040518082805190602001908083835b60208310615191578051825260208201915060208101905060208303925061516e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146151f1576040519150601f19603f3d011682016040523d82523d6000602084013e6151f6565b606091505b50809250819350505081615255576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180616e586027913960400191505060405180910390fd5b61526081600061562c565b935061526d81602061562c565b925083839550955050505050965096945050505050565b61528c614375565b6152fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61530781615670565b50565b60006060600060f573ffffffffffffffffffffffffffffffffffffffff1684604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061537b5780518252602082019150602081019050602083039250615358565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d80600081146153db576040519150601f19603f3d011682016040523d82523d6000602084013e6153e0565b606091505b5080935081925050508061543f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180616ea4602c913960400191505060405180910390fd5b61544a826000615c0c565b92505050919050565b61545b616af3565b600061547a6008600201546008600301546159f790919063ffffffff16565b4210156154ad5760086001016008600301548160405180602001604052908160008201548152505091509150915061561a565b60008060006154e16008600201546154d360086003015442615b7a90919063ffffffff16565b61637b90919063ffffffff16565b9050615563615508600860010160405180602001604052908160008201548152505061561e565b6155186155136157d2565b61561e565b61553a600860000160405180602001604052908160008201548152505061561e565b61554a6155456157d2565b61561e565b85600460009054906101000a900460ff1660ff16615070565b8093508194505050600083148061557a5750600082145b156155ae5760086001016008600301548160405180602001604052908160008201548152505091509450945050505061561a565b6155b6616af3565b6155d96155c2846157b4565b6155cb866157b4565b61618b90919063ffffffff16565b9050600061560c6155f8846008600201546162f590919063ffffffff16565b6008600301546159f790919063ffffffff16565b905081819650965050505050505b9091565b600081600001519050919050565b60006156388383615c0c565b60001c905092915050565b600061566861566361565484616101565b856163c590919063ffffffff16565b6162d4565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156156f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180616c016026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6157bc616af3565b6040518060200160405280838152509050919050565b6157da616af3565b604051806020016040528069d3c21bcecceda1000000815250905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561589c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f302069732061207265736572766564206164647265737300000000000000000081525060200191505060405180910390fd5b60008214156158ae57600190506159f1565b60006158d3600860010160405180602001604052908160008201548152505084615643565b90506158ea816006546159f790919063ffffffff16565b60068190555061594281600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150505b92915050565b600080828401905083811015615a75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dcf0aaed60405160200180807f467265657a6572000000000000000000000000000000000000000000000000008152506007019050604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015615b3a57600080fd5b505afa158015615b4e573d6000803e3d6000fd5b505050506040513d6020811015615b6457600080fd5b8101908080519060200190929190505050905090565b6000615bbc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250616824565b905092915050565b600080828481615bd057fe5b0490506000838581615bde57fe5b061415615bee5780915050615c06565b615c026001826159f790919063ffffffff16565b9150505b92915050565b6000615c226020836159f790919063ffffffff16565b83511015615c98576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f736c6963696e67206f7574206f662072616e676500000000000000000000000081525060200191505060405180910390fd5b60006020830184015190508091505092915050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415615cec5760009050615e12565b6000615d11600860010160405180602001604052908160008201548152505084615643565b9050615d6581600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3809150505b9392505050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415615ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180616f01602a913960400191505060405180910390fd5b6000615ecd600860010160405180602001604052908160008201548152505084615643565b905080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015615f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180616df76029913960400191505060405180910390fd5b615fb981600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054615b7a90919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061604e81600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546159f790919063ffffffff16565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191505092915050565b616109616af3565b6161116168e4565b821115616169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180616cce6036913960400191505060405180910390fd5b604051806020016040528069d3c21bcecceda100000084028152509050919050565b616193616af3565b60008260000151141561620e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f63616e277420646976696465206279203000000000000000000000000000000081525060200191505060405180910390fd5b600069d3c21bcecceda10000008460000151029050836000015169d3c21bcecceda1000000828161623b57fe5b04146162af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6f766572666c6f7720617420646976696465000000000000000000000000000081525060200191505060405180910390fd5b6040518060200160405280846000015183816162c757fe5b0481525091505092915050565b600069d3c21bcecceda10000008260000151816162ed57fe5b049050919050565b6000808314156163085760009050616375565b600082840290508284828161631957fe5b0414616370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180616dd66021913960400191505060405180910390fd5b809150505b92915050565b60006163bd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250616903565b905092915050565b6163cd616af3565b6000836000015114806163e4575060008260000151145b156164005760405180602001604052806000815250905061681e565b69d3c21bcecceda10000008260000151141561641e5782905061681e565b69d3c21bcecceda10000008360000151141561643c5781905061681e565b600069d3c21bcecceda1000000616452856169c9565b600001518161645d57fe5b049050600061646b85616a00565b600001519050600069d3c21bcecceda1000000616487866169c9565b600001518161649257fe5b04905060006164a086616a00565b600001519050600082850290506000851461653457828582816164bf57fe5b0414616533576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783179312064657465637465640000000000000000000081525060200191505060405180910390fd5b5b600069d3c21bcecceda100000082029050600082146165d65769d3c21bcecceda100000082828161656157fe5b04146165d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f766572666c6f772078317931202a206669786564312064657465637465640081525060200191505060405180910390fd5b5b809150600084860290506000861461666757848682816165f257fe5b0414616666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783279312064657465637465640000000000000000000081525060200191505060405180910390fd5b5b60008488029050600088146166f5578488828161668057fe5b04146166f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783179322064657465637465640000000000000000000081525060200191505060405180910390fd5b5b6166fd616a3d565b878161670557fe5b049650616710616a3d565b858161671857fe5b04945060008588029050600088146167a9578588828161673457fe5b04146167a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6f766572666c6f7720783279322064657465637465640000000000000000000081525060200191505060405180910390fd5b5b6167b1616af3565b60405180602001604052808781525090506167da81604051806020016040528087815250616a4a565b90506167f481604051806020016040528086815250616a4a565b905061680e81604051806020016040528085815250616a4a565b9050809a50505050505050505050505b92915050565b60008383111582906168d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561689657808201518184015260208101905061687b565b50505050905090810190601f1680156168c35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60007601357c299a88ea76a58924d52ce4f26a85af186c2b9e74905090565b600080831182906169af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015616974578082015181840152602081019050616959565b50505050905090810190601f1680156169a15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816169bb57fe5b049050809150509392505050565b6169d1616af3565b604051806020016040528069d3c21bcecceda1000000808560000151816169f457fe5b04028152509050919050565b616a08616af3565b604051806020016040528069d3c21bcecceda100000080856000015181616a2b57fe5b04028460000151038152509050919050565b600064e8d4a51000905090565b616a52616af3565b6000826000015184600001510190508360000151811015616adb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f616464206f766572666c6f77206465746563746564000000000000000000000081525060200191505060405180910390fd5b60405180602001604052808281525091505092915050565b6040518060200160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10616b4757803560ff1916838001178555616b75565b82800160010185558215616b75579182015b82811115616b74578235825591602001919060010190616b59565b5b509050616b829190616b86565b5090565b616ba891905b80821115616ba4576000816000905550600101616b8c565b5090565b9056fe6572726f722063616c6c696e67206e756d62657256616c696461746f7273496e53657420707265636f6d70696c65696e666c6174696f6e466163746f72557064617465506572696f64206d757374206265203e20304f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734d7573742070726f766964652061206e6f6e2d7a65726f20696e666c6174696f6e20726174654d7573742070726f766964652061206e6f6e2d7a65726f20696e666c6174696f6e20726174652e6572726f722063616c6c696e672067657456657269666965645365616c4269746d617046726f6d48656164657220707265636f6d70696c6563616e27742063616c6c207768656e20636f6e74726163742069732066726f7a656e63616e277420637265617465206669786964697479206e756d626572206c6172676572207468616e206d61784e6577466978656428296572726f722063616c6c696e672076616c696461746f725369676e65724164647265737346726f6d43757272656e7453657420707265636f6d70696c656572726f722063616c6c696e67206e756d62657256616c696461746f7273496e43757272656e7453657420707265636f6d70696c656572726f722063616c6c696e672076616c696461746f725369676e65724164647265737346726f6d53657420707265636f6d70696c6572657365727665642061646472657373203078302063616e6e6f74206861766520616c6c6f77616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777472616e736665722076616c75652065786365656465642062616c616e6365206f662073656e6465727472616e736665722076616c75652065786365656465642073656e646572277320616c6c6f77616e636520666f7220726563697069656e746572726f722063616c6c696e67206672616374696f6e4d756c45787020707265636f6d70696c656572726f722063616c6c696e672067657445706f636853697a6520707265636f6d70696c656572726f722063616c6c696e6720676574506172656e745365616c4269746d617020707265636f6d70696c656572726f722063616c6c696e6720676574426c6f636b4e756d62657246726f6d48656164657220707265636f6d70696c657472616e7366657220617474656d7074656420746f2072657365727665642061646472657373203078306572726f722063616c6c696e67206861736848656164657220707265636f6d70696c65a265627a7a723158209cdbb39b2f64fc5a4a86de97254593c375812f274d4f7893849665ac3c036f4b64736f6c634300050d0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : test (bool): False
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
55:620:19:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55:620:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11464:77:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11464:77:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7687:288;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7687:288:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3716:367:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3716:367:4;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13671:250:18;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13671:250:18;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53:23:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12772:99:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4175:1275;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;4175:1275:18;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4175:1275:18;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4175:1275:18;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4175:1275:18;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4175:1275:18;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4175:1275:18;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4175:1275:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4175:1275:18;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4175:1275:18;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4175:1275:18;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4175:1275:18;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4175:1275:18;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4175:1275:18;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4175:1275:18;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4175:1275:18;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;4175:1275:18;;;;;;;;;;;;:::i;:::-;;5599:491;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5599:491:18;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10687:718;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10687:718:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6211:266:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6211:266:4;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6211:266:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6211:266:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6211:266:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6211:266:4;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6211:266:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6211:266:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6211:266:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6211:266:4;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11776:77:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6370:415;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6370:415:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2555:147:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2555:147:4;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14507:199:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8154:399;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8154:399:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9767:602;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9767:602:18;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8361:343:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8361:343:4;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;8361:343:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8361:343:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;8361:343:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;8361:343:4;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;556:117:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19404:287:18;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19404:287:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4387:378:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4387:378:4;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7053:288;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7053:288:4;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;7053:288:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;7053:288:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;7053:288:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;7053:288:4;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20437:624:18;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;20437:624:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12502:127;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12502:127:18;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1684:137:26;;;:::i;:::-;;9896:112:4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2540:25:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4902:326:4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6606:329;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6606:329:4;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;6606:329:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6606:329:4;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;6606:329:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;6606:329:4;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;899:77:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1250:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11602:81:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;11602:81:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2803:109:4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5444:321;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5444:321:4;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7065:333:18;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7065:333:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13022:266;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18010:163;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18010:163:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3089:230:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3089:230:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;14949:663:18;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14949:663:18;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12135:138;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12135:138:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2125:266:4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9368:267:18;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9368:267:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;9368:267:18;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9368:267:18;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;9368:267:18;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9617:147:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9617:147:4;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1244:763;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;1244:763:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1970:107:26;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1970:107:26;;;;;;;;;;;;;;;;;;;:::i;:::-;;7632:322:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7632:322:4;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11464:77:18;11503:13;11531:5;11524:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11464:77;:::o;7687:288::-;7776:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;7815:1;7796:21;;:7;:21;;;;7788:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7901:5;7870:7;:19;7878:10;7870:19;;;;;;;;;;;;;;;:28;7890:7;7870:28;;;;;;;;;;;;;;;:36;;;;7938:7;7917:36;;7926:10;7917:36;;;7947:5;7917:36;;;;;;;;;;;;;;;;;;7966:4;7959:11;;7687:288;;;;;;:::o;3716:367:4:-;3798:7;3813:16;3835:12;409:8;3870:24;;3912:5;3927:12;3895:46;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3895:46:4;;;3870:72;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3870:72:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3853:89:4;;;;;;;;3956:7;3948:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4050:27;4070:3;4075:1;4050:19;:27::i;:::-;4035:43;;;;3716:367;;;:::o;13671:250:18:-;13731:7;13746:50;;:::i;:::-;13832:27;:25;:27::i;:::-;13803:56;;;;;13872:44;13886:22;13910:5;13872:13;:44::i;:::-;13865:51;;;13671:250;;;:::o;53:23:3:-;;;;;;;;;;;;;:::o;12772:99:18:-;12818:7;12840:26;12853:12;;12840;:26::i;:::-;12833:33;;12772:99;:::o;4175:1275::-;233:11:3;;;;;;;;;;;232:12;224:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;297:4;283:11;;:18;;;;;;;;;;;;;;;;;;4558:1:18;4541:13;:18;;4533:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4646:1;4616:27;:31;4608:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4698:30;4717:10;4698:18;:30::i;:::-;4750:1;4735:12;:16;;;;4765:5;;4757;:13;;;;;;;:::i;:::-;;4786:7;;4776;:17;;;;;;;:::i;:::-;;4811:9;4799;;:21;;;;;;;;;;;;;;;;;;4849:31;4866:13;4849:16;:31::i;:::-;4827:14;:19;;:53;;;;;;;;;;;4910:20;:18;:20::i;:::-;4886:14;:21;;:44;;;;;;;;;;;4966:27;4936:14;:27;;:57;;;;5084:3;5049:14;:32;;:38;;;;5136:20;;:27;;5102:23;;:30;;:61;5094:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5200:9;5212:1;5200:13;;5195:143;5219:23;;:30;;5215:1;:34;5195:143;;;5273:58;5279:23;;5303:1;5279:26;;;;;;;;;;;;;;;5307:20;;5328:1;5307:23;;;;;;;;;;;;;5273:5;:58::i;:::-;;5255:8;5261:1;5255;:5;;:8;;;;:::i;:::-;5251:12;;5195:143;;;;5343:28;5355:15;5343:11;:28::i;:::-;5425:18;;5408:36;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;5408:36:18;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5408:36:18;;;5398:47;;;;;;5377:18;:68;;;;4175:1275;;;;;;;;;;;;;;:::o;5599:491::-;1103:9:26;:7;:9::i;:::-;1095:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2547:50:18;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;5744:1;5736:4;:9;;5728:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5818:1;5803:12;:16;5795:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5876:22;5893:4;5876:16;:22::i;:::-;5854:14;:19;;:44;;;;;;;;;;;5934:12;5904:14;:27;;:42;;;;5958:127;5992:4;6004:12;6076:3;5958:127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1159:1:26;;5599:491:18;;:::o;10687:718::-;10824:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;250:12:2;:10;:12::i;:::-;:21;;;280:4;250:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;250:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;250:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;250:36:2;;;;;;;;;;;;;;;;249:37;241:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10838:13:18;10854:43;10868:14;:21;;10854:43;;;;;;;;;;;;;;;;;10891:5;10854:13;:43::i;:::-;10838:59;;10925:1;10911:16;;:2;:16;;;;10903:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10997:8;:14;11006:4;10997:14;;;;;;;;;;;;;;;;10988:5;:23;;10980:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11087:7;:13;11095:4;11087:13;;;;;;;;;;;;;;;:25;11101:10;11087:25;;;;;;;;;;;;;;;;11078:5;:34;;11063:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11206:23;11223:5;11206:8;:12;11215:2;11206:12;;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;11191:8;:12;11200:2;11191:12;;;;;;;;;;;;;;;:38;;;;11252:25;11271:5;11252:8;:14;11261:4;11252:14;;;;;;;;;;;;;;;;:18;;:25;;;;:::i;:::-;11235:8;:14;11244:4;11235:14;;;;;;;;;;;;;;;:42;;;;11311:36;11341:5;11311:7;:13;11319:4;11311:13;;;;;;;;;;;;;;;:25;11325:10;11311:25;;;;;;;;;;;;;;;;:29;;:36;;;;:::i;:::-;11283:7;:13;11291:4;11283:13;;;;;;;;;;;;;;;:25;11297:10;11283:25;;;;;;;;;;;;;;;:64;;;;11373:2;11358:25;;11367:4;11358:25;;;11377:5;11358:25;;;;;;;;;;;;;;;;;;11396:4;11389:11;;;10687:718;;;;;;;:::o;6211:266:4:-;6334:4;6348:12;355:8;6380:30;;6428:6;6436;6444;6411:40;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;6411:40:4;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;6411:40:4;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6411:40:4;;;6380:72;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;6380:72:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;6366:86:4;;;;;6465:7;6458:14;;;6211:266;;;;;:::o;11776:77:18:-;11819:5;11839:9;;;;;;;;;;;11832:16;;11776:77;:::o;6370:415::-;6481:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;6522:1;6503:21;;:7;:21;;;;6495:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6577:16;6596:7;:19;6604:10;6596:19;;;;;;;;;;;;;;;:28;6616:7;6596:28;;;;;;;;;;;;;;;;6577:47;;6630:16;6649:19;6662:5;6649:8;:12;;:19;;;;:::i;:::-;6630:38;;6705:8;6674:7;:19;6682:10;6674:19;;;;;;;;;;;;;;;:28;6694:7;6674:28;;;;;;;;;;;;;;;:39;;;;6745:7;6724:39;;6733:10;6724:39;;;6754:8;6724:39;;;;;;;;;;;;;;;;;;6776:4;6769:11;;;;6370:415;;;;;;:::o;2555:147:4:-;2628:7;2650:47;2669:11;2682:14;:12;:14::i;:::-;2650:18;:47::i;:::-;2643:54;;2555:147;;;:::o;14507:199:18:-;14561:7;14610:1;14602:10;;14580:18;;:32;14576:126;;;1469:28:5;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1469:28:5;;;1459:39;;;;;;14622:27:18;;;;14576:126;14677:18;;14670:25;;14507:199;;:::o;8154:399::-;8235:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;8276:8;;;;;;;;;;;:27;;;8304:23;:21;:23::i;:::-;8276:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8276:52:18;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8276:52:18;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8276:52:18;;;;;;;;;;;;;;;;8262:66;;:10;:66;;;:138;;;;8354:8;;;;;;;;;;;:22;;;2467:30:5;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2467:30:5;;;2457:41;;;;;;8354:46:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8354:46:18;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8354:46:18;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8354:46:18;;;;;;;;;;;;;;;;8340:60;;:10;:60;;;8262:138;:212;;;;8426:8;;;;;;;;;;;:22;;;1293:31;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1293:31:18;;;1283:42;;;;;;8426:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8426:48:18;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8426:48:18;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8426:48:18;;;;;;;;;;;;;;;;8412:62;;:10;:62;;;8262:212;8247:272;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8532:16;8538:2;8542:5;8532;:16::i;:::-;8525:23;;8154:399;;;;;;:::o;9767:602::-;9836:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;9877:8;;;;;;;;;;;:27;;;9905:23;:21;:23::i;:::-;9877:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9877:52:18;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9877:52:18;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9877:52:18;;;;;;;;;;;;;;;;9863:66;;:10;:66;;;:140;;;;9955:8;;;;;;;;;;;:22;;;1293:31;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1293:31:18;;;1283:42;;;;;;9955:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9955:48:18;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9955:48:18;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9955:48:18;;;;;;;;;;;;;;;;9941:62;;:10;:62;;;9863:140;9848:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10054:13;10070:43;10084:14;:21;;10070:43;;;;;;;;;;;;;;;;;10107:5;10070:13;:43::i;:::-;10054:59;;10136:8;:20;10145:10;10136:20;;;;;;;;;;;;;;;;10127:5;:29;;10119:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10214:23;10231:5;10214:12;;:16;;:23;;;;:::i;:::-;10199:12;:38;;;;10266:31;10291:5;10266:8;:20;10275:10;10266:20;;;;;;;;;;;;;;;;:24;;:31;;;;:::i;:::-;10243:8;:20;10252:10;10243:20;;;;;;;;;;;;;;;:54;;;;10337:1;10308:39;;10317:10;10308:39;;;10341:5;10308:39;;;;;;;;;;;;;;;;;;10360:4;10353:11;;;9767:602;;;;;:::o;8361:343:4:-;8444:7;8459:16;8481:12;764:9;8516:35;;8569:6;8552:24;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8552:24:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8552:24:4;;;8516:61;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8516:61:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;8499:78:4;;;;;;;;8591:7;8583:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8672:27;8692:3;8697:1;8672:19;:27::i;:::-;8665:34;;;;8361:343;;;:::o;556:117:19:-;607:7;616;625;634;657:1;660;663;666;649:19;;;;;;;;;;;;;;;;;;;;556:117;;;;:::o;19404:287:18:-;104:1:0;82:24;;:10;:24;;;74:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;250:12:2;:10;:12::i;:::-;:21;;;280:4;250:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;250:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;250:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;250:36:2;;;;;;;;;;;;;;;;249:37;241:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2547:50:18;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;19535:13;19551:43;19565:14;:21;;19551:43;;;;;;;;;;;;;;;;;19588:5;19551:13;:43::i;:::-;19535:59;;19617:25;19636:5;19617:8;:14;19626:4;19617:14;;;;;;;;;;;;;;;;:18;;:25;;;;:::i;:::-;19600:8;:14;19609:4;19600:14;;;;;;;;;;;;;;;:42;;;;19663:23;19680:5;19663:12;;:16;;:23;;;;:::i;:::-;19648:12;:38;;;;2977:1;331::2;;19404:287:18;;:::o;4387:378:4:-;4495:7;4512:16;4534:12;409:8;4569:24;;4611:5;4618:11;4594:36;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4594:36:4;;;4569:62;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4569:62:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;4552:79:4;;;;;;;;4645:7;4637:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4732:27;4752:3;4757:1;4732:19;:27::i;:::-;4717:43;;;;4387:378;;;;:::o;7053:288::-;7115:7;7130:16;7152:12;635:8;7187:22;;7227:6;7210:24;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;7210:24:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7210:24:4;;;7187:48;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;7187:48:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;7170:65:4;;;;;;;;7249:7;7241:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7309:27;7329:3;7334:1;7309:19;:27::i;:::-;7302:34;;;;7053:288;;;:::o;20437:624:18:-;104:1:0;82:24;;:10;:24;;;74:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;250:12:2;:10;:12::i;:::-;:21;;;280:4;250:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;250:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;250:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;250:36:2;;;;;;;;;;;;;;;;249:37;241:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20697:13:18;20713:44;20727:14;:21;;20713:44;;;;;;;;;;;;;;;;;20750:6;20713:13;:44::i;:::-;20697:60;;20780:25;20799:5;20780:8;:14;20789:4;20780:14;;;;;;;;;;;;;;;;:18;;:25;;;;:::i;:::-;20763:8;:14;20772:4;20763:14;;;;;;;;;;;;;;;:42;;;;20820:53;20830:42;20841:4;20847:13;20862:9;20830:10;:42::i;:::-;20820:5;:9;;:53;;;;:::i;:::-;20812:61;;20887:51;20897:40;20908:4;20914:12;20928:8;20897:10;:40::i;:::-;20887:5;:9;;:51;;;;:::i;:::-;20879:59;;20952:60;20962:49;20973:4;20979:19;21000:10;20962;:49::i;:::-;20952:5;:9;;:60;;;;:::i;:::-;20944:68;;21033:23;21050:5;21033:12;;:16;;:23;;;;:::i;:::-;21018:12;:38;;;;331:1:2;20437:624:18;;;;;;;;:::o;12502:127::-;12566:7;12588:36;12601:8;:22;12610:12;12601:22;;;;;;;;;;;;;;;;12588:12;:36::i;:::-;12581:43;;12502:127;;;:::o;1684:137:26:-;1103:9;:7;:9::i;:::-;1095:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1782:1;1745:40;;1766:6;;;;;;;;;;;1745:40;;;;;;;;;;;;1812:1;1795:6;;:19;;;;;;;;;;;;;;;;;;1684:137::o;9896:112:4:-;9954:7;9976:27;9990:12;9976:13;:27::i;:::-;9969:34;;9896:112;:::o;2540:25:5:-;;;;;;;;;;;;;:::o;4902:326:4:-;4963:7;4978:16;5000:12;467:8;5035:28;;5089:12;5064:39;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5064:39:4;;;5035:69;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5035:69:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5018:86:4;;;;;;;;5118:7;5110:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5196:27;5216:3;5221:1;5196:19;:27::i;:::-;5189:34;;;;4902:326;:::o;6606:329::-;6682:7;6697:16;6719:12;583:8;6754:35;;6807:6;6790:24;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;6790:24:4;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6790:24:4;;;6754:61;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;6754:61:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;6737:78:4;;;;;;;;6829:7;6821:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6903:27;6923:3;6928:1;6903:19;:27::i;:::-;6896:34;;;;6606:329;;;:::o;899:77:26:-;937:7;963:6;;;;;;;;;;;956:13;;899:77;:::o;1250:92::-;1290:4;1329:6;;;;;;;;;;;1313:22;;:12;:10;:12::i;:::-;:22;;;1306:29;;1250:92;:::o;11602:81:18:-;11643:13;11671:7;11664:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11602:81;:::o;2803:109:4:-;2850:7;2872:35;2894:12;2872:21;:35::i;:::-;2865:42;;2803:109;:::o;5444:321::-;5517:7;5532:16;5554:12;467:8;5589:28;;5635:11;5618:29;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5618:29:4;;;5589:59;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5589:59:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5572:76:4;;;;;;;;5662:7;5654:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5733:27;5753:3;5758:1;5733:19;:27::i;:::-;5726:34;;;;5444:321;;;:::o;7065:333:18:-;7176:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;7190:16;7209:7;:19;7217:10;7209:19;;;;;;;;;;;;;;;:28;7229:7;7209:28;;;;;;;;;;;;;;;;7190:47;;7243:16;7262:19;7275:5;7262:8;:12;;:19;;;;:::i;:::-;7243:38;;7318:8;7287:7;:19;7295:10;7287:19;;;;;;;;;;;;;;;:28;7307:7;7287:28;;;;;;;;;;;;;;;:39;;;;7358:7;7337:39;;7346:10;7337:39;;;7367:8;7337:39;;;;;;;;;;;;;;;;;;7389:4;7382:11;;;;7065:333;;;;;;:::o;13022:266::-;13079:7;13088;13097;13106;13136:28;:14;:19;;:26;;;;;;;;;;;;;;;;;;:28::i;:::-;13172:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;13210:14;:27;;;13245:14;:32;;;13121:162;;;;;;;;13022:266;;;;:::o;18010:163::-;18127:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;250:12:2;:10;:12::i;:::-;:21;;;280:4;250:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;250:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;250:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;250:36:2;;;;;;;;;;;;;;;;249:37;241:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18148:20:18;18158:2;18162:5;18148:9;:20::i;:::-;18141:27;;18010:163;;;;;;:::o;3089:230:5:-;1103:9:26;:7;:9::i;:::-;1095:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3193:1:5;3166:29;;:15;:29;;;;3158:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3259:15;3238:8;;:37;;;;;;;;;;;;;;;;;;3298:15;3286:28;;;;;;;;;;;;3089:230;:::o;14949:663:18:-;15007:7;15022:50;;:::i;:::-;15108:27;:25;:27::i;:::-;15079:56;;;;;15537:70;:58;15572:22;15537:27;15558:5;15537:20;:27::i;:::-;:34;;:58;;;;:::i;:::-;:68;:70::i;:::-;15530:77;;;14949:663;;;:::o;12135:138::-;12216:7;12238;:21;12246:12;12238:21;;;;;;;;;;;;;;;:30;12260:7;12238:30;;;;;;;;;;;;;;;;12231:37;;12135:138;;;;:::o;2125:266:4:-;2170:7;2185:16;2207:12;518:8;2242:21;;2264:18;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2264:18:4;;;2242:41;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2242:41:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;2225:58:4;;;;;;;;2297:7;2289:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2359:27;2379:3;2384:1;2359:19;:27::i;:::-;2352:34;;;;2125:266;:::o;9368:267:18:-;9523:4;2547:50;;:::i;:::-;2603:19;2669:27;:25;:27::i;:::-;2629:67;;;;;;;;2722:14;:32;;;2707:11;:47;2703:269;;2788:22;2764:14;:21;;:46;;;;;;;;;;;2853:11;2818:14;:32;;:46;;;;2877:88;2900:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;2932:14;:32;;;2877:88;;;;;;;;;;;;;;;;;;;;;;;;2703:269;250:12:2;:10;:12::i;:::-;:21;;;280:4;250:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;250:36:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;250:36:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;250:36:2;;;;;;;;;;;;;;;;249:37;241:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9537:14:18;9554:19;9563:2;9567:5;9554:8;:19::i;:::-;9537:36;;9584:24;9600:7;;9584:24;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;9584:24:18;;;;;;;;;;;;;;9621:9;9614:16;;;9368:267;;;;;;;;:::o;9617:147:4:-;9682:7;9704:55;9757:1;9704:48;9750:1;9704:41;9743:1;9704:34;9726:11;9704:21;:34::i;:::-;:38;;:41;;;;:::i;:::-;:45;;:48;;;;:::i;:::-;:52;;:55;;;;:::i;:::-;9697:62;;9617:147;;;:::o;1244:763::-;1438:7;1447;1486:1;1470:12;:17;;:38;;;;;1507:1;1491:12;:17;;1470:38;1462:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1540:23;1569:25;1600:12;1618:16;295:8;1657:23;;1705:10;1717:12;1731:10;1743:12;1757:8;1767:9;1688:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1688:89:4;;;1657:126;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1657:126:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;1640:143:4;;;;;;;;1797:7;1789:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1872:27;1892:3;1897:1;1872:19;:27::i;:::-;1854:45;;1925:28;1945:3;1950:2;1925:19;:28::i;:::-;1905:48;;1967:15;1984:17;1959:43;;;;;;;;1244:763;;;;;;;;;:::o;1970:107:26:-;1103:9;:7;:9::i;:::-;1095:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2042:28;2061:8;2042:18;:28::i;:::-;1970:107;:::o;7632:322:4:-;7703:7;7718:16;7740:12;698:9;7775:33;;7826:11;7809:29;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7809:29:4;;;7775:64;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;7775:64:4;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;7758:81:4;;;;;;;;7853:7;7845:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7922:27;7942:3;7947:1;7922:19;:27::i;:::-;7915:34;;;;7632:322;;;:::o;16382:1407:18:-;16441:27;;:::i;:::-;16470:7;16538:65;16575:14;:27;;;16538:14;:32;;;:36;;:65;;;;:::i;:::-;16532:3;:71;16528:156;;;16621:14;:21;;16644:14;:32;;;16613:64;;;;;;;;;;;;;;;;;;;;;;;;;;16528:156;16690:17;16713:19;16811:29;16843:86;16896:14;:27;;;16843:41;16851:14;:32;;;16843:3;:7;;:41;;;;:::i;:::-;:45;;:86;;;;:::i;:::-;16811:118;;16963:214;16985:30;:14;:21;;:28;;;;;;;;;;;;;;;;;;:30::i;:::-;17023:29;:20;:18;:20::i;:::-;:27;:29::i;:::-;17060:28;:14;:19;;:26;;;;;;;;;;;;;;;;;;:28::i;:::-;17096:29;:20;:18;:20::i;:::-;:27;:29::i;:::-;17133:21;17162:9;;;;;;;;;;;16963:214;;:14;:214::i;:::-;16936:241;;;;;;;;17321:1;17308:9;:14;:34;;;;17341:1;17326:11;:16;17308:34;17304:119;;;17360:14;:21;;17383:14;:32;;;17352:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17304:119;17429:50;;:::i;:::-;17482:77;17524:29;17541:11;17524:16;:29::i;:::-;17482:27;17499:9;17482:16;:27::i;:::-;:34;;:77;;;;:::i;:::-;17429:130;;17565:19;17587:104;17631:54;17663:21;17631:14;:27;;;:31;;:54;;;;:::i;:::-;17587:14;:32;;;:36;;:104;;;;:::i;:::-;17565:126;;17706:22;17730:11;17698:44;;;;;;;;;16382:1407;;;:::o;1674:92:1:-;1732:7;1754:1;:7;;;1747:14;;1674:92;;;:::o;8864:150:4:-;8948:7;8978:30;8998:2;9002:5;8978:19;:30::i;:::-;8970:39;;8963:46;;8864:150;;;;:::o;15990:211:18:-;16107:7;16131:65;:53;16156:27;16177:5;16156:20;:27::i;:::-;16131:15;:24;;:53;;;;:::i;:::-;:63;:65::i;:::-;16124:72;;15990:211;;;;:::o;2178:225:26:-;2271:1;2251:22;;:8;:22;;;;2243:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2360:8;2331:38;;2352:6;;;;;;;;;;;2331:38;;;;;;;;;;;;2388:8;2379:6;;:17;;;;;;;;;;;;;;;;;;2178:225;:::o;1502:94:1:-;1550:15;;:::i;:::-;1580:11;;;;;;;;1589:1;1580:11;;;1573:18;;1502:94;;;:::o;1180:97::-;1221:15;;:::i;:::-;1251:21;;;;;;;;996:25;1251:21;;;1244:28;;1180:97;:::o;8732:388:18:-;8791:4;8825:1;8811:16;;:2;:16;;;;8803:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8874:1;8865:5;:10;8861:42;;;8892:4;8885:11;;;;8861:42;8909:13;8925:43;8939:14;:21;;8925:43;;;;;;;;;;;;;;;;;8962:5;8925:13;:43::i;:::-;8909:59;;8989:23;9006:5;8989:12;;:16;;:23;;;;:::i;:::-;8974:12;:38;;;;9033:23;9050:5;9033:8;:12;9042:2;9033:12;;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;9018:8;:12;9027:2;9018:12;;;;;;;;;;;;;;;:38;;;;9088:2;9067:31;;9084:1;9067:31;;;9092:5;9067:31;;;;;;;;;;;;;;;;;;9111:4;9104:11;;;8732:388;;;;;:::o;834:176:25:-;892:7;911:9;927:1;923;:5;911:17;;951:1;946;:6;;938:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;995:8;;;834:176;;;;:::o;4092:131:5:-;4137:8;4169;;;;;;;;;;;:27;;;1668;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1668:27:5;;;1658:38;;;;;;4169:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4169:48:5;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4169:48:5;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4169:48:5;;;;;;;;;;;;;;;;4153:65;;4092:131;:::o;1274:134:25:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1351:50;;1274:134;;;;:::o;3124:379:4:-;3227:7;3335:19;3371:9;3357:11;:23;;;;;;3335:45;;3417:1;3404:9;3390:11;:23;;;;;;:28;3386:113;;;3435:11;3428:18;;;;;3386:113;3474:18;3490:1;3474:11;:15;;:18;;;;:::i;:::-;3467:25;;;3124:379;;;;;:::o;9174:255::-;9258:7;9294:13;9304:2;9294:5;:9;;:13;;;;:::i;:::-;9281:2;:9;:26;;9273:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9338:9;9400:2;9393:5;9389:14;9385:2;9381:23;9375:30;9370:35;;9423:1;9416:8;;;9174:255;;;;:::o;21065:306:18:-;21144:7;21177:1;21163:16;;:2;:16;;;21159:45;;;21196:1;21189:8;;;;21159:45;21209:13;21225:43;21239:14;:21;;21225:43;;;;;;;;;;;;;;;;;21262:5;21225:13;:43::i;:::-;21209:59;;21289:23;21306:5;21289:8;:12;21298:2;21289:12;;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;21274:8;:12;21283:2;21274:12;;;;;;;;;;;;;;;:38;;;;21338:2;21323:25;;21332:4;21323:25;;;21342:5;21323:25;;;;;;;;;;;;;;;;;;21361:5;21354:12;;;21065:306;;;;;;:::o;788:96:24:-;833:15;867:10;860:17;;788:96;:::o;18370:469:18:-;18434:4;18468:1;18454:16;;:2;:16;;;;18446:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18523:13;18539:43;18553:14;:21;;18539:43;;;;;;;;;;;;;;;;;18576:5;18539:13;:43::i;:::-;18523:59;;18620:5;18596:8;:20;18605:10;18596:20;;;;;;;;;;;;;;;;:29;;18588:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18700:31;18725:5;18700:8;:20;18709:10;18700:20;;;;;;;;;;;;;;;;:24;;:31;;;;:::i;:::-;18677:8;:20;18686:10;18677:20;;;;;;;;;;;;;;;:54;;;;18752:23;18769:5;18752:8;:12;18761:2;18752:12;;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;18737:8;:12;18746:2;18737:12;;;;;;;;;;;;;;;:38;;;;18807:2;18786:31;;18795:10;18786:31;;;18811:5;18786:31;;;;;;;;;;;;;;;;;;18830:4;18823:11;;;18370:469;;;;:::o;2547:203:1:-;2599:15;;:::i;:::-;2635:13;:11;:13::i;:::-;2630:1;:18;;2622:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2720:25;;;;;;;;996;2729:1;:15;2720:25;;;2713:32;;2547:203;;;:::o;9180:283::-;9257:15;;:::i;:::-;9299:1;9288;:7;;;:12;;9280:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9328:9;996:25;9340:1;:7;;;:21;9328:33;;9394:1;:7;;;996:25;9375:1;:15;;;;;;:26;9367:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9437:21;;;;;;;;9450:1;:7;;;9446:1;:11;;;;;;9437:21;;;9430:28;;;9180:283;;;;:::o;2909:109::-;2970:7;996:25;2992:1;:7;;;:21;;;;;;2985:28;;2909:109;;;:::o;2159:459:25:-;2217:7;2463:1;2458;:6;2454:45;;;2487:1;2480:8;;;;2454:45;2509:9;2525:1;2521;:5;2509:17;;2553:1;2548;2544;:5;;;;;;:10;2536:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2610:1;2603:8;;;2159:459;;;;;:::o;3073:130::-;3131:7;3157:39;3161:1;3164;3157:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3150:46;;3073:130;;;;:::o;6206:1636:1:-;6285:15;;:::i;:::-;6323:1;6312;:7;;;:12;:28;;;;6339:1;6328;:7;;;:12;6312:28;6308:52;;;6349:11;;;;;;;;6358:1;6349:11;;;6342:18;;;;6308:52;996:25;6370:1;:7;;;:22;6366:36;;;6401:1;6394:8;;;;6366:36;996:25;6412:1;:7;;;:22;6408:36;;;6443:1;6436:8;;;;6408:36;6533:10;996:25;6546:10;6554:1;6546:7;:10::i;:::-;:16;;;:30;;;;;;6533:43;;6582:10;6595:13;6606:1;6595:10;:13::i;:::-;:19;;;6582:32;;6620:10;996:25;6633:10;6641:1;6633:7;:10::i;:::-;:16;;;:30;;;;;;6620:43;;6669:10;6682:13;6693:1;6682:10;:13::i;:::-;:19;;;6669:32;;6785:12;6805:2;6800;:7;6785:22;;6823:1;6817:2;:7;6813:63;;6847:2;6841;6834:4;:9;;;;;;:15;6826:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6813:63;6975:18;996:25;6996:4;:18;6975:39;;7032:1;7024:4;:9;7020:91;;996:25;7056:4;7043:10;:17;;;;;;:32;7035:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7020:91;7124:10;7117:17;;7141:12;7161:2;7156;:7;7141:22;;7179:1;7173:2;:7;7169:63;;7203:2;7197;7190:4;:9;;;;;;:15;7182:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7169:63;7239:12;7259:2;7254;:7;7239:22;;7277:1;7271:2;:7;7267:63;;7301:2;7295;7288:4;:9;;;;;;:15;7280:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7267:63;7347:14;:12;:14::i;:::-;7342:2;:19;;;;;;7337:24;;7377:14;:12;:14::i;:::-;7372:2;:19;;;;;;7367:24;;7397:12;7417:2;7412;:7;7397:22;;7435:1;7429:2;:7;7425:63;;7459:2;7453;7446:4;:9;;;;;;:15;7438:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7425:63;7572:22;;:::i;:::-;7597:14;;;;;;;;7606:4;7597:14;;;7572:39;;7626:27;7630:6;7638:14;;;;;;;;7647:4;7638:14;;;7626:3;:27::i;:::-;7617:36;;7695:27;7699:6;7707:14;;;;;;;;7716:4;7707:14;;;7695:3;:27::i;:::-;7686:36;;7764:27;7768:6;7776:14;;;;;;;;7785:4;7776:14;;;7764:3;:27::i;:::-;7755:36;;7831:6;7824:13;;;;;;;;;;;;6206:1636;;;;;:::o;1732:187:25:-;1818:7;1850:1;1845;:6;;1853:12;1837:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1837:29:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1876:9;1892:1;1888;:5;1876:17;;1911:1;1904:8;;;1732:187;;;;;:::o;2163:127:1:-;2209:7;2231:54;2224:61;;2163:127;:::o;3718:338:25:-;3804:7;3901:1;3897;:5;3904:12;3889:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3889:28:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3927:9;3943:1;3939;:5;;;;;;3927:17;;4048:1;4041:8;;;3718:338;;;;;:::o;4068:159:1:-;4127:15;;:::i;:::-;4157:47;;;;;;;;996:25;;4167:1;:7;;;:21;;;;;;4166:37;4157:47;;;4150:54;;4068:159;;;:::o;4514:172::-;4576:15;;:::i;:::-;4606:57;;;;;;;;996:25;;4626:1;:7;;;:21;;;;;;4625:37;4615:1;:7;;;:47;4606:57;;;4599:64;;4514:172;;;:::o;1905:87::-;1952:7;1974:13;1967:20;;1905:87;:::o;5058:207::-;5132:15;;:::i;:::-;5155:9;5177:1;:7;;;5167:1;:7;;;:17;5155:29;;5203:1;:7;;;5198:1;:12;;5190:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5249:11;;;;;;;;5258:1;5249:11;;;5242:18;;;5058:207;;;;:::o;55:620:19:-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://9cdbb39b2f64fc5a4a86de97254593c375812f274d4f7893849665ac3c036f4b
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.