From 7697fd8571f430fa3ab9ab62d6cf318544e05b60 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 3 Oct 2024 12:30:59 -0500 Subject: [PATCH 01/10] validator messages full coverage --- .../validator-manager/ValidatorMessages.sol | 2 +- .../tests/ValidatorMessagesTests.t.sol | 326 +++++++++++++++++- 2 files changed, 314 insertions(+), 14 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index b87678be2..8bd1ac44c 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -146,7 +146,7 @@ library ValidatorMessages { * @param subnetConversionData The struct representing data to pack into the message. * @return The packed message. */ - function packSubnetConversionData(SubnetConversionData calldata subnetConversionData) + function packSubnetConversionData(SubnetConversionData memory subnetConversionData) internal pure returns (bytes memory) diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index 12fe198c9..1f60a7649 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -7,13 +7,19 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {PChainOwner} from "../interfaces/IValidatorManager.sol"; +import { + PChainOwner, + SubnetConversionData, + InitialValidator +} from "../interfaces/IValidatorManager.sol"; contract ValidatorMessagesTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_NODE_ID = bytes(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes32 public constant DEFAULT_SUBNET_CONVERSION_ID = + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); @@ -23,13 +29,293 @@ contract ValidatorMessagesTest is Test { uint64 public constant DEFAULT_EXPIRY = 1000; // solhint-disable-next-line var-name-mixedcase PChainOwner public DEFAULT_P_CHAIN_OWNER; + address public constant DEFAULT_OWNER = 0x1234567812345678123456781234567812345678; function setUp() public { address[] memory addresses = new address[](1); - addresses[0] = 0x1234567812345678123456781234567812345678; + addresses[0] = DEFAULT_OWNER; DEFAULT_P_CHAIN_OWNER = PChainOwner({threshold: 1, addresses: addresses}); } + function testSubnetConversionMessageInvalidInputLength() public { + bytes memory packed = + ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 37, 38) + ); + ValidatorMessages.unpackSubnetConversionMessage(invalidPacked); + } + + function testSubnetConversionMessageInvalidCodecID() public { + bytes memory packed = + ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackSubnetConversionMessage(invalidPacked2); + } + + function testSubnetConversionMessageInvalidTypeID() public { + bytes memory packed = + ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackSubnetConversionMessage(invalidPacked3); + } + + function testPackSubnetConversionDataInvalidBLSKey() public { + // 47 bytes + bytes memory invalidBLSKey = bytes( + hex"3456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" + ); + InitialValidator[] memory initialValidators = new InitialValidator[](1); + initialValidators[0] = InitialValidator({ + nodeID: DEFAULT_NODE_ID, + weight: DEFAULT_WEIGHT, + blsPublicKey: invalidBLSKey + }); + vm.expectRevert(ValidatorMessages.InvalidBLSPublicKey.selector); + ValidatorMessages.packSubnetConversionData( + SubnetConversionData({ + subnetID: DEFAULT_SUBNET_ID, + validatorManagerBlockchainID: DEFAULT_SUBNET_CONVERSION_ID, + validatorManagerAddress: DEFAULT_OWNER, + initialValidators: initialValidators + }) + ); + } + + function testRegisterSubnetValidatorMessageInvalidBLSKey() public { + vm.expectRevert(ValidatorMessages.InvalidBLSPublicKey.selector); + // 47 bytes + bytes memory invalidBLSKey = bytes( + hex"3456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" + ); + ValidatorMessages.packRegisterSubnetValidatorMessage( + ValidatorMessages.ValidationPeriod({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: invalidBLSKey, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT + }) + ); + } + + function testRegisterSubnetValidatorMessageInvalidInputLength() public { + (, bytes memory packed) = ValidatorMessages.packRegisterSubnetValidatorMessage( + ValidatorMessages.ValidationPeriod({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT + }) + ); + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector( + ValidatorMessages.InvalidMessageLength.selector, uint32(193), uint32(194) + ) + ); + ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked2); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x00; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked3); + } + + function testRegisterSubnetValidatorMessageInvalidCodecID() public { + (, bytes memory packed) = ValidatorMessages.packRegisterSubnetValidatorMessage( + ValidatorMessages.ValidationPeriod({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT + }) + ); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked2); + } + + function testRegisterSubnetValidatorMessageInvalidTypeID() public { + (, bytes memory packed) = ValidatorMessages.packRegisterSubnetValidatorMessage( + ValidatorMessages.ValidationPeriod({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT + }) + ); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x00; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked3); + } + + function testSubnetValidatorRegistrationMessageInvalidInputLength() public { + bytes memory packed = + ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 38, 39) + ); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(invalidPacked); + } + + function testSubnetValidatorRegistrationMessageInvalidCodecID() public { + bytes memory packed = + ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(invalidPacked2); + } + + function testSubnetValidatorRegistrationMessageInvalidTypeID() public { + bytes memory packed = + ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(invalidPacked3); + } + + function testValidationUptimeMessageInvalidInputLength() public { + bytes memory packed = + ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 45, 46) + ); + ValidatorMessages.unpackValidationUptimeMessage(invalidPacked); + } + + function testValidationUptimeMessageInvalidCodecID() public { + bytes memory packed = + ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackValidationUptimeMessage(invalidPacked2); + } + + function testValidationUptimeMessageInvalidTypeID() public { + bytes memory packed = + ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackValidationUptimeMessage(invalidPacked3); + } + + function testSetSubnetValidatorWeightMessageInvalidInputLength() public { + bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + + // Invalid length + bytes memory invalidPacked = new bytes(packed.length - 1); + for (uint256 i = 0; i < packed.length - 1; i++) { + invalidPacked[i] = packed[i]; + } + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 53, 54) + ); + ValidatorMessages.unpackSubnetValidatorWeightMessage(invalidPacked); + } + + function testSetSubnetValidatorWeightMessageInvalidCodecID() public { + bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + + // Invalid codec ID + bytes memory invalidPacked2 = packed; + invalidPacked2[1] = 0x01; + vm.expectRevert( + abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) + ); + ValidatorMessages.unpackSubnetValidatorWeightMessage(invalidPacked2); + } + + function testSetSubnetValidatorWeightMessageInvalidTypeID() public { + bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + + // Invalid message type + bytes memory invalidPacked3 = packed; + invalidPacked3[5] = 0x01; + vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); + ValidatorMessages.unpackSubnetValidatorWeightMessage(invalidPacked3); + } + function testRegisterSubnetValidatorMessage() public view { (bytes32 validationID, bytes memory packed) = ValidatorMessages .packRegisterSubnetValidatorMessage( @@ -56,6 +342,31 @@ contract ValidatorMessagesTest is Test { assertEq(recoveredID, validationID); } + function testSubnetConversionMessage() public pure { + bytes memory packed = + ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + bytes32 conversionID = ValidatorMessages.unpackSubnetConversionMessage(packed); + assertEq(conversionID, DEFAULT_SUBNET_CONVERSION_ID); + } + + function testPackSubnetConversionData() public pure { + InitialValidator[] memory initialValidators = new InitialValidator[](1); + initialValidators[0] = InitialValidator({ + nodeID: DEFAULT_NODE_ID, + weight: DEFAULT_WEIGHT, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + bytes memory packed = ValidatorMessages.packSubnetConversionData( + SubnetConversionData({ + subnetID: DEFAULT_SUBNET_ID, + validatorManagerBlockchainID: DEFAULT_SUBNET_CONVERSION_ID, + validatorManagerAddress: DEFAULT_OWNER, + initialValidators: initialValidators + }) + ); + assertEq(packed.length, 186); + } + function testSubnetValidatorRegistrationMessage() public pure { bytes memory packed = ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); @@ -76,17 +387,6 @@ contract ValidatorMessagesTest is Test { assertEq(weight, DEFAULT_WEIGHT); } - function testSubnetValidatorWeightUpdateMessag() public pure { - bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( - DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT - ); - (bytes32 validationID, uint64 nonce, uint64 weight) = - ValidatorMessages.unpackSubnetValidatorWeightMessage(packed); - assertEq(validationID, DEFAULT_VALIDATION_ID); - assertEq(nonce, 100); - assertEq(weight, DEFAULT_WEIGHT); - } - function testValidationUptimeMessage() public pure { bytes memory packed = ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); From 60a610b6cfbc5e626a07762a5480d5246edc0e20 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 18 Oct 2024 08:26:25 -0400 Subject: [PATCH 02/10] WIP --- .../tests/ValidatorMessagesTests.t.sol | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index 1f60a7649..0d6667bad 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -74,28 +74,6 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackSubnetConversionMessage(invalidPacked3); } - function testPackSubnetConversionDataInvalidBLSKey() public { - // 47 bytes - bytes memory invalidBLSKey = bytes( - hex"3456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" - ); - InitialValidator[] memory initialValidators = new InitialValidator[](1); - initialValidators[0] = InitialValidator({ - nodeID: DEFAULT_NODE_ID, - weight: DEFAULT_WEIGHT, - blsPublicKey: invalidBLSKey - }); - vm.expectRevert(ValidatorMessages.InvalidBLSPublicKey.selector); - ValidatorMessages.packSubnetConversionData( - SubnetConversionData({ - subnetID: DEFAULT_SUBNET_ID, - validatorManagerBlockchainID: DEFAULT_SUBNET_CONVERSION_ID, - validatorManagerAddress: DEFAULT_OWNER, - initialValidators: initialValidators - }) - ); - } - function testRegisterSubnetValidatorMessageInvalidBLSKey() public { vm.expectRevert(ValidatorMessages.InvalidBLSPublicKey.selector); // 47 bytes From 037aad3b00c82b752e68e484b90b6d663f384d6f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 10:10:59 -0400 Subject: [PATCH 03/10] Full coverage for native, ERC20, PoA, PoS --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 2 + .../tests/ERC20TokenStakingManagerTests.t.sol | 191 ++---- .../NativeTokenStakingManagerTests.t.sol | 170 ++---- .../tests/PoAValidatorManagerTests.t.sol | 19 +- .../tests/PoSValidatorManagerTests.t.sol | 566 ++++++++++++++---- 8 files changed, 550 insertions(+), 404 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 126411919..8f0696093 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161613f38038061613f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ff28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615210565b6104b3565b005b61021461022436600461524b565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615210565b6106f6565b610214610269366004615262565b610701565b61021461027c3660046152b0565b610c2b565b61029461028f36600461524b565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615210565b610cf9565b6102146102e93660046152d1565b610d04565b6103016102fc366004615311565b610dc5565b60405190815260200161023f565b61021461031d366004615376565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461539e565b611065565b61029461036036600461524b565b61109c565b6103015f81565b61021461037a366004615210565b6110b0565b610231603081565b61021461039536600461524b565b6110db565b6102146103a8366004615376565b6111a6565b6103016103bb3660046153b7565b61137e565b6102146103ce3660046152d1565b6113aa565b6103015f80516020615f4683398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461524b565b611533565b6103015f80516020615f6683398151915281565b61021461044236600461524b565b61171c565b610231601481565b61046261045d36600461524b565b611859565b60405161023f919061544c565b6102946202a30081565b6103015f80516020615f2683398151915281565b61021461049b3660046154e0565b6119a8565b6103016104ae36600461551e565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115610535576105356153d7565b6005811115610546576105466153d7565b815260200160018201805461055a90615589565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615589565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c6153d7565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e3a565b6040518263ffffffff1660e01b81526004016106b091906155cf565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906155e1565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f668339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906155e1565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f460608501604086016155f8565b6001600160a01b0316146108375761081260608401604085016155f8565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615613565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615613565b8363ffffffff1681811061087e5761087e615658565b9050602002810190610890919061566c565b61089990615790565b80516040519192505f9160088801916108b191615809565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da91906004016155cf565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615809565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906155e1565b90508086600801835f01516040516109809190615809565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a026153d7565b021790555060208201516001820190610a1b908261585e565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561592d565b8251604051919550610ad191615809565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615940565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff1683615962565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e89565b60400151611f9f565b90505f610b958761212c565b90505f600282604051610ba89190615809565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906155e1565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612306565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c756153d7565b14610c95578060405163170cc93360e21b81526004016104da91906155c1565b6106f08383612341565b5f805f80516020615f4683398151915260030154610cbd9084615979565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f08383836125bb565b610d0c6127a7565b5f80516020615f468339815191525f80610d25846127de565b91509150610d3282612306565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c6153d7565b03610d91575f83815260088501602052604081208054919055610d8f8282612b1c565b505b610da781610da28460400151611065565b612b92565b505050505b610dc260015f80516020615fa683398151915255565b50565b5f610dce6127a7565b610dda85858585612bc8565b9050610df260015f80516020615fa683398151915255565b949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115610e4757610e476153d7565b6003811115610e5857610e586153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee56153d7565b14610f06578251604051633b0d540d60e21b81526104da9190600401615998565b600481516005811115610f1b57610f1b6153d7565b03610f3157610f2985612da1565b505050505050565b5f80610f48610f3f89611e89565b60400151612f88565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b038416615962565b5f6110a682611859565b6080015192915050565b6110bb8383836125bb565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615f468339815191525f6110f383611859565b519050600481600581111561110a5761110a6153d7565b1461112a578060405163170cc93360e21b81526004016104da91906155c1565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b1c565b6111ae6127a7565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff1660038111156111fb576111fb6153d7565b600381111561120c5761120c6153d7565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611285576112856153d7565b146112a6578051604051633b0d540d60e21b81526104da9190600401615998565b60046112b58260400151611859565b5160058111156112c7576112c76153d7565b14611359575f6112d685611e89565b90505f806112e78360400151612f88565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612da1565b505061137a60015f80516020615fa683398151915255565b5050565b5f6113876127a7565b6113928333846131de565b9050610cf360015f80516020615fa683398151915255565b5f80516020615f668339815191525f806113cf6113c685611e89565b604001516134b6565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f90615589565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff166005811115611459576114596153d7565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068401602052604081206114a49161515f565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115611580576115806153d7565b6003811115611591576115916153d7565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a6153d7565b1415801561162b5750600381516003811115611628576116286153d7565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615998565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611e3a565b6040518263ffffffff1660e01b81526004016116d591906155cf565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171591906155e1565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615f66833981519152919061176390615589565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad6153d7565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161181991906004016159b2565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906155e1565b611861615196565b5f8281525f80516020615fc6833981519152602052604090819020815160e0810190925280545f80516020615f66833981519152929190829060ff1660058111156118ae576118ae6153d7565b60058111156118bf576118bf6153d7565b81526020016001820180546118d390615589565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff90615589565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a8484613672565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615f66833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615a3c565b90815260200160405180910390205491505092915050565b5f8381525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f468339815191529284929091829060ff166003811115611b3057611b306153d7565b6003811115611b4157611b416153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce6153d7565b14611bef578251604051633b0d540d60e21b81526104da9190600401615998565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615a4b565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca06153d7565b03611dce5760028401546080840151611cc2916001600160401b031690615a4b565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d068287612341565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615a6b565b61368c565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d82846137e3565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e339350505050565b600481516005811115611de357611de36153d7565b03611e1757611df1836137e3565b5f898152600786016020526040902055611e0a88612da1565b6001945050505050611e33565b805160405163170cc93360e21b81526104da91906004016155c1565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615a96565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b815115611f5c578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f98576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fd457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202357611feb816001615b68565b611ff6906008615962565b61ffff1684828151811061200c5761200c615658565b016020015160f81c901b9190911790600101611fd7565b5061ffff81161561204d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120a857612064816003615b68565b61206f906008615962565b63ffffffff168561208183600261592d565b8151811061209157612091615658565b016020015160f81c901b9190911790600101612050565b5063ffffffff8116156120ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612123576120e581601f615b68565b6120f0906008615962565b866120fc83600661592d565b8151811061210c5761210c615658565b016020015160f81c901b91909117906001016120d1565b50949350505050565b60605f80833560208501356014612148878701604089016155f8565b6121556060890189615613565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121db6060850185615613565b9050811015611f9857816121f26060860186615613565b8381811061220257612202615658565b9050602002810190612214919061566c565b61221e9080615b7b565b905061222d6060870187615613565b8481811061223d5761223d615658565b905060200281019061224f919061566c565b6122599080615b7b565b6122666060890189615613565b8681811061227657612276615658565b9050602002810190612288919061566c565b612296906020810190615b7b565b6122a360608b018b615613565b888181106122b3576122b3615658565b90506020028101906122c5919061566c565b6122d690606081019060400161539e565b6040516020016122ec9796959493929190615bbd565b60408051601f1981840301815291905291506001016121ce565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561238c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123b39190810190615a96565b91509150806123d557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243c91906155e1565b825114612462578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561249e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806124ad8460400151613980565b915091508187146124d45760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615f46833981519152906001600160401b039081169083161115612591575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125b0565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615f46833981519152816125d486613b71565b90506125df86612306565b6125ee57600192505050611e33565b5f8681526005830160205260409020546001600160a01b03163314612613573361114b565b5f86815260058301602052604090205460a082015161264291600160b01b90046001600160401b031690615a4b565b6001600160401b03168160c001516001600160401b031610156126895760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126a15761269a8786612341565b90506126bf565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126e490611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561274d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061277191906155e1565b905080846008015f8a81526020019081526020015f205f828254612795919061592d565b90915550501515979650505050505050565b5f80516020615fa68339815191528054600119016127d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e7615196565b5f80516020615f668339815191525f806128036113c687611e89565b91509150801561282a57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285b5761285b6153d7565b600581111561286c5761286c6153d7565b815260200160018201805461288090615589565b80601f01602080910402602001604051908101604052809291908181526020018280546128ac90615589565b80156128f75780601f106128ce576101008083540402835291602001916128f7565b820191905f5260205f20905b8154815290600101906020018083116128da57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612962576129626153d7565b141580156129835750600181516005811115612980576129806153d7565b14155b156129a457805160405163170cc93360e21b81526104da91906004016155c1565b6003815160058111156129b9576129b96153d7565b036129c757600481526129cc565b600581525b8360080181602001516040516129e29190615809565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2657612a266153d7565b021790555060208201516001820190612a3f908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae557612ae56153d7565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f2683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b77575f80fd5b505af1158015612b89573d5f803e3d5ffd5b50505050505050565b5f80516020615f268339815191525461137a906001600160a01b03168383613e55565b60015f80516020615fa683398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615f4683398151915290600160401b900461ffff9081169086161080612c1c575061271061ffff8616115b15612c4057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c7c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c8e5750806001015483115b15612caf5760405163222d164360e21b8152600481018490526024016104da565b5f612cb984613eb4565b90505f612cc582610c9f565b90505f612cd28983613ed7565b90506040518060800160405280612ce63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115612dee57612dee6153d7565b6003811115612dff57612dff6153d7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f2d575f84815260058701602052604090205461271090612edf90600160a01b900461ffff1685615962565b612ee99190615979565b915081866008015f8681526020019081526020015f205f828254612f0d919061592d565b90915550612f1d90508284615b68565b9050612f2d856020015182612b1c565b612f428560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612fbf57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561300e57612fd6816001615b68565b612fe1906008615962565b61ffff16868281518110612ff757612ff7615658565b016020015160f81c901b9190911790600101612fc2565b5061ffff8116156130385760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156130935761304f816003615b68565b61305a906008615962565b63ffffffff168761306c83600261592d565b8151811061307c5761307c615658565b016020015160f81c901b919091179060010161303b565b5063ffffffff81166003146130bb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613110576130d281601f615b68565b6130dd906008615962565b886130e983600661592d565b815181106130f9576130f9615658565b016020015160f81c901b91909117906001016130be565b505f805b600881101561316f57613128816007615b68565b613133906008615962565b6001600160401b03168961314883602661592d565b8151811061315857613158615658565b016020015160f81c901b9190911790600101613114565b505f805b60088110156131ce57613187816007615b68565b613192906008615962565b6001600160401b03168a6131a783602e61592d565b815181106131b7576131b7615658565b016020015160f81c901b9190911790600101613173565b5091989097509095509350505050565b5f5f80516020615f46833981519152816131fa61028f85613eb4565b90505f61320687611859565b905061321187612306565b613231576040516330efa98b60e01b8152600481018890526024016104da565b600281516005811115613246576132466153d7565b1461326757805160405163170cc93360e21b81526104da91906004016155c1565b5f8282608001516132789190615a4b565b905083600201600a9054906101000a90046001600160401b031682604001516132a19190615c26565b6001600160401b0316816001600160401b031611156132de57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132ea8a8461368c565b915091505f8a8360405160200161331892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156133ab576133ab6153d7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146134ec57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b600281101561353b57613503816001615b68565b61350e906008615962565b61ffff1685828151811061352457613524615658565b016020015160f81c901b91909117906001016134ef565b5061ffff8116156135655760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156135c05761357c816003615b68565b613587906008615962565b63ffffffff168661359983600261592d565b815181106135a9576135a9615658565b016020015160f81c901b9190911790600101613568565b5063ffffffff81166002146135e857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561363d576135ff81601f615b68565b61360a906008615962565b8761361683600661592d565b8151811061362657613626615658565b016020015160f81c901b91909117906001016135eb565b505f8660268151811061365257613652615658565b016020015191976001600160f81b03199092161515965090945050505050565b61367a61444f565b6136838261449a565b61137a8161450e565b5f8281525f80516020615fc6833981519152602052604081206002015481905f80516020615f6683398151915290600160801b90046001600160401b03166136d48582614576565b5f6136de87614799565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61372e8a858b611e3a565b6040518263ffffffff1660e01b815260040161374a91906155cf565b6020604051808303815f875af1158015613766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061378a91906155e1565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615f4683398151915290505f6138038460400151611859565b90505f60038251600581111561381b5761381b6153d7565b14806138395750600482516005811115613837576138376153d7565b145b15613849575060c0810151613886565b60028251600581111561385e5761385e6153d7565b0361386a575042613886565b815160405163170cc93360e21b81526104da91906004016155c1565b84608001516001600160401b0316816001600160401b0316116138ad57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138d290611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613953573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397791906155e1565b95945050505050565b5f808251602e146139b657825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a05576139cd816001615b68565b6139d8906008615962565b61ffff168582815181106139ee576139ee615658565b016020015160f81c901b91909117906001016139b9565b5061ffff811615613a2f5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a8a57613a46816003615b68565b613a51906008615962565b63ffffffff1686613a6383600261592d565b81518110613a7357613a73615658565b016020015160f81c901b9190911790600101613a32565b5063ffffffff811615613ab057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b0557613ac781601f615b68565b613ad2906008615962565b87613ade83600661592d565b81518110613aee57613aee615658565b016020015160f81c901b9190911790600101613ab3565b505f805b6008811015613b6457613b1d816007615b68565b613b28906008615962565b6001600160401b031688613b3d83602661592d565b81518110613b4d57613b4d615658565b016020015160f81c901b9190911790600101613b09565b5090969095509350505050565b613b79615196565b5f8281525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115613bc657613bc66153d7565b6005811115613bd757613bd76153d7565b8152602001600182018054613beb90615589565b80601f0160208091040260200160405190810160405280929190818152602001828054613c1790615589565b8015613c625780601f10613c3957610100808354040283529160200191613c62565b820191905f5260205f20905b815481529060010190602001808311613c4557829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613cd057613cd06153d7565b14613d03575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d4757613d476153d7565b021790555060208201516001820190613d60908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613dfe858261368c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061480e565b5f610cf3825f80516020615f26833981519152546001600160a01b03169061486f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f1b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615f6683398151915242613f3a606086016040870161539e565b6001600160401b0316111580613f745750613f586202a3004261592d565b613f68606086016040870161539e565b6001600160401b031610155b15613fae57613f89606085016040860161539e565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613fc3613fbe6060860186615c51565b6149c8565b613fd3613fbe6080860186615c51565b6030613fe26020860186615b7b565b90501461401457613ff66020850185615b7b565b6040516326475b2f60e11b81526104da925060040190815260200190565b61401e8480615b7b565b90505f0361404b576140308480615b7b565b604051633e08a12560e11b81526004016104da929190615c65565b5f6008820161405a8680615b7b565b604051614068929190615a3c565b908152602001604051809103902054146140a1576140868480615b7b565b60405163a41f772f60e01b81526004016104da929190615c65565b6140ab835f614576565b6040805160e08101909152815481525f9081906141b790602081016140d08980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614118908a018a615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161416160608a0160408b0161539e565b6001600160401b0316815260200161417c60608a018a615c51565b61418590615c93565b815260200161419760808a018a615c51565b6141a090615c93565b8152602001876001600160401b0316815250614b31565b5f828152600686016020526040902091935091506141d5828261585e565b5081600884016141e58880615b7b565b6040516141f3929190615a3c565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061422f9085906004016155cf565b6020604051808303815f875af115801561424b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426f91906155e1565b6040805160e08101909152909150806001815260200161428f8980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561431e5761431e6153d7565b021790555060208201516001820190614337908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143d58880615b7b565b6040516143e3929190615a3c565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614421919061539e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661449857604051631afcd79f60e31b815260040160405180910390fd5b565b6144a261444f565b6144ab81614d1e565b6144b3614d37565b610dc2606082013560808301356144d060c0850160a0860161539e565b6144e060e0860160c08701615d5a565b6144f1610100870160e08801615d73565b61010087013561450961014089016101208a016155f8565b614d47565b61451661444f565b5f80516020615f268339815191526001600160a01b03821661455657604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615f668339815191525f6001600160401b0380841690851611156145aa576145a38385615a6b565b90506145b7565b6145b48484615a6b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614619575060018401548151614615916001600160401b03169061592d565b8210155b1561463f576001600160401b03831660608201528181526040810151602082015261465e565b82816060018181516146519190615a4b565b6001600160401b03169052505b606081015161466e906064615c26565b602082015160018601546001600160401b0392909216916146999190600160401b900460ff16615962565b10156146c957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146e4919061592d565b9052506040810180516001600160401b0387169190614704908390615b68565b9052506001840154604082015160649161472991600160401b90910460ff1690615962565b1015614750578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615fc68339815191526020526040812060020180545f80516020615f6683398151915291906008906147e390600160401b90046001600160401b0316615d93565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148226001600160a01b03841683614f03565b905080515f141580156148465750808060200190518101906148449190615dae565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148d991906155e1565b90506148f06001600160a01b038516333086614f10565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614934573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495891906155e1565b90508181116149be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139778282615b68565b6149d560208201826152d1565b63ffffffff161580156149f557506149f06020820182615613565b151590505b15614a3c57614a0760208201826152d1565b614a146020830183615613565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614a496020820182615613565b9050614a5860208301836152d1565b63ffffffff161115614a7157614a0760208201826152d1565b60015b614a816020830183615613565b905081101561137a57614a976020830183615613565b614aa2600184615b68565b818110614ab157614ab1615658565b9050602002016020810190614ac691906155f8565b6001600160a01b0316614adc6020840184615613565b83818110614aec57614aec615658565b9050602002016020810190614b0191906155f8565b6001600160a01b03161015614b2957604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a74565b5f6060826040015151603014614b5a5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b9b988a986001989297929690959094909390929101615dc9565b60405160208183030381529060405290505f5b84608001516020015151811015614c0d57818560800151602001518281518110614bda57614bda615658565b6020026020010151604051602001614bf3929190615e83565b60408051601f198184030181529190529150600101614bae565b5060a0840151805160209182015151604051614c2d938593929101615eb9565b60405160208183030381529060405290505f5b8460a001516020015151811015614c9f57818560a00151602001518281518110614c6c57614c6c615658565b6020026020010151604051602001614c85929190615e83565b60408051601f198184030181529190529150600101614c40565b5060c0840151604051614cb6918391602001615ef4565b6040516020818303038152906040529050600281604051614cd79190615809565b602060405180830381855afa158015614cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d1591906155e1565b94909350915050565b614d2661444f565b614d2e614f49565b610dc281614f51565b614d3f61444f565b614498615039565b614d4f61444f565b5f80516020615f4683398151915261ffff85161580614d73575061271061ffff8616115b15614d9757604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614dbb5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614dce5750600a60ff8516115b15614df15760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614e58576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614e785760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3383835f615041565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e82565b61449861444f565b614f5961444f565b80355f80516020615f668339815191529081556014614f7e6060840160408501615d73565b60ff161180614f9d5750614f986060830160408401615d73565b60ff16155b15614fd157614fb26060830160408401615d73565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614fe16060830160408401615d73565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615012604083016020840161539e565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bb561444f565b6060814710156150665760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150819190615809565b5f6040518083038185875af1925050503d805f81146150bb576040519150601f19603f3d011682016040523d82523d5f602084013e6150c0565b606091505b50915091506150d08683836150da565b9695505050505050565b6060826150ef576150ea82615136565b611e33565b815115801561510657506001600160a01b0384163b155b1561512f57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e33565b8051156151465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461516b90615589565b5f825580601f1061517a575050565b601f0160209004905f5260205f2090810190610dc291906151d3565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156151e7575f81556001016151d4565b5090565b8015158114610dc2575f80fd5b803563ffffffff8116811461520b575f80fd5b919050565b5f805f60608486031215615222575f80fd5b833592506020840135615234816151eb565b9150615242604085016151f8565b90509250925092565b5f6020828403121561525b575f80fd5b5035919050565b5f8060408385031215615273575f80fd5b82356001600160401b03811115615288575f80fd5b830160808186031215615299575f80fd5b91506152a7602084016151f8565b90509250929050565b5f80604083850312156152c1575f80fd5b823591506152a7602084016151f8565b5f602082840312156152e1575f80fd5b611e33826151f8565b803561ffff8116811461520b575f80fd5b80356001600160401b038116811461520b575f80fd5b5f805f8060808587031215615324575f80fd5b84356001600160401b03811115615339575f80fd5b850160a0818803121561534a575f80fd5b9350615358602086016152ea565b9250615366604086016152fb565b9396929550929360600135925050565b5f8060408385031215615387575f80fd5b615390836151f8565b946020939093013593505050565b5f602082840312156153ae575f80fd5b611e33826152fb565b5f80604083850312156153c8575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106153fb576153fb6153d7565b9052565b5f5b83811015615419578181015183820152602001615401565b50505f910152565b5f81518084526154388160208601602086016153ff565b601f01601f19169290920160200192915050565b6020815261545e6020820183516153eb565b5f602083015160e06040840152615479610100840182615421565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f808284036101608112156154f3575f80fd5b61014080821215615502575f80fd5b8493508301359050615513816154cc565b809150509250929050565b5f806020838503121561552f575f80fd5b82356001600160401b0380821115615545575f80fd5b818501915085601f830112615558575f80fd5b813581811115615566575f80fd5b866020828501011115615577575f80fd5b60209290920196919550909350505050565b600181811c9082168061559d57607f821691505b6020821081036155bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf382846153eb565b602081525f611e336020830184615421565b5f602082840312156155f1575f80fd5b5051919050565b5f60208284031215615608575f80fd5b8135611e33816154cc565b5f808335601e19843603018112615628575f80fd5b8301803591506001600160401b03821115615641575f80fd5b6020019150600581901b36038213156137dc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615680575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156156c0576156c061568a565b60405290565b604080519081016001600160401b03811182821017156156c0576156c061568a565b604051601f8201601f191681016001600160401b03811182821017156157105761571061568a565b604052919050565b5f6001600160401b038211156157305761573061568a565b50601f01601f191660200190565b5f82601f83011261574d575f80fd5b813561576061575b82615718565b6156e8565b818152846020838601011115615774575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156157a0575f80fd5b6157a861569e565b82356001600160401b03808211156157be575f80fd5b6157ca3683870161573e565b835260208501359150808211156157df575f80fd5b506157ec3682860161573e565b6020830152506157fe604084016152fb565b604082015292915050565b5f82516156808184602087016153ff565b601f8211156104e357805f5260205f20601f840160051c8101602085101561583f5750805b601f840160051c820191505b81811015611715575f815560010161584b565b81516001600160401b038111156158775761587761568a565b61588b816158858454615589565b8461581a565b602080601f8311600181146158be575f84156158a75750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156158ec578886015182559484019460019091019084016158cd565b508582101561590957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615919565b5f63ffffffff80831681810361595857615958615919565b6001019392505050565b8082028115828204841417610cf357610cf3615919565b5f8261599357634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106159ac576159ac6153d7565b91905290565b5f60208083525f84546159c481615589565b806020870152604060018084165f81146159e55760018114615a0157615a2e565b60ff19851660408a0152604084151560051b8a01019550615a2e565b895f5260205f205f5b85811015615a255781548b8201860152908301908801615a0a565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f9857611f98615919565b6001600160401b03828116828216039080821115611f9857611f98615919565b805161520b816151eb565b5f8060408385031215615aa7575f80fd5b82516001600160401b0380821115615abd575f80fd5b9084019060608287031215615ad0575f80fd5b615ad861569e565b82518152602080840151615aeb816154cc565b82820152604084015183811115615b00575f80fd5b80850194505087601f850112615b14575f80fd5b83519250615b2461575b84615718565b8381528882858701011115615b37575f80fd5b615b46848383018488016153ff565b80604084015250819550615b5b818801615a8b565b9450505050509250929050565b81810381811115610cf357610cf3615919565b5f808335601e19843603018112615b90575f80fd5b8301803591506001600160401b03821115615ba9575f80fd5b6020019150368190038213156137dc575f80fd5b5f8851615bce818460208d016153ff565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615c4957615c49615919565b505092915050565b5f8235603e19833603018112615680575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ca3575f80fd5b615cab6156c6565b615cb4836151f8565b81526020808401356001600160401b0380821115615cd0575f80fd5b9085019036601f830112615ce2575f80fd5b813581811115615cf457615cf461568a565b8060051b9150615d058483016156e8565b8181529183018401918481019036841115615d1e575f80fd5b938501935b83851015615d485784359250615d38836154cc565b8282529385019390850190615d23565b94860194909452509295945050505050565b5f60208284031215615d6a575f80fd5b611e33826152ea565b5f60208284031215615d83575f80fd5b813560ff81168114611e33575f80fd5b5f6001600160401b0380831681810361595857615958615919565b5f60208284031215615dbe575f80fd5b8151611e33816151eb565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e0f81602a850160208b016153ff565b865190830190615e2681602a840160208b016153ff565b60c087901b6001600160c01b031916602a9290910191820152615e58603282018660e01b6001600160e01b0319169052565b615e71603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615e948184602088016153ff565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615eca8184602089016153ff565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f058184602088016153ff565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516161ca3803806161ca83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61607d8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615179565b6104b3565b005b6102146102243660046151b4565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615179565b6106f6565b6102146102693660046151cb565b610701565b61021461027c366004615219565b610c33565b61029461028f3660046151b4565b610ca7565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615179565b610d01565b6102146102e936600461523a565b610d0c565b6103016102fc36600461527a565b610dcd565b60405190815260200161023f565b61021461031d3660046152df565b610e02565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d366004615307565b61106d565b6102946103603660046151b4565b6110a4565b6103015f81565b61021461037a366004615179565b6110b8565b610231603081565b6102146103953660046151b4565b6110e3565b6102146103a83660046152df565b6111ae565b6103016103bb366004615320565b611386565b6102146103ce36600461523a565b6113b2565b6103015f80516020615fd183398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046151b4565b61153b565b6103015f80516020615ff183398151915281565b6102146104423660046151b4565b611724565b610231601481565b61046261045d3660046151b4565b611861565b60405161023f91906153b5565b6102946202a30081565b6103015f80516020615fb183398151915281565b61021461049b366004615449565b6119b0565b6103016104ae366004615487565b611a8f565b6104be838383611aea565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160518339815191526020526040808220815160e0810190925280545f80516020615ff183398151915293929190829060ff16600581111561053557610535615340565b600581111561054657610546615340565b815260200160018201805461055a906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906154f2565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615340565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e42565b6040518263ffffffff1660e01b81526004016106b09190615538565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061554a565b50505050565b6106f0838383611aea565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ff18339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba919061554a565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615561565b6001600160a01b031614610837576108126060840160408501615561565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561557c565b905090505f805b828163ffffffff161015610b2d575f610868606088018861557c565b8363ffffffff1681811061087e5761087e6155c1565b905060200281019061089091906155d5565b61089990615796565b80516040519192505f9160088801916108b1916157a1565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da9190600401615538565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a916157a1565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610968919061554a565b90508086600801835f015160405161098091906157a1565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615340565b021790555060208201516001820190610a1b90826157f6565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac09116856158c5565b8251604051919550610ad1916157a1565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906158d8565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836158fa565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e91565b60400151611fa7565b90505f610b9d610b9888615933565b612134565b90505f600282604051610bb091906157a1565b602060405180830381855afa158015610bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610bee919061554a565b9050828114610c1a57604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3c8261226f565b610c5c576040516330efa98b60e01b8152600481018390526024016104da565b5f610c6683611861565b5190506002816005811115610c7d57610c7d615340565b14610c9d578060405163170cc93360e21b81526004016104da919061552a565b6106f083836122aa565b5f805f80516020615fd183398151915260030154610cc59084615a0b565b9050801580610cda57506001600160401b0381115b15610cfb5760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612524565b610d14612710565b5f80516020615fd18339815191525f80610d2d84612747565b91509150610d3a8261226f565b610d4657505050610db4565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d7457610d74615340565b03610d99575f83815260088501602052604081208054919055610d978282612a85565b505b610daf81610daa846040015161106d565b612afb565b505050505b610dca60015f8051602061603183398151915255565b50565b5f610dd6612710565b610de285858585612b31565b9050610dfa60015f8051602061603183398151915255565b949350505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff166003811115610e4f57610e4f615340565b6003811115610e6057610e60615340565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ed682611861565b9050600183516003811115610eed57610eed615340565b14610f0e578251604051633b0d540d60e21b81526104da9190600401615a2a565b600481516005811115610f2357610f23615340565b03610f3957610f3185612d0a565b505050505050565b5f80610f50610f4789611e91565b60400151612ef1565b5091509150818414610f7d57846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fb65750806001600160401b03168560a001516001600160401b0316115b15610fdf57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cfb906001600160401b0384166158fa565b5f6110ae82611861565b6080015192915050565b6110c3838383612524565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615fd18339815191525f6110fb83611861565b519050600481600581111561111257611112615340565b14611132578060405163170cc93360e21b81526004016104da919061552a565b5f8381526005830160205260409020546001600160a01b0316331461117857335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612a85565b6111b6612710565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff16600381111561120357611203615340565b600381111561121457611214615340565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128d5761128d615340565b146112ae578051604051633b0d540d60e21b81526104da9190600401615a2a565b60046112bd8260400151611861565b5160058111156112cf576112cf615340565b14611361575f6112de85611e91565b90505f806112ef8360400151612ef1565b50915091508184604001511461131b5760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135d57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136a83612d0a565b505061138260015f8051602061603183398151915255565b5050565b5f61138f612710565b61139a833384613147565b9050610cfb60015f8051602061603183398151915255565b5f80516020615ff18339815191525f806113d76113ce85611e91565b6040015161341f565b91509150806113fd57604051632d07135360e01b815281151560048201526024016104da565b5f82815260068401602052604090208054611417906154f2565b90505f0361143b5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561146157611461615340565b14611494575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b5f82815260068401602052604081206114ac916150c8565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff16600381111561158857611588615340565b600381111561159957611599615340565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561161257611612615340565b14158015611633575060038151600381111561163057611630615340565b14155b15611654578051604051633b0d540d60e21b81526104da9190600401615a2a565b5f6116628260400151611861565b905080606001516001600160401b03165f03611694576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116c1846040015184606001518560800151611e42565b6040518263ffffffff1660e01b81526004016116dd9190615538565b6020604051808303815f875af11580156116f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171d919061554a565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ff1833981519152919061176b906154f2565b90505f0361178f5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117b5576117b5615340565b146117e8575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118219190600401615a44565b6020604051808303815f875af115801561183d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e3919061554a565b6118696150ff565b5f8281525f80516020616051833981519152602052604090819020815160e0810190925280545f80516020615ff1833981519152929190829060ff1660058111156118b6576118b6615340565b60058111156118c7576118c7615340565b81526020016001820180546118db906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611907906154f2565b80156119525780601f1061192957610100808354040283529160200191611952565b820191905f5260205f20905b81548152906001019060200180831161193557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f9575080546001600160401b03808416911610155b15611a175760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a4284846135db565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615ff1833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611ad29086908690615ace565b90815260200160405180910390205491505092915050565b5f8381525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd18339815191529284929091829060ff166003811115611b3857611b38615340565b6003811115611b4957611b49615340565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bbf82611861565b9050600283516003811115611bd657611bd6615340565b14611bf7578251604051633b0d540d60e21b81526104da9190600401615a2a565b60208301516001600160a01b03163314611c93575f8281526005850160205260409020546001600160a01b03163314611c305733611153565b5f82815260058501602052604090205460a0820151611c5f91600160b01b90046001600160401b031690615add565b6001600160401b0316421015611c935760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca857611ca8615340565b03611dd65760028401546080840151611cca916001600160401b031690615add565b6001600160401b0316421015611cfe5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d1057611d0e82876122aa565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d49918491611d449190615afd565b6135f5565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d8a8461374c565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e3b9350505050565b600481516005811115611deb57611deb615340565b03611e1f57611df98361374c565b5f898152600786016020526040902055611e1288612d0a565b6001945050505050611e3b565b805160405163170cc93360e21b81526104da919060040161552a565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ef5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1c9190810190615b28565b9150915080611f3e57604051636b2f19e960e01b815260040160405180910390fd5b815115611f64578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611fa0576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fdc57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202b57611ff3816001615bfa565b611ffe9060086158fa565b61ffff16848281518110612014576120146155c1565b016020015160f81c901b9190911790600101611fdf565b5061ffff8116156120555760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120b05761206c816003615bfa565b6120779060086158fa565b63ffffffff16856120898360026158c5565b81518110612099576120996155c1565b016020015160f81c901b9190911790600101612058565b5063ffffffff8116156120d657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561212b576120ed81601f615bfa565b6120f89060086158fa565b866121048360066158c5565b81518110612114576121146155c1565b016020015160f81c901b91909117906001016120d9565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015611fa05781846060015182815181106121d0576121d06155c1565b60200260200101515f015151856060015183815181106121f2576121f26155c1565b60200260200101515f015186606001518481518110612213576122136155c1565b60200260200101516020015187606001518581518110612235576122356155c1565b602002602001015160400151604051602001612255959493929190615c0d565b60408051601f1981840301815291905291506001016121ac565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261231c9190810190615b28565b915091508061233e57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612381573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a5919061554a565b8251146123cb578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612407576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061241684604001516138e9565b9150915081871461243d5760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615fd1833981519152906001600160401b0390811690831611156124fa575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612519565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615fd18339815191528161253d86613ada565b90506125488661226f565b61255757600192505050611e3b565b5f8681526005830160205260409020546001600160a01b0316331461257c5733611153565b5f86815260058301602052604090205460a08201516125ab91600160b01b90046001600160401b031690615add565b6001600160401b03168160c001516001600160401b031610156125f25760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f851561260a5761260387866122aa565b9050612628565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061264d9061106d565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126da919061554a565b905080846008015f8a81526020019081526020015f205f8282546126fe91906158c5565b90915550501515979650505050505050565b5f8051602061603183398151915280546001190161274157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127506150ff565b5f80516020615ff18339815191525f8061276c6113ce87611e91565b91509150801561279357604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127c4576127c4615340565b60058111156127d5576127d5615340565b81526020016001820180546127e9906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054612815906154f2565b80156128605780601f1061283757610100808354040283529160200191612860565b820191905f5260205f20905b81548152906001019060200180831161284357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128cb576128cb615340565b141580156128ec57506001815160058111156128e9576128e9615340565b14155b1561290d57805160405163170cc93360e21b81526104da919060040161552a565b60038151600581111561292257612922615340565b036129305760048152612935565b600581525b83600801816020015160405161294b91906157a1565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561298f5761298f615340565b0217905550602082015160018201906129a890826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a4e57612a4e615340565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615fb183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ae0575f80fd5b505af1158015612af2573d5f803e3d5ffd5b50505050505050565b5f80516020615fb183398151915254611382906001600160a01b03168383613dbe565b60015f8051602061603183398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615fd183398151915290600160401b900461ffff9081169086161080612b85575061271061ffff8616115b15612ba957604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612be5576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612bf75750806001015483115b15612c185760405163222d164360e21b8152600481018490526024016104da565b5f612c2284613e1d565b90505f612c2e82610ca7565b90505f612c3b8983613e40565b90506040518060800160405280612c4f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff166003811115612d5757612d57615340565b6003811115612d6857612d68615340565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e96575f84815260058701602052604090205461271090612e4890600160a01b900461ffff16856158fa565b612e529190615a0b565b915081866008015f8681526020019081526020015f205f828254612e7691906158c5565b90915550612e8690508284615bfa565b9050612e96856020015182612a85565b612eab8560200151610daa876060015161106d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f2857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612f7757612f3f816001615bfa565b612f4a9060086158fa565b61ffff16868281518110612f6057612f606155c1565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612fa15760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015612ffc57612fb8816003615bfa565b612fc39060086158fa565b63ffffffff1687612fd58360026158c5565b81518110612fe557612fe56155c1565b016020015160f81c901b9190911790600101612fa4565b5063ffffffff811660031461302457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130795761303b81601f615bfa565b6130469060086158fa565b886130528360066158c5565b81518110613062576130626155c1565b016020015160f81c901b9190911790600101613027565b505f805b60088110156130d857613091816007615bfa565b61309c9060086158fa565b6001600160401b0316896130b18360266158c5565b815181106130c1576130c16155c1565b016020015160f81c901b919091179060010161307d565b505f805b6008811015613137576130f0816007615bfa565b6130fb9060086158fa565b6001600160401b03168a61311083602e6158c5565b81518110613120576131206155c1565b016020015160f81c901b91909117906001016130dc565b5091989097509095509350505050565b5f5f80516020615fd18339815191528161316361028f85613e1d565b90505f61316f87611861565b905061317a8761226f565b61319a576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131af576131af615340565b146131d057805160405163170cc93360e21b81526104da919060040161552a565b5f8282608001516131e19190615add565b905083600201600a9054906101000a90046001600160401b0316826040015161320a9190615c86565b6001600160401b0316816001600160401b0316111561324757604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132538a846135f5565b915091505f8a8360405160200161328192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561331457613314615340565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461345557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134a45761346c816001615bfa565b6134779060086158fa565b61ffff1685828151811061348d5761348d6155c1565b016020015160f81c901b9190911790600101613458565b5061ffff8116156134ce5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613529576134e5816003615bfa565b6134f09060086158fa565b63ffffffff16866135028360026158c5565b81518110613512576135126155c1565b016020015160f81c901b91909117906001016134d1565b5063ffffffff811660021461355157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a65761356881601f615bfa565b6135739060086158fa565b8761357f8360066158c5565b8151811061358f5761358f6155c1565b016020015160f81c901b9190911790600101613554565b505f866026815181106135bb576135bb6155c1565b016020015191976001600160f81b03199092161515965090945050505050565b6135e36143b8565b6135ec82614403565b61138281614477565b5f8281525f80516020616051833981519152602052604081206002015481905f80516020615ff183398151915290600160801b90046001600160401b031661363d85826144df565b5f61364787614702565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136978a858b611e42565b6040518263ffffffff1660e01b81526004016136b39190615538565b6020604051808303815f875af11580156136cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136f3919061554a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615fd183398151915290505f61376c8460400151611861565b90505f60038251600581111561378457613784615340565b14806137a257506004825160058111156137a0576137a0615340565b145b156137b2575060c08101516137ef565b6002825160058111156137c7576137c7615340565b036137d35750426137ef565b815160405163170cc93360e21b81526104da919060040161552a565b84608001516001600160401b0316816001600160401b03161161381657505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061383b9061106d565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156138bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138e0919061554a565b95945050505050565b5f808251602e1461391f57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b600281101561396e57613936816001615bfa565b6139419060086158fa565b61ffff16858281518110613957576139576155c1565b016020015160f81c901b9190911790600101613922565b5061ffff8116156139985760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156139f3576139af816003615bfa565b6139ba9060086158fa565b63ffffffff16866139cc8360026158c5565b815181106139dc576139dc6155c1565b016020015160f81c901b919091179060010161399b565b5063ffffffff811615613a1957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a6e57613a3081601f615bfa565b613a3b9060086158fa565b87613a478360066158c5565b81518110613a5757613a576155c1565b016020015160f81c901b9190911790600101613a1c565b505f805b6008811015613acd57613a86816007615bfa565b613a919060086158fa565b6001600160401b031688613aa68360266158c5565b81518110613ab657613ab66155c1565b016020015160f81c901b9190911790600101613a72565b5090969095509350505050565b613ae26150ff565b5f8281525f805160206160518339815191526020526040808220815160e0810190925280545f80516020615ff183398151915293929190829060ff166005811115613b2f57613b2f615340565b6005811115613b4057613b40615340565b8152602001600182018054613b54906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054613b80906154f2565b8015613bcb5780601f10613ba257610100808354040283529160200191613bcb565b820191905f5260205f20905b815481529060010190602001808311613bae57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c3957613c39615340565b14613c6c575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cb057613cb0615340565b021790555060208201516001820190613cc990826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d6785826135f5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614777565b5f610cfb825f80516020615fb1833981519152546001600160a01b0316906147d8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e8457604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ff183398151915242613ea36060860160408701615307565b6001600160401b0316111580613edd5750613ec16202a300426158c5565b613ed16060860160408701615307565b6001600160401b031610155b15613f1757613ef26060850160408601615307565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f2c613f276060860186615cb1565b614931565b613f3c613f276080860186615cb1565b6030613f4b6020860186615cc5565b905014613f7d57613f5f6020850185615cc5565b6040516326475b2f60e11b81526104da925060040190815260200190565b613f878480615cc5565b90505f03613fb457613f998480615cc5565b604051633e08a12560e11b81526004016104da929190615d07565b5f60088201613fc38680615cc5565b604051613fd1929190615ace565b9081526020016040518091039020541461400a57613fef8480615cc5565b60405163a41f772f60e01b81526004016104da929190615d07565b614014835f6144df565b6040805160e08101909152815481525f90819061412090602081016140398980615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614081908a018a615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140ca60608a0160408b01615307565b6001600160401b031681526020016140e560608a018a615cb1565b6140ee90615d35565b815260200161410060808a018a615cb1565b61410990615d35565b8152602001876001600160401b0316815250614a9a565b5f8281526006860160205260409020919350915061413e82826157f6565b50816008840161414e8880615cc5565b60405161415c929190615ace565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614198908590600401615538565b6020604051808303815f875af11580156141b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d8919061554a565b6040805160e0810190915290915080600181526020016141f88980615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561428757614287615340565b0217905550602082015160018201906142a090826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061433e8880615cc5565b60405161434c929190615ace565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061438a9190615307565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661440157604051631afcd79f60e31b815260040160405180910390fd5b565b61440b6143b8565b61441481614c87565b61441c614ca0565b610dca6060820135608083013561443960c0850160a08601615307565b61444960e0860160c08701615de5565b61445a610100870160e08801615dfe565b61010087013561447261014089016101208a01615561565b614cb0565b61447f6143b8565b5f80516020615fb18339815191526001600160a01b0382166144bf57604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615ff18339815191525f6001600160401b0380841690851611156145135761450c8385615afd565b9050614520565b61451d8484615afd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061458257506001840154815161457e916001600160401b0316906158c5565b8210155b156145a8576001600160401b0383166060820152818152604081015160208201526145c7565b82816060018181516145ba9190615add565b6001600160401b03169052505b60608101516145d7906064615c86565b602082015160018601546001600160401b0392909216916146029190600160401b900460ff166158fa565b101561463257606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b03168160400181815161464d91906158c5565b9052506040810180516001600160401b038716919061466d908390615bfa565b9052506001840154604082015160649161469291600160401b90910460ff16906158fa565b10156146b9578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160518339815191526020526040812060020180545f80516020615ff1833981519152919060089061474c90600160401b90046001600160401b0316615e1e565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61478b6001600160a01b03841683614e6c565b905080515f141580156147af5750808060200190518101906147ad9190615e39565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614842919061554a565b90506148596001600160a01b038516333086614e79565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c1919061554a565b90508181116149275760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6138e08282615bfa565b61493e602082018261523a565b63ffffffff1615801561495e5750614959602082018261557c565b151590505b156149a557614970602082018261523a565b61497d602083018361557c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149b2602082018261557c565b90506149c1602083018361523a565b63ffffffff1611156149da57614970602082018261523a565b60015b6149ea602083018361557c565b905081101561138257614a00602083018361557c565b614a0b600184615bfa565b818110614a1a57614a1a6155c1565b9050602002016020810190614a2f9190615561565b6001600160a01b0316614a45602084018461557c565b83818110614a5557614a556155c1565b9050602002016020810190614a6a9190615561565b6001600160a01b03161015614a9257604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149dd565b5f6060826040015151603014614ac35760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b04988a986001989297929690959094909390929101615e54565b60405160208183030381529060405290505f5b84608001516020015151811015614b7657818560800151602001518281518110614b4357614b436155c1565b6020026020010151604051602001614b5c929190615f0e565b60408051601f198184030181529190529150600101614b17565b5060a0840151805160209182015151604051614b96938593929101615f44565b60405160208183030381529060405290505f5b8460a001516020015151811015614c0857818560a00151602001518281518110614bd557614bd56155c1565b6020026020010151604051602001614bee929190615f0e565b60408051601f198184030181529190529150600101614ba9565b5060c0840151604051614c1f918391602001615f7f565b6040516020818303038152906040529050600281604051614c4091906157a1565b602060405180830381855afa158015614c5b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c7e919061554a565b94909350915050565b614c8f6143b8565b614c97614eb2565b610dca81614eba565b614ca86143b8565b614401614fa2565b614cb86143b8565b5f80516020615fd183398151915261ffff85161580614cdc575061271061ffff8616115b15614d0057604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d245760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d375750600a60ff8516115b15614d5a5760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614dc1576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614de15760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3b83835f614faa565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613deb565b6144016143b8565b614ec26143b8565b80355f80516020615ff18339815191529081556014614ee76060840160408501615dfe565b60ff161180614f065750614f016060830160408401615dfe565b60ff16155b15614f3a57614f1b6060830160408401615dfe565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614f4a6060830160408401615dfe565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f7b6040830160208401615307565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b1e6143b8565b606081471015614fcf5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614fea91906157a1565b5f6040518083038185875af1925050503d805f8114615024576040519150601f19603f3d011682016040523d82523d5f602084013e615029565b606091505b5091509150615039868383615043565b9695505050505050565b606082615058576150538261509f565b611e3b565b815115801561506f57506001600160a01b0384163b155b1561509857604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e3b565b8051156150af5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546150d4906154f2565b5f825580601f106150e3575050565b601f0160209004905f5260205f2090810190610dca919061513c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615150575f815560010161513d565b5090565b8015158114610dca575f80fd5b803563ffffffff81168114615174575f80fd5b919050565b5f805f6060848603121561518b575f80fd5b83359250602084013561519d81615154565b91506151ab60408501615161565b90509250925092565b5f602082840312156151c4575f80fd5b5035919050565b5f80604083850312156151dc575f80fd5b82356001600160401b038111156151f1575f80fd5b830160808186031215615202575f80fd5b915061521060208401615161565b90509250929050565b5f806040838503121561522a575f80fd5b8235915061521060208401615161565b5f6020828403121561524a575f80fd5b611e3b82615161565b803561ffff81168114615174575f80fd5b80356001600160401b0381168114615174575f80fd5b5f805f806080858703121561528d575f80fd5b84356001600160401b038111156152a2575f80fd5b850160a081880312156152b3575f80fd5b93506152c160208601615253565b92506152cf60408601615264565b9396929550929360600135925050565b5f80604083850312156152f0575f80fd5b6152f983615161565b946020939093013593505050565b5f60208284031215615317575f80fd5b611e3b82615264565b5f8060408385031215615331575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061536457615364615340565b9052565b5f5b8381101561538257818101518382015260200161536a565b50505f910152565b5f81518084526153a1816020860160208601615368565b601f01601f19169290920160200192915050565b602081526153c7602082018351615354565b5f602083015160e060408401526153e261010084018261538a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dca575f80fd5b5f8082840361016081121561545c575f80fd5b6101408082121561546b575f80fd5b849350830135905061547c81615435565b809150509250929050565b5f8060208385031215615498575f80fd5b82356001600160401b03808211156154ae575f80fd5b818501915085601f8301126154c1575f80fd5b8135818111156154cf575f80fd5b8660208285010111156154e0575f80fd5b60209290920196919550909350505050565b600181811c9082168061550657607f821691505b60208210810361552457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cfb8284615354565b602081525f611e3b602083018461538a565b5f6020828403121561555a575f80fd5b5051919050565b5f60208284031215615571575f80fd5b8135611e3b81615435565b5f808335601e19843603018112615591575f80fd5b8301803591506001600160401b038211156155aa575f80fd5b6020019150600581901b3603821315613745575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155e9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615629576156296155f3565b60405290565b604051608081016001600160401b0381118282101715615629576156296155f3565b604080519081016001600160401b0381118282101715615629576156296155f3565b604051601f8201601f191681016001600160401b038111828210171561569b5761569b6155f3565b604052919050565b5f6001600160401b038211156156bb576156bb6155f3565b50601f01601f191660200190565b5f82601f8301126156d8575f80fd5b81356156eb6156e6826156a3565b615673565b8181528460208386010111156156ff575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060828403121561572b575f80fd5b615733615607565b905081356001600160401b038082111561574b575f80fd5b615757858386016156c9565b8352602084013591508082111561576c575f80fd5b50615779848285016156c9565b60208301525061578b60408301615264565b604082015292915050565b5f610cfb368361571b565b5f82516155e9818460208701615368565b601f8211156104e357805f5260205f20601f840160051c810160208510156157d75750805b601f840160051c820191505b8181101561171d575f81556001016157e3565b81516001600160401b0381111561580f5761580f6155f3565b6158238161581d84546154f2565b846157b2565b602080601f831160018114615856575f841561583f5750858301515b5f19600386901b1c1916600185901b178555610f31565b5f85815260208120601f198616915b8281101561588457888601518255948401946001909101908401615865565b50858210156158a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cfb57610cfb6158b1565b5f63ffffffff8083168181036158f0576158f06158b1565b6001019392505050565b8082028115828204841417610cfb57610cfb6158b1565b5f6001600160401b03821115615929576159296155f3565b5060051b60200190565b5f60808236031215615943575f80fd5b61594b61562f565b8235815260208084013581830152604084013561596781615435565b604083015260608401356001600160401b0380821115615985575f80fd5b9085019036601f830112615997575f80fd5b81356159a56156e682615911565b81815260059190911b830184019084810190368311156159c3575f80fd5b8585015b838110156159f9578035858111156159dd575f80fd5b6159eb3689838a010161571b565b8452509186019186016159c7565b50606087015250939695505050505050565b5f82615a2557634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a3e57615a3e615340565b91905290565b5f60208083525f8454615a56816154f2565b806020870152604060018084165f8114615a775760018114615a9357615ac0565b60ff19851660408a0152604084151560051b8a01019550615ac0565b895f5260205f205f5b85811015615ab75781548b8201860152908301908801615a9c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611fa057611fa06158b1565b6001600160401b03828116828216039080821115611fa057611fa06158b1565b805161517481615154565b5f8060408385031215615b39575f80fd5b82516001600160401b0380821115615b4f575f80fd5b9084019060608287031215615b62575f80fd5b615b6a615607565b82518152602080840151615b7d81615435565b82820152604084015183811115615b92575f80fd5b80850194505087601f850112615ba6575f80fd5b83519250615bb66156e6846156a3565b8381528882858701011115615bc9575f80fd5b615bd884838301848801615368565b80604084015250819550615bed818801615b1d565b9450505050509250929050565b81810381811115610cfb57610cfb6158b1565b5f8651615c1e818460208b01615368565b60e087901b6001600160e01b0319169083019081528551615c46816004840160208a01615368565b8551910190615c5c816004840160208901615368565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b6001600160401b03818116838216028082169190828114615ca957615ca96158b1565b505092915050565b5f8235603e198336030181126155e9575f80fd5b5f808335601e19843603018112615cda575f80fd5b8301803591506001600160401b03821115615cf3575f80fd5b602001915036819003821315613745575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d45575f80fd5b615d4d615651565b615d5683615161565b81526020808401356001600160401b03811115615d71575f80fd5b840136601f820112615d81575f80fd5b8035615d8f6156e682615911565b81815260059190911b82018301908381019036831115615dad575f80fd5b928401925b82841015615dd4578335615dc581615435565b82529284019290840190615db2565b938501939093525091949350505050565b5f60208284031215615df5575f80fd5b611e3b82615253565b5f60208284031215615e0e575f80fd5b813560ff81168114611e3b575f80fd5b5f6001600160401b038083168181036158f0576158f06158b1565b5f60208284031215615e49575f80fd5b8151611e3b81615154565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e9a81602a850160208b01615368565b865190830190615eb181602a840160208b01615368565b60c087901b6001600160c01b031916602a9290910191820152615ee3603282018660e01b6001600160e01b0319169052565b615efc603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f1f818460208801615368565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f55818460208901615368565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f90818460208801615368565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 131a01b91..68b7aa6ed 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615e4a380380615e4a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615cfd8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614fb4565b610615565b005b348015610221575f80fd5b50610214610230366004614fef565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614fb4565b610858565b34801561028a575f80fd5b50610214610299366004615006565b610863565b3480156102a9575f80fd5b506102146102b8366004615054565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614fef565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614fb4565b610e5b565b348015610378575f80fd5b50610214610387366004615075565b610e66565b348015610397575f80fd5b506102146103a636600461508e565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee3660046150cc565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614fef565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614fb4565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614fef565b611208565b348015610490575f80fd5b5061021461049f36600461508e565b6112d3565b3480156104af575f80fd5b506102146104be366004615075565b6114ab565b6103f36104d13660046150f6565b611634565b3480156104e1575f80fd5b506103f35f80516020615c5183398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614fef565b611668565b34801561053a575f80fd5b506103f35f80516020615c7183398151915281565b34801561055a575f80fd5b50610214610569366004614fef565b611851565b348015610579575f80fd5b5061021461058836600461514a565b61198e565b6103f361059b366004614fef565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614fef565b611a9c565b60405161025791906151d6565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f3610610366004615256565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff16600581111561069757610697615161565b60058111156106a8576106a8615161565b81526020016001820180546106bc906152c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106e8906152c1565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e615161565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f97565b6040518263ffffffff1660e01b81526004016108129190615301565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615313565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c718339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615313565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b30610956606085016040860161533e565b6001600160a01b03161461099957610974606084016040850161533e565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615359565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615359565b8363ffffffff168181106109e0576109e061539e565b90506020028101906109f291906153b2565b6109fb906154d6565b80516040519192505f916008880191610a139161554f565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615301565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c9161554f565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615313565b90508086600801835f0151604051610ae2919061554f565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64615161565b021790555060208201516001820190610b7d90826155a4565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c22911685615673565b8251604051919550610c339161554f565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c8890615686565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836156a8565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fe6565b604001516120fc565b90505f610cf787612289565b90505f600282604051610d0a919061554f565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615313565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612463565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd7615161565b14610df7578060405163170cc93360e21b815260040161063c91906152f3565b610852838361249e565b5f805f80516020615c5183398151915260030154610e1f90846156bf565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612718565b610e6e612904565b5f80516020615c518339815191525f80610e878461293b565b91509150610e9482612463565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece615161565b03610ef3575f83815260088501602052604081208054919055610ef18282612c79565b505b610f0981610f048460400151611192565b612cd7565b505050505b610f2460015f80516020615cb183398151915255565b50565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115610f7457610f74615161565b6003811115610f8557610f85615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b905060018351600381111561101257611012615161565b14611033578251604051633b0d540d60e21b815261063c91906004016156de565b60048151600581111561104857611048615161565b0361105e5761105685612cfd565b505050505050565b5f8061107561106c89611fe6565b60400151612ee4565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b0384166156a8565b5f6111d382611a9c565b6080015192915050565b6111e8838383612718565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615c518339815191525f61122083611a9c565b519050600481600581111561123757611237615161565b14611257578060405163170cc93360e21b815260040161063c91906152f3565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c79565b6112db612904565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff16600381111561132857611328615161565b600381111561133957611339615161565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b2615161565b146113d3578051604051633b0d540d60e21b815261063c91906004016156de565b60046113e28260400151611a9c565b5160058111156113f4576113f4615161565b14611486575f61140385611fe6565b90505f806114148360400151612ee4565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612cfd565b50506114a760015f80516020615cb183398151915255565b5050565b5f80516020615c718339815191525f806114d06114c785611fe6565b6040015161313a565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f82815260068401602052604090208054611510906152c1565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a615161565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068401602052604081206115a591614f08565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612904565b611649848484346132f6565b905061166160015f80516020615cb183398151915255565b9392505050565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff1660038111156116b5576116b5615161565b60038111156116c6576116c6615161565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f615161565b14158015611760575060038151600381111561175d5761175d615161565b14155b15611781578051604051633b0d540d60e21b815261063c91906004016156de565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611f97565b6040518263ffffffff1660e01b815260040161180a9190615301565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615313565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615c718339815191529190611898906152c1565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e2615161565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e91906004016156f8565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615313565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f836134c4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612904565b611a7f8233346134d5565b9050611a9760015f80516020615cb183398151915255565b919050565b611aa4614f3f565b5f8281525f80516020615cd1833981519152602052604090819020815160e0810190925280545f80516020615c71833981519152929190829060ff166005811115611af157611af1615161565b6005811115611b0257611b02615161565b8152602001600182018054611b16906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b42906152c1565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615c71833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e9086908690615782565b90815260200160405180910390205491505092915050565b5f8381525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c518339815191529284929091829060ff166003811115611c9457611c94615161565b6003811115611ca557611ca5615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d32615161565b14611d53578251604051633b0d540d60e21b815261063c91906004016156de565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b031690615791565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e04615161565b03611f325760028401546080840151611e26916001600160401b031690615791565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761249e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea091906157b1565b6137aa565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee684613901565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f47615161565b03611f7b57611f5583613901565b5f898152600786016020526040902055611f6e88612cfd565b6001945050505050611661565b805160405163170cc93360e21b815261063c91906004016152f3565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561204a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207191908101906157dc565b915091508061209357604051636b2f19e960e01b815260040160405180910390fd5b8151156120b9578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120f5576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b6002811015612180576121488160016158ae565b6121539060086156a8565b61ffff168482815181106121695761216961539e565b016020015160f81c901b9190911790600101612134565b5061ffff8116156121aa5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612205576121c18160036158ae565b6121cc9060086156a8565b63ffffffff16856121de836002615673565b815181106121ee576121ee61539e565b016020015160f81c901b91909117906001016121ad565b5063ffffffff81161561222b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122805761224281601f6158ae565b61224d9060086156a8565b86612259836006615673565b815181106122695761226961539e565b016020015160f81c901b919091179060010161222e565b50949350505050565b60605f808335602085013560146122a58787016040890161533e565b6122b26060890189615359565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123386060850185615359565b90508110156120f5578161234f6060860186615359565b8381811061235f5761235f61539e565b905060200281019061237191906153b2565b61237b90806158c1565b905061238a6060870187615359565b8481811061239a5761239a61539e565b90506020028101906123ac91906153b2565b6123b690806158c1565b6123c36060890189615359565b868181106123d3576123d361539e565b90506020028101906123e591906153b2565b6123f39060208101906158c1565b61240060608b018b615359565b888181106124105761241061539e565b905060200281019061242291906153b2565b6124339060608101906040016150cc565b6040516020016124499796959493929190615903565b60408051601f19818403018152919052915060010161232b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261251091908101906157dc565b915091508061253257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612575573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125999190615313565b8251146125bf578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125fb576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061260a8460400151613a9e565b915091508187146126315760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615c51833981519152906001600160401b0390811690831611156126ee575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261270d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615c518339815191528161273186613c8f565b905061273c86612463565b61274b57600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127705733611278565b5f86815260058301602052604090205460a082015161279f91600160b01b90046001600160401b031690615791565b6001600160401b03168160c001516001600160401b031610156127e65760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127fe576127f7878661249e565b905061281c565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061284190611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156128aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ce9190615313565b905080846008015f8a81526020019081526020015f205f8282546128f29190615673565b90915550501515979650505050505050565b5f80516020615cb183398151915280546001190161293557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612944614f3f565b5f80516020615c718339815191525f806129606114c787611fe6565b91509150801561298757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129b8576129b8615161565b60058111156129c9576129c9615161565b81526020016001820180546129dd906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612a09906152c1565b8015612a545780601f10612a2b57610100808354040283529160200191612a54565b820191905f5260205f20905b815481529060010190602001808311612a3757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612abf57612abf615161565b14158015612ae05750600181516005811115612add57612add615161565b14155b15612b0157805160405163170cc93360e21b815261063c91906004016152f3565b600381516005811115612b1657612b16615161565b03612b245760048152612b29565b600581525b836008018160200151604051612b3f919061554f565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b8357612b83615161565b021790555060208201516001820190612b9c90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612c4257612c42615161565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612cc5575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613f73565b60015f80516020615cb183398151915255565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115612d4a57612d4a615161565b6003811115612d5b57612d5b615161565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e89575f84815260058701602052604090205461271090612e3b90600160a01b900461ffff16856156a8565b612e4591906156bf565b915081866008015f8681526020019081526020015f205f828254612e699190615673565b90915550612e79905082846158ae565b9050612e89856020015182612c79565b612e9e8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f1b57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612f6a57612f328160016158ae565b612f3d9060086156a8565b61ffff16868281518110612f5357612f5361539e565b016020015160f81c901b9190911790600101612f1e565b5061ffff811615612f945760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612fef57612fab8160036158ae565b612fb69060086156a8565b63ffffffff1687612fc8836002615673565b81518110612fd857612fd861539e565b016020015160f81c901b9190911790600101612f97565b5063ffffffff811660031461301757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561306c5761302e81601f6158ae565b6130399060086156a8565b88613045836006615673565b815181106130555761305561539e565b016020015160f81c901b919091179060010161301a565b505f805b60088110156130cb576130848160076158ae565b61308f9060086156a8565b6001600160401b0316896130a4836026615673565b815181106130b4576130b461539e565b016020015160f81c901b9190911790600101613070565b505f805b600881101561312a576130e38160076158ae565b6130ee9060086156a8565b6001600160401b03168a61310383602e615673565b815181106131135761311361539e565b016020015160f81c901b91909117906001016130cf565b5091989097509095509350505050565b5f80825160271461317057825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b60028110156131bf576131878160016158ae565b6131929060086156a8565b61ffff168582815181106131a8576131a861539e565b016020015160f81c901b9190911790600101613173565b5061ffff8116156131e95760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613244576132008160036158ae565b61320b9060086156a8565b63ffffffff168661321d836002615673565b8151811061322d5761322d61539e565b016020015160f81c901b91909117906001016131ec565b5063ffffffff811660021461326c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132c15761328381601f6158ae565b61328e9060086156a8565b8761329a836006615673565b815181106132aa576132aa61539e565b016020015160f81c901b919091179060010161326f565b505f866026815181106132d6576132d661539e565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615c5183398151915290600160401b900461ffff908116908616108061334a575061271061ffff8616115b1561336e57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b0390811690851610156133aa576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133bc5750806001015483115b156133dd5760405163222d164360e21b81526004810184905260240161063c565b825f6133e882610e01565b90505f6133f58983614006565b905060405180608001604052806134093390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6134cc61457e565b610f24816145c9565b5f5f80516020615c51833981519152816134ee84610e01565b90505f6134fa87611a9c565b905061350587612463565b613525576040516330efa98b60e01b81526004810188905260240161063c565b60028151600581111561353a5761353a615161565b1461355b57805160405163170cc93360e21b815261063c91906004016152f3565b5f82826080015161356c9190615791565b905083600201600a9054906101000a90046001600160401b03168260400151613595919061596c565b6001600160401b0316816001600160401b031611156135d257604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135de8a846137aa565b915091505f8a8360405160200161360c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561369f5761369f615161565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615cd1833981519152602052604081206002015481905f80516020615c7183398151915290600160801b90046001600160401b03166137f2858261463d565b5f6137fc87614860565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61384c8a858b611f97565b6040518263ffffffff1660e01b81526004016138689190615301565b6020604051808303815f875af1158015613884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138a89190615313565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615c5183398151915290505f6139218460400151611a9c565b90505f60038251600581111561393957613939615161565b1480613957575060048251600581111561395557613955615161565b145b15613967575060c08101516139a4565b60028251600581111561397c5761397c615161565b036139885750426139a4565b815160405163170cc93360e21b815261063c91906004016152f3565b84608001516001600160401b0316816001600160401b0316116139cb57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139f090611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a959190615313565b95945050505050565b5f808251602e14613ad457825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b2357613aeb8160016158ae565b613af69060086156a8565b61ffff16858281518110613b0c57613b0c61539e565b016020015160f81c901b9190911790600101613ad7565b5061ffff811615613b4d5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613ba857613b648160036158ae565b613b6f9060086156a8565b63ffffffff1686613b81836002615673565b81518110613b9157613b9161539e565b016020015160f81c901b9190911790600101613b50565b5063ffffffff811615613bce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c2357613be581601f6158ae565b613bf09060086156a8565b87613bfc836006615673565b81518110613c0c57613c0c61539e565b016020015160f81c901b9190911790600101613bd1565b505f805b6008811015613c8257613c3b8160076158ae565b613c469060086156a8565b6001600160401b031688613c5b836026615673565b81518110613c6b57613c6b61539e565b016020015160f81c901b9190911790600101613c27565b5090969095509350505050565b613c97614f3f565b5f8281525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff166005811115613ce457613ce4615161565b6005811115613cf557613cf5615161565b8152602001600182018054613d09906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054613d35906152c1565b8015613d805780601f10613d5757610100808354040283529160200191613d80565b820191905f5260205f20905b815481529060010190602001808311613d6357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dee57613dee615161565b14613e21575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e6557613e65615161565b021790555060208201516001820190613e7e90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f1c85826137aa565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f965760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fdf576040519150601f19603f3d011682016040523d82523d5f602084013e613fe4565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661404a57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615c718339815191524261406960608601604087016150cc565b6001600160401b03161115806140a357506140876202a30042615673565b61409760608601604087016150cc565b6001600160401b031610155b156140dd576140b860608501604086016150cc565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140f26140ed6060860186615997565b6148d5565b6141026140ed6080860186615997565b603061411160208601866158c1565b9050146141435761412560208501856158c1565b6040516326475b2f60e11b815261063c925060040190815260200190565b61414d84806158c1565b90505f0361417a5761415f84806158c1565b604051633e08a12560e11b815260040161063c9291906159ab565b5f6008820161418986806158c1565b604051614197929190615782565b908152602001604051809103902054146141d0576141b584806158c1565b60405163a41f772f60e01b815260040161063c9291906159ab565b6141da835f61463d565b6040805160e08101909152815481525f9081906142e690602081016141ff89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614247908a018a6158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161429060608a0160408b016150cc565b6001600160401b031681526020016142ab60608a018a615997565b6142b4906159d9565b81526020016142c660808a018a615997565b6142cf906159d9565b8152602001876001600160401b0316815250614a3e565b5f8281526006860160205260409020919350915061430482826155a4565b50816008840161431488806158c1565b604051614322929190615782565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061435e908590600401615301565b6020604051808303815f875af115801561437a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061439e9190615313565b6040805160e0810190915290915080600181526020016143be89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561444d5761444d615161565b02179055506020820151600182019061446690826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061450488806158c1565b604051614512929190615782565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061455091906150cc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166145c757604051631afcd79f60e31b815260040160405180910390fd5b565b6145d161457e565b6145da81614c2b565b6145e2614c44565b610f24606082013560808301356145ff60c0850160a086016150cc565b61460f60e0860160c08701615aa0565b614620610100870160e08801615ab9565b61010087013561463861014089016101208a0161533e565b614c54565b5f80516020615c718339815191525f6001600160401b0380841690851611156146715761466a83856157b1565b905061467e565b61467b84846157b1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146e05750600184015481516146dc916001600160401b031690615673565b8210155b15614706576001600160401b038316606082015281815260408101516020820152614725565b82816060018181516147189190615791565b6001600160401b03169052505b606081015161473590606461596c565b602082015160018601546001600160401b0392909216916147609190600160401b900460ff166156a8565b101561479057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b0316816040018181516147ab9190615673565b9052506040810180516001600160401b03871691906147cb9083906158ae565b905250600184015460408201516064916147f091600160401b90910460ff16906156a8565b1015614817578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615cd18339815191526020526040812060020180545f80516020615c7183398151915291906008906148aa90600160401b90046001600160401b0316615ad9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148e26020820182615075565b63ffffffff1615801561490257506148fd6020820182615359565b151590505b15614949576149146020820182615075565b6149216020830183615359565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149566020820182615359565b90506149656020830183615075565b63ffffffff16111561497e576149146020820182615075565b60015b61498e6020830183615359565b90508110156114a7576149a46020830183615359565b6149af6001846158ae565b8181106149be576149be61539e565b90506020020160208101906149d3919061533e565b6001600160a01b03166149e96020840184615359565b838181106149f9576149f961539e565b9050602002016020810190614a0e919061533e565b6001600160a01b03161015614a3657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614981565b5f6060826040015151603014614a675760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614aa8988a986001989297929690959094909390929101615af4565b60405160208183030381529060405290505f5b84608001516020015151811015614b1a57818560800151602001518281518110614ae757614ae761539e565b6020026020010151604051602001614b00929190615bae565b60408051601f198184030181529190529150600101614abb565b5060a0840151805160209182015151604051614b3a938593929101615be4565b60405160208183030381529060405290505f5b8460a001516020015151811015614bac57818560a00151602001518281518110614b7957614b7961539e565b6020026020010151604051602001614b92929190615bae565b60408051601f198184030181529190529150600101614b4d565b5060c0840151604051614bc3918391602001615c1f565b6040516020818303038152906040529050600281604051614be4919061554f565b602060405180830381855afa158015614bff573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c229190615313565b94909350915050565b614c3361457e565b614c3b614e10565b610f2481614e18565b614c4c61457e565b6145c7614f00565b614c5c61457e565b5f80516020615c5183398151915261ffff85161580614c80575061271061ffff8616115b15614ca457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614cc85760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614cdb5750600a60ff8516115b15614cfe5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614d65576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614d855760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6145c761457e565b614e2061457e565b80355f80516020615c718339815191529081556014614e456060840160408501615ab9565b60ff161180614e645750614e5f6060830160408401615ab9565b60ff16155b15614e9857614e796060830160408401615ab9565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614ea86060830160408401615ab9565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ed960408301602084016150cc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612cea61457e565b508054614f14906152c1565b5f825580601f10614f23575050565b601f0160209004905f5260205f2090810190610f249190614f7c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614f90575f8155600101614f7d565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215614fc6575f80fd5b833592506020840135614fd881614f94565b9150614fe660408501614fa1565b90509250925092565b5f60208284031215614fff575f80fd5b5035919050565b5f8060408385031215615017575f80fd5b82356001600160401b0381111561502c575f80fd5b83016080818603121561503d575f80fd5b915061504b60208401614fa1565b90509250929050565b5f8060408385031215615065575f80fd5b8235915061504b60208401614fa1565b5f60208284031215615085575f80fd5b61166182614fa1565b5f806040838503121561509f575f80fd5b6150a883614fa1565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f602082840312156150dc575f80fd5b611661826150b6565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615108575f80fd5b83356001600160401b0381111561511d575f80fd5b840160a0818703121561512e575f80fd5b925061513c602085016150e5565b9150614fe6604085016150b6565b5f610140828403121561515b575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061518557615185615161565b9052565b5f5b838110156151a357818101518382015260200161518b565b50505f910152565b5f81518084526151c2816020860160208601615189565b601f01601f19169290920160200192915050565b602081526151e8602082018351615175565b5f602083015160e060408401526152036101008401826151ab565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615267575f80fd5b82356001600160401b038082111561527d575f80fd5b818501915085601f830112615290575f80fd5b81358181111561529e575f80fd5b8660208285010111156152af575f80fd5b60209290920196919550909350505050565b600181811c908216806152d557607f821691505b60208210810361515b57634e487b7160e01b5f52602260045260245ffd5b60208101610e558284615175565b602081525f61166160208301846151ab565b5f60208284031215615323575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f6020828403121561534e575f80fd5b81356116618161532a565b5f808335601e1984360301811261536e575f80fd5b8301803591506001600160401b03821115615387575f80fd5b6020019150600581901b36038213156138fa575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153c6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615406576154066153d0565b60405290565b604080519081016001600160401b0381118282101715615406576154066153d0565b604051601f8201601f191681016001600160401b0381118282101715615456576154566153d0565b604052919050565b5f6001600160401b03821115615476576154766153d0565b50601f01601f191660200190565b5f82601f830112615493575f80fd5b81356154a66154a18261545e565b61542e565b8181528460208386010111156154ba575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156154e6575f80fd5b6154ee6153e4565b82356001600160401b0380821115615504575f80fd5b61551036838701615484565b83526020850135915080821115615525575f80fd5b5061553236828601615484565b602083015250615544604084016150b6565b604082015292915050565b5f82516153c6818460208701615189565b601f82111561064557805f5260205f20601f840160051c810160208510156155855750805b601f840160051c820191505b8181101561184a575f8155600101615591565b81516001600160401b038111156155bd576155bd6153d0565b6155d1816155cb84546152c1565b84615560565b602080601f831160018114615604575f84156155ed5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b8281101561563257888601518255948401946001909101908401615613565b508582101561564f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e5561565f565b5f63ffffffff80831681810361569e5761569e61565f565b6001019392505050565b8082028115828204841417610e5557610e5561565f565b5f826156d957634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106156f2576156f2615161565b91905290565b5f60208083525f845461570a816152c1565b806020870152604060018084165f811461572b576001811461574757615774565b60ff19851660408a0152604084151560051b8a01019550615774565b895f5260205f205f5b8581101561576b5781548b8201860152908301908801615750565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120f5576120f561565f565b6001600160401b038281168282160390808211156120f5576120f561565f565b8051611a9781614f94565b5f80604083850312156157ed575f80fd5b82516001600160401b0380821115615803575f80fd5b9084019060608287031215615816575f80fd5b61581e6153e4565b825181526020808401516158318161532a565b82820152604084015183811115615846575f80fd5b80850194505087601f85011261585a575f80fd5b8351925061586a6154a18461545e565b838152888285870101111561587d575f80fd5b61588c84838301848801615189565b806040840152508195506158a18188016157d1565b9450505050509250929050565b81810381811115610e5557610e5561565f565b5f808335601e198436030181126158d6575f80fd5b8301803591506001600160401b038211156158ef575f80fd5b6020019150368190038213156138fa575f80fd5b5f8851615914818460208d01615189565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461598f5761598f61565f565b505092915050565b5f8235603e198336030181126153c6575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156159e9575f80fd5b6159f161540c565b6159fa83614fa1565b81526020808401356001600160401b0380821115615a16575f80fd5b9085019036601f830112615a28575f80fd5b813581811115615a3a57615a3a6153d0565b8060051b9150615a4b84830161542e565b8181529183018401918481019036841115615a64575f80fd5b938501935b83851015615a8e5784359250615a7e8361532a565b8282529385019390850190615a69565b94860194909452509295945050505050565b5f60208284031215615ab0575f80fd5b611661826150e5565b5f60208284031215615ac9575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361569e5761569e61565f565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615b3a81602a850160208b01615189565b865190830190615b5181602a840160208b01615189565b60c087901b6001600160c01b031916602a9290910191820152615b83603282018660e01b6001600160e01b0319169052565b615b9c603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615bbf818460208801615189565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615bf5818460208901615189565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c30818460208801615189565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615ed5380380615ed583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d888061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614f1d565b610615565b005b348015610221575f80fd5b50610214610230366004614f58565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614f1d565b610858565b34801561028a575f80fd5b50610214610299366004614f6f565b610863565b3480156102a9575f80fd5b506102146102b8366004614fbd565b610d95565b3480156102c8575f80fd5b506102dc6102d7366004614f58565b610e09565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614f1d565b610e63565b348015610378575f80fd5b50610214610387366004614fde565b610e6e565b348015610397575f80fd5b506102146103a6366004614ff7565b610f2f565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004615035565b61119a565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614f58565b6111d1565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614f1d565b6111e5565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614f58565b611210565b348015610490575f80fd5b5061021461049f366004614ff7565b6112db565b3480156104af575f80fd5b506102146104be366004614fde565b6114b3565b6103f36104d136600461505f565b61163c565b3480156104e1575f80fd5b506103f35f80516020615cdc83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614f58565b611670565b34801561053a575f80fd5b506103f35f80516020615cfc83398151915281565b34801561055a575f80fd5b50610214610569366004614f58565b611859565b348015610579575f80fd5b506102146105883660046150b3565b611996565b6103f361059b366004614f58565b611a73565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614f58565b611aa4565b604051610257919061513f565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046151bf565b611bf3565b610620838383611c4e565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d5c8339815191526020526040808220815160e0810190925280545f80516020615cfc83398151915293929190829060ff166005811115610697576106976150ca565b60058111156106a8576106a86150ca565b81526020016001820180546106bc9061522a565b80601f01602080910402602001604051908101604052809291908181526020018280546106e89061522a565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6150ca565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f9f565b6040518263ffffffff1660e01b8152600401610812919061526a565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061527c565b50505050565b610852838383611c4e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cfc8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061527c565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016152a7565b6001600160a01b0316146109995761097460608401604085016152a7565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856152c2565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886152c2565b8363ffffffff168181106109e0576109e0615307565b90506020028101906109f2919061531b565b6109fb906154dc565b80516040519192505f916008880191610a13916154e7565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161526a565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916154e7565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061527c565b90508086600801835f0151604051610ae291906154e7565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646150ca565b021790555060208201516001820190610b7d908261553c565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c2291168561560b565b8251604051919550610c33916154e7565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c889061561e565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615640565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fee565b60400151612104565b90505f610cff610cfa88615679565b612291565b90505f600282604051610d1291906154e7565b602060405180830381855afa158015610d2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d50919061527c565b9050828114610d7c57604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9e826123cc565b610dbe576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc883611aa4565b5190506002816005811115610ddf57610ddf6150ca565b14610dff578060405163170cc93360e21b815260040161063c919061525c565b6108528383612407565b5f805f80516020615cdc83398151915260030154610e279084615751565b9050801580610e3c57506001600160401b0381115b15610e5d5760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612681565b610e7661286d565b5f80516020615cdc8339815191525f80610e8f846128a4565b91509150610e9c826123cc565b610ea857505050610f16565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ed657610ed66150ca565b03610efb575f83815260088501602052604081208054919055610ef98282612be2565b505b610f1181610f0c846040015161119a565b612c40565b505050505b610f2c60015f80516020615d3c83398151915255565b50565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115610f7c57610f7c6150ca565b6003811115610f8d57610f8d6150ca565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61100382611aa4565b905060018351600381111561101a5761101a6150ca565b1461103b578251604051633b0d540d60e21b815261063c9190600401615770565b600481516005811115611050576110506150ca565b036110665761105e85612c66565b505050505050565b5f8061107d61107489611fee565b60400151612e4d565b50915091508184146110aa57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110e35750806001600160401b03168560a001516001600160401b0316115b1561110c57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e5d906001600160401b038416615640565b5f6111db82611aa4565b6080015192915050565b6111f0838383612681565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615cdc8339815191525f61122883611aa4565b519050600481600581111561123f5761123f6150ca565b1461125f578060405163170cc93360e21b815260040161063c919061525c565b5f8381526005830160205260409020546001600160a01b031633146112a557335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612be2565b6112e361286d565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115611330576113306150ca565b6003811115611341576113416150ca565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113ba576113ba6150ca565b146113db578051604051633b0d540d60e21b815261063c9190600401615770565b60046113ea8260400151611aa4565b5160058111156113fc576113fc6150ca565b1461148e575f61140b85611fee565b90505f8061141c8360400151612e4d565b5091509150818460400151146114485760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148a57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61149783612c66565b50506114af60015f80516020615d3c83398151915255565b5050565b5f80516020615cfc8339815191525f806114d86114cf85611fee565b604001516130a3565b91509150806114fe57604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546115189061522a565b90505f0361153c5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff166005811115611562576115626150ca565b14611595575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b5f82815260068401602052604081206115ad91614e71565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61164561286d565b6116518484843461325f565b905061166960015f80516020615d3c83398151915255565b9392505050565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff1660038111156116bd576116bd6150ca565b60038111156116ce576116ce6150ca565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611747576117476150ca565b141580156117685750600381516003811115611765576117656150ca565b14155b15611789578051604051633b0d540d60e21b815261063c9190600401615770565b5f6117978260400151611aa4565b905080606001516001600160401b03165f036117c9576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117f6846040015184606001518560800151611f9f565b6040518263ffffffff1660e01b8152600401611812919061526a565b6020604051808303815f875af115801561182e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611852919061527c565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cfc83398151915291906118a09061522a565b90505f036118c45760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118ea576118ea6150ca565b1461191d575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611956919060040161578a565b6020604051808303815f875af1158015611972573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061527c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119df575080546001600160401b03808416911610155b156119fd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a278361342d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a7c61286d565b611a8782333461343e565b9050611a9f60015f80516020615d3c83398151915255565b919050565b611aac614ea8565b5f8281525f80516020615d5c833981519152602052604090819020815160e0810190925280545f80516020615cfc833981519152929190829060ff166005811115611af957611af96150ca565b6005811115611b0a57611b0a6150ca565b8152602001600182018054611b1e9061522a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4a9061522a565b8015611b955780601f10611b6c57610100808354040283529160200191611b95565b820191905f5260205f20905b815481529060010190602001808311611b7857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615cfc833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c369086908690615814565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc8339815191529284929091829060ff166003811115611c9c57611c9c6150ca565b6003811115611cad57611cad6150ca565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d2382611aa4565b9050600283516003811115611d3a57611d3a6150ca565b14611d5b578251604051633b0d540d60e21b815261063c9190600401615770565b60208301516001600160a01b03163314611df7575f8281526005850160205260409020546001600160a01b03163314611d945733611280565b5f82815260058501602052604090205460a0820151611dc391600160b01b90046001600160401b031690615823565b6001600160401b0316421015611df75760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0c57611e0c6150ca565b03611f3a5760028401546080840151611e2e916001600160401b031690615823565b6001600160401b0316421015611e625760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e7457611e728287612407565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ead918491611ea89190615843565b613713565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611eee8461386a565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116699350505050565b600481516005811115611f4f57611f4f6150ca565b03611f8357611f5d8361386a565b5f898152600786016020526040902055611f7688612c66565b6001945050505050611669565b805160405163170cc93360e21b815261063c919060040161525c565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612052573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612079919081019061586e565b915091508061209b57604051636b2f19e960e01b815260040160405180910390fd5b8151156120c1578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120fd576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213957815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b600281101561218857612150816001615940565b61215b906008615640565b61ffff1684828151811061217157612171615307565b016020015160f81c901b919091179060010161213c565b5061ffff8116156121b25760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561220d576121c9816003615940565b6121d4906008615640565b63ffffffff16856121e683600261560b565b815181106121f6576121f6615307565b016020015160f81c901b91909117906001016121b5565b5063ffffffff81161561223357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122885761224a81601f615940565b612255906008615640565b8661226183600661560b565b8151811061227157612271615307565b016020015160f81c901b9190911790600101612236565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b8360600151518110156120fd57818460600151828151811061232d5761232d615307565b60200260200101515f0151518560600151838151811061234f5761234f615307565b60200260200101515f01518660600151848151811061237057612370615307565b6020026020010151602001518760600151858151811061239257612392615307565b6020026020010151604001516040516020016123b2959493929190615953565b60408051601f198184030181529190529150600101612309565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612452573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612479919081019061586e565b915091508061249b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612502919061527c565b825114612528578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612564576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125738460400151613a07565b9150915081871461259a5760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615cdc833981519152906001600160401b039081169083161115612657575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612676565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615cdc8339815191528161269a86613bf8565b90506126a5866123cc565b6126b457600192505050611669565b5f8681526005830160205260409020546001600160a01b031633146126d95733611280565b5f86815260058301602052604090205460a082015161270891600160b01b90046001600160401b031690615823565b6001600160401b03168160c001516001600160401b0316101561274f5760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f8515612767576127608786612407565b9050612785565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127aa9061119a565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612837919061527c565b905080846008015f8a81526020019081526020015f205f82825461285b919061560b565b90915550501515979650505050505050565b5f80516020615d3c83398151915280546001190161289e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128ad614ea8565b5f80516020615cfc8339815191525f806128c96114cf87611fee565b9150915080156128f057604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612921576129216150ca565b6005811115612932576129326150ca565b81526020016001820180546129469061522a565b80601f01602080910402602001604051908101604052809291908181526020018280546129729061522a565b80156129bd5780601f10612994576101008083540402835291602001916129bd565b820191905f5260205f20905b8154815290600101906020018083116129a057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a2857612a286150ca565b14158015612a495750600181516005811115612a4657612a466150ca565b14155b15612a6a57805160405163170cc93360e21b815261063c919060040161525c565b600381516005811115612a7f57612a7f6150ca565b03612a8d5760048152612a92565b600581525b836008018160200151604051612aa891906154e7565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aec57612aec6150ca565b021790555060208201516001820190612b05908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bab57612bab6150ca565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c2e575f80fd5b505af115801561105e573d5f803e3d5ffd5b6114af6001600160a01b03831682613edc565b60015f80516020615d3c83398151915255565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115612cb357612cb36150ca565b6003811115612cc457612cc46150ca565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612df2575f84815260058701602052604090205461271090612da490600160a01b900461ffff1685615640565b612dae9190615751565b915081866008015f8681526020019081526020015f205f828254612dd2919061560b565b90915550612de290508284615940565b9050612df2856020015182612be2565b612e078560200151610f0c876060015161119a565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8457835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612ed357612e9b816001615940565b612ea6906008615640565b61ffff16868281518110612ebc57612ebc615307565b016020015160f81c901b9190911790600101612e87565b5061ffff811615612efd5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f5857612f14816003615940565b612f1f906008615640565b63ffffffff1687612f3183600261560b565b81518110612f4157612f41615307565b016020015160f81c901b9190911790600101612f00565b5063ffffffff8116600314612f8057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fd557612f9781601f615940565b612fa2906008615640565b88612fae83600661560b565b81518110612fbe57612fbe615307565b016020015160f81c901b9190911790600101612f83565b505f805b600881101561303457612fed816007615940565b612ff8906008615640565b6001600160401b03168961300d83602661560b565b8151811061301d5761301d615307565b016020015160f81c901b9190911790600101612fd9565b505f805b60088110156130935761304c816007615940565b613057906008615640565b6001600160401b03168a61306c83602e61560b565b8151811061307c5761307c615307565b016020015160f81c901b9190911790600101613038565b5091989097509095509350505050565b5f8082516027146130d957825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b6002811015613128576130f0816001615940565b6130fb906008615640565b61ffff1685828151811061311157613111615307565b016020015160f81c901b91909117906001016130dc565b5061ffff8116156131525760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131ad57613169816003615940565b613174906008615640565b63ffffffff168661318683600261560b565b8151811061319657613196615307565b016020015160f81c901b9190911790600101613155565b5063ffffffff81166002146131d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561322a576131ec81601f615940565b6131f7906008615640565b8761320383600661560b565b8151811061321357613213615307565b016020015160f81c901b91909117906001016131d8565b505f8660268151811061323f5761323f615307565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615cdc83398151915290600160401b900461ffff90811690861610806132b3575061271061ffff8616115b156132d757604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613313576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133255750806001015483115b156133465760405163222d164360e21b81526004810184905260240161063c565b825f61335182610e09565b90505f61335e8983613f6f565b905060405180608001604052806133723390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6134356144e7565b610f2c81614532565b5f5f80516020615cdc8339815191528161345784610e09565b90505f61346387611aa4565b905061346e876123cc565b61348e576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134a3576134a36150ca565b146134c457805160405163170cc93360e21b815261063c919060040161525c565b5f8282608001516134d59190615823565b905083600201600a9054906101000a90046001600160401b031682604001516134fe91906159cc565b6001600160401b0316816001600160401b0316111561353b57604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135478a84613713565b915091505f8a8360405160200161357592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff19166001836003811115613608576136086150ca565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d5c833981519152602052604081206002015481905f80516020615cfc83398151915290600160801b90046001600160401b031661375b85826145a6565b5f613765876147c9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137b58a858b611f9f565b6040518263ffffffff1660e01b81526004016137d1919061526a565b6020604051808303815f875af11580156137ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613811919061527c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615cdc83398151915290505f61388a8460400151611aa4565b90505f6003825160058111156138a2576138a26150ca565b14806138c057506004825160058111156138be576138be6150ca565b145b156138d0575060c081015161390d565b6002825160058111156138e5576138e56150ca565b036138f157504261390d565b815160405163170cc93360e21b815261063c919060040161525c565b84608001516001600160401b0316816001600160401b03161161393457505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139599061119a565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fe919061527c565b95945050505050565b5f808251602e14613a3d57825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613a8c57613a54816001615940565b613a5f906008615640565b61ffff16858281518110613a7557613a75615307565b016020015160f81c901b9190911790600101613a40565b5061ffff811615613ab65760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b1157613acd816003615940565b613ad8906008615640565b63ffffffff1686613aea83600261560b565b81518110613afa57613afa615307565b016020015160f81c901b9190911790600101613ab9565b5063ffffffff811615613b3757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b8c57613b4e81601f615940565b613b59906008615640565b87613b6583600661560b565b81518110613b7557613b75615307565b016020015160f81c901b9190911790600101613b3a565b505f805b6008811015613beb57613ba4816007615940565b613baf906008615640565b6001600160401b031688613bc483602661560b565b81518110613bd457613bd4615307565b016020015160f81c901b9190911790600101613b90565b5090969095509350505050565b613c00614ea8565b5f8281525f80516020615d5c8339815191526020526040808220815160e0810190925280545f80516020615cfc83398151915293929190829060ff166005811115613c4d57613c4d6150ca565b6005811115613c5e57613c5e6150ca565b8152602001600182018054613c729061522a565b80601f0160208091040260200160405190810160405280929190818152602001828054613c9e9061522a565b8015613ce95780601f10613cc057610100808354040283529160200191613ce9565b820191905f5260205f20905b815481529060010190602001808311613ccc57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d5757613d576150ca565b14613d8a575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dce57613dce6150ca565b021790555060208201516001820190613de7908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e858582613713565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eff5760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f48576040519150601f19603f3d011682016040523d82523d5f602084013e613f4d565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fb357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cfc83398151915242613fd26060860160408701615035565b6001600160401b031611158061400c5750613ff06202a3004261560b565b6140006060860160408701615035565b6001600160401b031610155b15614046576140216060850160408601615035565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61405b61405660608601866159f7565b61483e565b61406b61405660808601866159f7565b603061407a6020860186615a0b565b9050146140ac5761408e6020850185615a0b565b6040516326475b2f60e11b815261063c925060040190815260200190565b6140b68480615a0b565b90505f036140e3576140c88480615a0b565b604051633e08a12560e11b815260040161063c929190615a4d565b5f600882016140f28680615a0b565b604051614100929190615814565b908152602001604051809103902054146141395761411e8480615a0b565b60405163a41f772f60e01b815260040161063c929190615a4d565b614143835f6145a6565b6040805160e08101909152815481525f90819061424f90602081016141688980615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141b0908a018a615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141f960608a0160408b01615035565b6001600160401b0316815260200161421460608a018a6159f7565b61421d90615a7b565b815260200161422f60808a018a6159f7565b61423890615a7b565b8152602001876001600160401b03168152506149a7565b5f8281526006860160205260409020919350915061426d828261553c565b50816008840161427d8880615a0b565b60405161428b929190615814565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142c790859060040161526a565b6020604051808303815f875af11580156142e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614307919061527c565b6040805160e0810190915290915080600181526020016143278980615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143b6576143b66150ca565b0217905550602082015160018201906143cf908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061446d8880615a0b565b60405161447b929190615814565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144b99190615035565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661453057604051631afcd79f60e31b815260040160405180910390fd5b565b61453a6144e7565b61454381614b94565b61454b614bad565b610f2c6060820135608083013561456860c0850160a08601615035565b61457860e0860160c08701615b2b565b614589610100870160e08801615b44565b6101008701356145a161014089016101208a016152a7565b614bbd565b5f80516020615cfc8339815191525f6001600160401b0380841690851611156145da576145d38385615843565b90506145e7565b6145e48484615843565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614649575060018401548151614645916001600160401b03169061560b565b8210155b1561466f576001600160401b03831660608201528181526040810151602082015261468e565b82816060018181516146819190615823565b6001600160401b03169052505b606081015161469e9060646159cc565b602082015160018601546001600160401b0392909216916146c99190600160401b900460ff16615640565b10156146f957606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b031681604001818151614714919061560b565b9052506040810180516001600160401b0387169190614734908390615940565b9052506001840154604082015160649161475991600160401b90910460ff1690615640565b1015614780578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d5c8339815191526020526040812060020180545f80516020615cfc833981519152919060089061481390600160401b90046001600160401b0316615b64565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61484b6020820182614fde565b63ffffffff1615801561486b575061486660208201826152c2565b151590505b156148b25761487d6020820182614fde565b61488a60208301836152c2565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6148bf60208201826152c2565b90506148ce6020830183614fde565b63ffffffff1611156148e75761487d6020820182614fde565b60015b6148f760208301836152c2565b90508110156114af5761490d60208301836152c2565b614918600184615940565b81811061492757614927615307565b905060200201602081019061493c91906152a7565b6001600160a01b031661495260208401846152c2565b8381811061496257614962615307565b905060200201602081019061497791906152a7565b6001600160a01b0316101561499f57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148ea565b5f60608260400151516030146149d05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a11988a986001989297929690959094909390929101615b7f565b60405160208183030381529060405290505f5b84608001516020015151811015614a8357818560800151602001518281518110614a5057614a50615307565b6020026020010151604051602001614a69929190615c39565b60408051601f198184030181529190529150600101614a24565b5060a0840151805160209182015151604051614aa3938593929101615c6f565b60405160208183030381529060405290505f5b8460a001516020015151811015614b1557818560a00151602001518281518110614ae257614ae2615307565b6020026020010151604051602001614afb929190615c39565b60408051601f198184030181529190529150600101614ab6565b5060c0840151604051614b2c918391602001615caa565b6040516020818303038152906040529050600281604051614b4d91906154e7565b602060405180830381855afa158015614b68573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8b919061527c565b94909350915050565b614b9c6144e7565b614ba4614d79565b610f2c81614d81565b614bb56144e7565b614530614e69565b614bc56144e7565b5f80516020615cdc83398151915261ffff85161580614be9575061271061ffff8616115b15614c0d57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c315760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c445750600a60ff8516115b15614c675760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614cce576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614cee5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6145306144e7565b614d896144e7565b80355f80516020615cfc8339815191529081556014614dae6060840160408501615b44565b60ff161180614dcd5750614dc86060830160408401615b44565b60ff16155b15614e0157614de26060830160408401615b44565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614e116060830160408401615b44565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e426040830160208401615035565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c536144e7565b508054614e7d9061522a565b5f825580601f10614e8c575050565b601f0160209004905f5260205f2090810190610f2c9190614ee5565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ef9575f8155600101614ee6565b5090565b8015158114610f2c575f80fd5b803563ffffffff81168114611a9f575f80fd5b5f805f60608486031215614f2f575f80fd5b833592506020840135614f4181614efd565b9150614f4f60408501614f0a565b90509250925092565b5f60208284031215614f68575f80fd5b5035919050565b5f8060408385031215614f80575f80fd5b82356001600160401b03811115614f95575f80fd5b830160808186031215614fa6575f80fd5b9150614fb460208401614f0a565b90509250929050565b5f8060408385031215614fce575f80fd5b82359150614fb460208401614f0a565b5f60208284031215614fee575f80fd5b61166982614f0a565b5f8060408385031215615008575f80fd5b61501183614f0a565b946020939093013593505050565b80356001600160401b0381168114611a9f575f80fd5b5f60208284031215615045575f80fd5b6116698261501f565b803561ffff81168114611a9f575f80fd5b5f805f60608486031215615071575f80fd5b83356001600160401b03811115615086575f80fd5b840160a08187031215615097575f80fd5b92506150a56020850161504e565b9150614f4f6040850161501f565b5f61014082840312156150c4575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106150ee576150ee6150ca565b9052565b5f5b8381101561510c5781810151838201526020016150f4565b50505f910152565b5f815180845261512b8160208601602086016150f2565b601f01601f19169290920160200192915050565b602081526151516020820183516150de565b5f602083015160e0604084015261516c610100840182615114565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156151d0575f80fd5b82356001600160401b03808211156151e6575f80fd5b818501915085601f8301126151f9575f80fd5b813581811115615207575f80fd5b866020828501011115615218575f80fd5b60209290920196919550909350505050565b600181811c9082168061523e57607f821691505b6020821081036150c457634e487b7160e01b5f52602260045260245ffd5b60208101610e5d82846150de565b602081525f6116696020830184615114565b5f6020828403121561528c575f80fd5b5051919050565b6001600160a01b0381168114610f2c575f80fd5b5f602082840312156152b7575f80fd5b813561166981615293565b5f808335601e198436030181126152d7575f80fd5b8301803591506001600160401b038211156152f0575f80fd5b6020019150600581901b3603821315613863575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261532f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561536f5761536f615339565b60405290565b604051608081016001600160401b038111828210171561536f5761536f615339565b604080519081016001600160401b038111828210171561536f5761536f615339565b604051601f8201601f191681016001600160401b03811182821017156153e1576153e1615339565b604052919050565b5f6001600160401b0382111561540157615401615339565b50601f01601f191660200190565b5f82601f83011261541e575f80fd5b813561543161542c826153e9565b6153b9565b818152846020838601011115615445575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215615471575f80fd5b61547961534d565b905081356001600160401b0380821115615491575f80fd5b61549d8583860161540f565b835260208401359150808211156154b2575f80fd5b506154bf8482850161540f565b6020830152506154d16040830161501f565b604082015292915050565b5f610e5d3683615461565b5f825161532f8184602087016150f2565b601f82111561064557805f5260205f20601f840160051c8101602085101561551d5750805b601f840160051c820191505b81811015611852575f8155600101615529565b81516001600160401b0381111561555557615555615339565b61556981615563845461522a565b846154f8565b602080601f83116001811461559c575f84156155855750858301515b5f19600386901b1c1916600185901b17855561105e565b5f85815260208120601f198616915b828110156155ca578886015182559484019460019091019084016155ab565b50858210156155e757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5d57610e5d6155f7565b5f63ffffffff808316818103615636576156366155f7565b6001019392505050565b8082028115828204841417610e5d57610e5d6155f7565b5f6001600160401b0382111561566f5761566f615339565b5060051b60200190565b5f60808236031215615689575f80fd5b615691615375565b823581526020808401358183015260408401356156ad81615293565b604083015260608401356001600160401b03808211156156cb575f80fd5b9085019036601f8301126156dd575f80fd5b81356156eb61542c82615657565b81815260059190911b83018401908481019036831115615709575f80fd5b8585015b8381101561573f57803585811115615723575f80fd5b6157313689838a0101615461565b84525091860191860161570d565b50606087015250939695505050505050565b5f8261576b57634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615784576157846150ca565b91905290565b5f60208083525f845461579c8161522a565b806020870152604060018084165f81146157bd57600181146157d957615806565b60ff19851660408a0152604084151560051b8a01019550615806565b895f5260205f205f5b858110156157fd5781548b82018601529083019088016157e2565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120fd576120fd6155f7565b6001600160401b038281168282160390808211156120fd576120fd6155f7565b8051611a9f81614efd565b5f806040838503121561587f575f80fd5b82516001600160401b0380821115615895575f80fd5b90840190606082870312156158a8575f80fd5b6158b061534d565b825181526020808401516158c381615293565b828201526040840151838111156158d8575f80fd5b80850194505087601f8501126158ec575f80fd5b835192506158fc61542c846153e9565b838152888285870101111561590f575f80fd5b61591e848383018488016150f2565b80604084015250819550615933818801615863565b9450505050509250929050565b81810381811115610e5d57610e5d6155f7565b5f8651615964818460208b016150f2565b60e087901b6001600160e01b031916908301908152855161598c816004840160208a016150f2565b85519101906159a28160048401602089016150f2565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b6001600160401b038181168382160280821691908281146159ef576159ef6155f7565b505092915050565b5f8235603e1983360301811261532f575f80fd5b5f808335601e19843603018112615a20575f80fd5b8301803591506001600160401b03821115615a39575f80fd5b602001915036819003821315613863575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a8b575f80fd5b615a93615397565b615a9c83614f0a565b81526020808401356001600160401b03811115615ab7575f80fd5b840136601f820112615ac7575f80fd5b8035615ad561542c82615657565b81815260059190911b82018301908381019036831115615af3575f80fd5b928401925b82841015615b1a578335615b0b81615293565b82529284019290840190615af8565b938501939093525091949350505050565b5f60208284031215615b3b575f80fd5b6116698261504e565b5f60208284031215615b54575f80fd5b813560ff81168114611669575f80fd5b5f6001600160401b03808316818103615636576156366155f7565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bc581602a850160208b016150f2565b865190830190615bdc81602a840160208b016150f2565b60c087901b6001600160c01b031916602a9290910191820152615c0e603282018660e01b6001600160e01b0319169052565b615c27603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c4a8184602088016150f2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c808184602089016150f2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cbb8184602088016150f2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index a072d6ff7..5f7f58817 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -80,7 +80,7 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613a5c380380613a5c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61390f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612cb7565b610312565b005b610149610159366004612ce6565b610529565b61014961016c366004612d34565b610a53565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612cb7565b610a61565b6040516001600160401b03909116815260200161018a565b610149610a75565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612cb7565b610a88565b6101cd61025a366004612d63565b610a9d565b61014961026d366004612d34565b610ab9565b6102216005600160991b0181565b6101cd5f805160206138c383398151915281565b6101496102a2366004612cb7565b610c42565b6101e3601481565b6101496102bd366004612dbc565b610d7f565b6102d56102d0366004612cb7565b610e8d565b60405161018a9190612e79565b6101a66202a30081565b6101496102fa366004612ef9565b610fdc565b6101cd61030d366004612f1b565b611019565b5f8181525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561035f5761035f612df8565b600581111561037057610370612df8565b815260200160018201805461038490612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612f86565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612df8565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611074565b6040518263ffffffff1660e01b81526004016104e39190612fcc565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612fde565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206138c38339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612fde565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612ef9565b6001600160a01b03161461065f5761063a6060840160408501612ef9565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612ff5565b905090505f805b828163ffffffff161015610955575f6106906060880188612ff5565b8363ffffffff168181106106a6576106a661303a565b90506020028101906106b8919061304e565b6106c190613172565b80516040519192505f9160088801916106d9916131eb565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612fcc565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610752916131eb565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612fde565b90508086600801835f01516040516107a891906131eb565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612df8565b0217905550602082015160018201906108439082613247565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e891168561331a565b82516040519195506108f9916131eb565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e9061332d565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff168361334f565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110c3565b604001516111d9565b90505f6109bd87611366565b90505f6002826040516109d091906131eb565b602060405180830381855afa1580156109eb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a0e9190612fde565b9050828114610a3a57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a5c81611540565b505050565b5f610a6b82610e8d565b6080015192915050565b610a7d61187e565b610a865f6118d9565b565b610a9061187e565b610a9981611949565b5050565b5f610aa661187e565b610ab08383611c2d565b90505b92915050565b5f805160206138c38339815191525f80610ade610ad5856110c3565b604001516121a5565b9150915080610b0457604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b1e90612f86565b90505f03610b425760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b6857610b68612df8565b14610b9b575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f8281526006840160205260408120610bb391612c2b565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206138c38339815191529190610c8990612f86565b90505f03610cad5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cd357610cd3612df8565b14610d06575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d3f9190600401613366565b6020604051808303815f875af1158015610d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190612fde565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dc35750825b90505f826001600160401b03166001148015610dde5750303b155b905081158015610dec575080155b15610e0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3457845460ff60401b1916600160401b1785555b610e3e8787612361565b8315610e8457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e95612c62565b5f8281525f805160206138e3833981519152602052604090819020815160e0810190925280545f805160206138c3833981519152929190829060ff166005811115610ee257610ee2612df8565b6005811115610ef357610ef3612df8565b8152602001600182018054610f0790612f86565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3390612f86565b8015610f7e5780601f10610f5557610100808354040283529160200191610f7e565b820191905f5260205f20905b815481529060010190602001808311610f6157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fe461187e565b6001600160a01b03811661100d57604051631e4fbdf760e01b81525f6004820152602401610499565b611016816118d9565b50565b6040515f905f805160206138c3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061105c90869086906133f0565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611127573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261114e919081019061340e565b915091508061117057604051636b2f19e960e01b815260040160405180910390fd5b815115611196578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111d2576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461120e57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561125d576112258160016134e0565b61123090600861334f565b61ffff168482815181106112465761124661303a565b016020015160f81c901b9190911790600101611211565b5061ffff8116156112875760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112e25761129e8160036134e0565b6112a990600861334f565b63ffffffff16856112bb83600261331a565b815181106112cb576112cb61303a565b016020015160f81c901b919091179060010161128a565b5063ffffffff81161561130857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561135d5761131f81601f6134e0565b61132a90600861334f565b8661133683600661331a565b815181106113465761134661303a565b016020015160f81c901b919091179060010161130b565b50949350505050565b60605f8083356020850135601461138287870160408901612ef9565b61138f6060890189612ff5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6114156060850185612ff5565b90508110156111d2578161142c6060860186612ff5565b8381811061143c5761143c61303a565b905060200281019061144e919061304e565b61145890806134f3565b90506114676060870187612ff5565b848181106114775761147761303a565b9050602002810190611489919061304e565b61149390806134f3565b6114a06060890189612ff5565b868181106114b0576114b061303a565b90506020028101906114c2919061304e565b6114d09060208101906134f3565b6114dd60608b018b612ff5565b888181106114ed576114ed61303a565b90506020028101906114ff919061304e565b611510906060810190604001613535565b604051602001611526979695949392919061354e565b60408051601f198184030181529190529150600101611408565b5f611549612c62565b5f805160206138c38339815191525f80611565610ad5876110c3565b91509150801561158c57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156115bd576115bd612df8565b60058111156115ce576115ce612df8565b81526020016001820180546115e290612f86565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90612f86565b80156116595780601f1061163057610100808354040283529160200191611659565b820191905f5260205f20905b81548152906001019060200180831161163c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156116c4576116c4612df8565b141580156116e557506001815160058111156116e2576116e2612df8565b14155b1561170657805160405163170cc93360e21b81526104999190600401612fbe565b60038151600581111561171b5761171b612df8565b03611729576004815261172e565b600581525b83600801816020015160405161174491906131eb565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561178857611788612df8565b0217905550602082015160018201906117a19082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561184757611847612df8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118b07f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a865760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611951612c62565b5f8281525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561199e5761199e612df8565b60058111156119af576119af612df8565b81526020016001820180546119c390612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546119ef90612f86565b8015611a3a5780601f10611a1157610100808354040283529160200191611a3a565b820191905f5260205f20905b815481529060010190602001808311611a1d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611aa857611aa8612df8565b14611adb575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b1f57611b1f612df8565b021790555060208201516001820190611b389082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bd6858261237b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c7157604051637fab81e560e01b815260040160405180910390fd5b5f805160206138c383398151915242611c906060860160408701613535565b6001600160401b0316111580611cca5750611cae6202a3004261331a565b611cbe6060860160408701613535565b6001600160401b031610155b15611d0457611cdf6060850160408601613535565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611d19611d1460608601866135b7565b6124d2565b611d29611d1460808601866135b7565b6030611d3860208601866134f3565b905014611d6a57611d4c60208501856134f3565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d7484806134f3565b90505f03611da157611d8684806134f3565b604051633e08a12560e11b81526004016104999291906135cb565b5f60088201611db086806134f3565b604051611dbe9291906133f0565b90815260200160405180910390205414611df757611ddc84806134f3565b60405163a41f772f60e01b81526004016104999291906135cb565b611e01835f61263b565b6040805160e08101909152815481525f908190611f0d9060208101611e2689806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e6e908a018a6134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611eb760608a0160408b01613535565b6001600160401b03168152602001611ed260608a018a6135b7565b611edb906135f9565b8152602001611eed60808a018a6135b7565b611ef6906135f9565b8152602001876001600160401b031681525061285e565b5f82815260068601602052604090209193509150611f2b8282613247565b508160088401611f3b88806134f3565b604051611f499291906133f0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f85908590600401612fcc565b6020604051808303815f875af1158015611fa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc59190612fde565b6040805160e081019091529091508060018152602001611fe589806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561207457612074612df8565b02179055506020820151600182019061208d9082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061212b88806134f3565b6040516121399291906133f0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906121779190613535565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8082516027146121db57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b600281101561222a576121f28160016134e0565b6121fd90600861334f565b61ffff168582815181106122135761221361303a565b016020015160f81c901b91909117906001016121de565b5061ffff8116156122545760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122af5761226b8160036134e0565b61227690600861334f565b63ffffffff168661228883600261331a565b815181106122985761229861303a565b016020015160f81c901b9190911790600101612257565b5063ffffffff81166002146122d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561232c576122ee81601f6134e0565b6122f990600861334f565b8761230583600661331a565b815181106123155761231561303a565b016020015160f81c901b91909117906001016122da565b505f866026815181106123415761234161303a565b016020015191976001600160f81b03199092161515965090945050505050565b612369612a4b565b61237282612a94565b610a9981612aad565b5f8281525f805160206138e3833981519152602052604081206002015481905f805160206138c383398151915290600160801b90046001600160401b03166123c3858261263b565b5f6123cd87612abe565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241d8a858b611074565b6040518263ffffffff1660e01b81526004016124399190612fcc565b6020604051808303815f875af1158015612455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124799190612fde565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124df6020820182612d34565b63ffffffff161580156124ff57506124fa6020820182612ff5565b151590505b15612546576125116020820182612d34565b61251e6020830183612ff5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6125536020820182612ff5565b90506125626020830183612d34565b63ffffffff16111561257b576125116020820182612d34565b60015b61258b6020830183612ff5565b9050811015610a99576125a16020830183612ff5565b6125ac6001846134e0565b8181106125bb576125bb61303a565b90506020020160208101906125d09190612ef9565b6001600160a01b03166125e66020840184612ff5565b838181106125f6576125f661303a565b905060200201602081019061260b9190612ef9565b6001600160a01b0316101561263357604051630dbc8d5f60e31b815260040160405180910390fd5b60010161257e565b5f805160206138c38339815191525f6001600160401b03808416908516111561266f5761266883856136c0565b905061267c565b61267984846136c0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806126de5750600184015481516126da916001600160401b03169061331a565b8210155b15612704576001600160401b038316606082015281815260408101516020820152612723565b828160600181815161271691906136e0565b6001600160401b03169052505b6060810151612733906064613700565b602082015160018601546001600160401b03929092169161275e9190600160401b900460ff1661334f565b101561278e57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516127a9919061331a565b9052506040810180516001600160401b03871691906127c99083906134e0565b905250600184015460408201516064916127ee91600160401b90910460ff169061334f565b1015612815578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146128875760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986128c8988a98600198929792969095909490939092910161372b565b60405160208183030381529060405290505f5b8460800151602001515181101561293a578185608001516020015182815181106129075761290761303a565b60200260200101516040516020016129209291906137e5565b60408051601f1981840301815291905291506001016128db565b5060a084015180516020918201515160405161295a93859392910161381b565b60405160208183030381529060405290505f5b8460a0015160200151518110156129cc57818560a001516020015182815181106129995761299961303a565b60200260200101516040516020016129b29291906137e5565b60408051601f19818403018152919052915060010161296d565b5060c08401516040516129e3918391602001613856565b6040516020818303038152906040529050600281604051612a0491906131eb565b602060405180830381855afa158015612a1f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a429190612fde565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8657604051631afcd79f60e31b815260040160405180910390fd5b612a9c612a4b565b612aa4612b33565b61101681612b3b565b612ab5612a4b565b61101681612c23565b5f8181525f805160206138e38339815191526020526040812060020180545f805160206138c38339815191529190600890612b0890600160401b90046001600160401b0316613887565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a86612a4b565b612b43612a4b565b80355f805160206138c38339815191529081556014612b6860608401604085016138a2565b60ff161180612b875750612b8260608301604084016138a2565b60ff16155b15612bbb57612b9c60608301604084016138a2565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612bcb60608301604084016138a2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612bfc6040830160208401613535565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fe4612a4b565b508054612c3790612f86565b5f825580601f10612c46575050565b601f0160209004905f5260205f20908101906110169190612c9f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612cb3575f8155600101612ca0565b5090565b5f60208284031215612cc7575f80fd5b5035919050565b803563ffffffff81168114612ce1575f80fd5b919050565b5f8060408385031215612cf7575f80fd5b82356001600160401b03811115612d0c575f80fd5b830160808186031215612d1d575f80fd5b9150612d2b60208401612cce565b90509250929050565b5f60208284031215612d44575f80fd5b610ab082612cce565b80356001600160401b0381168114612ce1575f80fd5b5f8060408385031215612d74575f80fd5b82356001600160401b03811115612d89575f80fd5b830160a08186031215612d9a575f80fd5b9150612d2b60208401612d4d565b6001600160a01b0381168114611016575f80fd5b5f808284036080811215612dce575f80fd5b6060811215612ddb575f80fd5b508291506060830135612ded81612da8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612e2857634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612e46578181015183820152602001612e2e565b50505f910152565b5f8151808452612e65816020860160208601612e2c565b601f01601f19169290920160200192915050565b60208152612e8b602082018351612e0c565b5f602083015160e06040840152612ea6610100840182612e4e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612f09575f80fd5b8135612f1481612da8565b9392505050565b5f8060208385031215612f2c575f80fd5b82356001600160401b0380821115612f42575f80fd5b818501915085601f830112612f55575f80fd5b813581811115612f63575f80fd5b866020828501011115612f74575f80fd5b60209290920196919550909350505050565b600181811c90821680612f9a57607f821691505b602082108103612fb857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ab38284612e0c565b602081525f610ab06020830184612e4e565b5f60208284031215612fee575f80fd5b5051919050565b5f808335601e1984360301811261300a575f80fd5b8301803591506001600160401b03821115613023575f80fd5b6020019150600581901b36038213156124cb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613062575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130a2576130a261306c565b60405290565b604080519081016001600160401b03811182821017156130a2576130a261306c565b604051601f8201601f191681016001600160401b03811182821017156130f2576130f261306c565b604052919050565b5f6001600160401b038211156131125761311261306c565b50601f01601f191660200190565b5f82601f83011261312f575f80fd5b813561314261313d826130fa565b6130ca565b818152846020838601011115613156575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215613182575f80fd5b61318a613080565b82356001600160401b03808211156131a0575f80fd5b6131ac36838701613120565b835260208501359150808211156131c1575f80fd5b506131ce36828601613120565b6020830152506131e060408401612d4d565b604082015292915050565b5f8251613062818460208701612e2c565b601f821115610a5c57805f5260205f20601f840160051c810160208510156132215750805b601f840160051c820191505b81811015613240575f815560010161322d565b5050505050565b81516001600160401b038111156132605761326061306c565b6132748161326e8454612f86565b846131fc565b602080601f8311600181146132a7575f84156132905750858301515b5f19600386901b1c1916600185901b1785556132fe565b5f85815260208120601f198616915b828110156132d5578886015182559484019460019091019084016132b6565b50858210156132f257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ab357610ab3613306565b5f63ffffffff80831681810361334557613345613306565b6001019392505050565b8082028115828204841417610ab357610ab3613306565b5f60208083525f845461337881612f86565b806020870152604060018084165f811461339957600181146133b5576133e2565b60ff19851660408a0152604084151560051b8a010195506133e2565b895f5260205f205f5b858110156133d95781548b82018601529083019088016133be565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612ce1575f80fd5b5f806040838503121561341f575f80fd5b82516001600160401b0380821115613435575f80fd5b9084019060608287031215613448575f80fd5b613450613080565b8251815260208084015161346381612da8565b82820152604084015183811115613478575f80fd5b80850194505087601f85011261348c575f80fd5b8351925061349c61313d846130fa565b83815288828587010111156134af575f80fd5b6134be84838301848801612e2c565b806040840152508195506134d38188016133ff565b9450505050509250929050565b81810381811115610ab357610ab3613306565b5f808335601e19843603018112613508575f80fd5b8301803591506001600160401b03821115613521575f80fd5b6020019150368190038213156124cb575f80fd5b5f60208284031215613545575f80fd5b610ab082612d4d565b5f885161355f818460208d01612e2c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112613062575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215613609575f80fd5b6136116130a8565b61361a83612cce565b81526020808401356001600160401b0380821115613636575f80fd5b9085019036601f830112613648575f80fd5b81358181111561365a5761365a61306c565b8060051b915061366b8483016130ca565b8181529183018401918481019036841115613684575f80fd5b938501935b838510156136ae578435925061369e83612da8565b8282529385019390850190613689565b94860194909452509295945050505050565b6001600160401b038281168282160390808211156111d2576111d2613306565b6001600160401b038181168382160190808211156111d2576111d2613306565b6001600160401b0381811683821602808216919082811461372357613723613306565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161377181602a850160208b01612e2c565b86519083019061378881602a840160208b01612e2c565b60c087901b6001600160c01b031916602a92909101918201526137ba603282018660e01b6001600160e01b0319169052565b6137d3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516137f6818460208801612e2c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161382c818460208901612e2c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351613867818460208801612e2c565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361334557613345613306565b5f602082840312156138b2575f80fd5b813560ff81168114612f14575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051613ae7380380613ae783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61399a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612c20565b610312565b005b610149610159366004612c4f565b610529565b61014961016c366004612c9d565b610a5b565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612c20565b610a69565b6040516001600160401b03909116815260200161018a565b610149610a7d565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612c20565b610a90565b6101cd61025a366004612ccc565b610aa5565b61014961026d366004612c9d565b610ac1565b6102216005600160991b0181565b6101cd5f8051602061394e83398151915281565b6101496102a2366004612c20565b610c4a565b6101e3601481565b6101496102bd366004612d25565b610d87565b6102d56102d0366004612c20565b610e95565b60405161018a9190612de2565b6101a66202a30081565b6101496102fa366004612e62565b610fe4565b6101cd61030d366004612e84565b611021565b5f8181525f8051602061396e8339815191526020526040808220815160e0810190925280545f8051602061394e83398151915293929190829060ff16600581111561035f5761035f612d61565b600581111561037057610370612d61565b815260200160018201805461038490612eef565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612eef565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612d61565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f61107c565b6040518263ffffffff1660e01b81526004016104e39190612f35565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612f47565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061394e8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612f47565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612e62565b6001600160a01b03161461065f5761063a6060840160408501612e62565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612f5e565b905090505f805b828163ffffffff161015610955575f6106906060880188612f5e565b8363ffffffff168181106106a6576106a6612fa3565b90506020028101906106b89190612fb7565b6106c190613178565b80516040519192505f9160088801916106d991613183565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612f35565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291613183565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612f47565b90508086600801835f01516040516107a89190613183565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612d61565b02179055506020820151600182019061084390826131df565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e89116856132b2565b82516040519195506108f991613183565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e906132c5565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff16836132e7565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110cb565b604001516111e1565b90505f6109c56109c088613320565b61136e565b90505f6002826040516109d89190613183565b602060405180830381855afa1580156109f3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a169190612f47565b9050828114610a4257604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a64816114a9565b505050565b5f610a7382610e95565b6080015192915050565b610a856117e7565b610a8e5f611842565b565b610a986117e7565b610aa1816118b2565b5050565b5f610aae6117e7565b610ab88383611b96565b90505b92915050565b5f8051602061394e8339815191525f80610ae6610add856110cb565b6040015161210e565b9150915080610b0c57604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b2690612eef565b90505f03610b4a5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b7057610b70612d61565b14610ba3575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b5f8281526006840160205260408120610bbb91612b94565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061394e8339815191529190610c9190612eef565b90505f03610cb55760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cdb57610cdb612d61565b14610d0e575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d4791906004016133f8565b6020604051808303815f875af1158015610d63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a649190612f47565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dcb5750825b90505f826001600160401b03166001148015610de65750303b155b905081158015610df4575080155b15610e125760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3c57845460ff60401b1916600160401b1785555b610e4687876122ca565b8315610e8c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e9d612bcb565b5f8281525f8051602061396e833981519152602052604090819020815160e0810190925280545f8051602061394e833981519152929190829060ff166005811115610eea57610eea612d61565b6005811115610efb57610efb612d61565b8152602001600182018054610f0f90612eef565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3b90612eef565b8015610f865780601f10610f5d57610100808354040283529160200191610f86565b820191905f5260205f20905b815481529060010190602001808311610f6957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fec6117e7565b6001600160a01b03811661101557604051631e4fbdf760e01b81525f6004820152602401610499565b61101e81611842565b50565b6040515f905f8051602061394e833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08906110649086908690613482565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561112f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261115691908101906134a0565b915091508061117857604051636b2f19e960e01b815260040160405180910390fd5b81511561119e578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111da576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461121657815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b60028110156112655761122d816001613572565b6112389060086132e7565b61ffff1684828151811061124e5761124e612fa3565b016020015160f81c901b9190911790600101611219565b5061ffff81161561128f5760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112ea576112a6816003613572565b6112b19060086132e7565b63ffffffff16856112c38360026132b2565b815181106112d3576112d3612fa3565b016020015160f81c901b9190911790600101611292565b5063ffffffff81161561131057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113655761132781601f613572565b6113329060086132e7565b8661133e8360066132b2565b8151811061134e5761134e612fa3565b016020015160f81c901b9190911790600101611313565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b8360600151518110156111da57818460600151828151811061140a5761140a612fa3565b60200260200101515f0151518560600151838151811061142c5761142c612fa3565b60200260200101515f01518660600151848151811061144d5761144d612fa3565b6020026020010151602001518760600151858151811061146f5761146f612fa3565b60200260200101516040015160405160200161148f959493929190613585565b60408051601f1981840301815291905291506001016113e6565b5f6114b2612bcb565b5f8051602061394e8339815191525f806114ce610add876110cb565b9150915080156114f557604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561152657611526612d61565b600581111561153757611537612d61565b815260200160018201805461154b90612eef565b80601f016020809104026020016040519081016040528092919081815260200182805461157790612eef565b80156115c25780601f10611599576101008083540402835291602001916115c2565b820191905f5260205f20905b8154815290600101906020018083116115a557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561162d5761162d612d61565b1415801561164e575060018151600581111561164b5761164b612d61565b14155b1561166f57805160405163170cc93360e21b81526104999190600401612f27565b60038151600581111561168457611684612d61565b036116925760048152611697565b600581525b8360080181602001516040516116ad9190613183565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156116f1576116f1612d61565b02179055506020820151600182019061170a90826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156117b0576117b0612d61565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118197f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a8e5760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6118ba612bcb565b5f8281525f8051602061396e8339815191526020526040808220815160e0810190925280545f8051602061394e83398151915293929190829060ff16600581111561190757611907612d61565b600581111561191857611918612d61565b815260200160018201805461192c90612eef565b80601f016020809104026020016040519081016040528092919081815260200182805461195890612eef565b80156119a35780601f1061197a576101008083540402835291602001916119a3565b820191905f5260205f20905b81548152906001019060200180831161198657829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611a1157611a11612d61565b14611a44575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611a8857611a88612d61565b021790555060208201516001820190611aa190826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611b3f85826122e4565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611bda57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061394e83398151915242611bf960608601604087016135fe565b6001600160401b0316111580611c335750611c176202a300426132b2565b611c2760608601604087016135fe565b6001600160401b031610155b15611c6d57611c4860608501604086016135fe565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611c82611c7d6060860186613617565b61243b565b611c92611c7d6080860186613617565b6030611ca1602086018661362b565b905014611cd357611cb5602085018561362b565b6040516326475b2f60e11b8152610499925060040190815260200190565b611cdd848061362b565b90505f03611d0a57611cef848061362b565b604051633e08a12560e11b815260040161049992919061366d565b5f60088201611d19868061362b565b604051611d27929190613482565b90815260200160405180910390205414611d6057611d45848061362b565b60405163a41f772f60e01b815260040161049992919061366d565b611d6a835f6125a4565b6040805160e08101909152815481525f908190611e769060208101611d8f898061362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611dd7908a018a61362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611e2060608a0160408b016135fe565b6001600160401b03168152602001611e3b60608a018a613617565b611e449061369b565b8152602001611e5660808a018a613617565b611e5f9061369b565b8152602001876001600160401b03168152506127c7565b5f82815260068601602052604090209193509150611e9482826131df565b508160088401611ea4888061362b565b604051611eb2929190613482565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611eee908590600401612f35565b6020604051808303815f875af1158015611f0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2e9190612f47565b6040805160e081019091529091508060018152602001611f4e898061362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115611fdd57611fdd612d61565b021790555060208201516001820190611ff690826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580612094888061362b565b6040516120a2929190613482565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906120e091906135fe565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80825160271461214457825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b60028110156121935761215b816001613572565b6121669060086132e7565b61ffff1685828151811061217c5761217c612fa3565b016020015160f81c901b9190911790600101612147565b5061ffff8116156121bd5760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b6004811015612218576121d4816003613572565b6121df9060086132e7565b63ffffffff16866121f18360026132b2565b8151811061220157612201612fa3565b016020015160f81c901b91909117906001016121c0565b5063ffffffff811660021461224057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122955761225781601f613572565b6122629060086132e7565b8761226e8360066132b2565b8151811061227e5761227e612fa3565b016020015160f81c901b9190911790600101612243565b505f866026815181106122aa576122aa612fa3565b016020015191976001600160f81b03199092161515965090945050505050565b6122d26129b4565b6122db826129fd565b610aa181612a16565b5f8281525f8051602061396e833981519152602052604081206002015481905f8051602061394e83398151915290600160801b90046001600160401b031661232c85826125a4565b5f61233687612a27565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123868a858b61107c565b6040518263ffffffff1660e01b81526004016123a29190612f35565b6020604051808303815f875af11580156123be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e29190612f47565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124486020820182612c9d565b63ffffffff1615801561246857506124636020820182612f5e565b151590505b156124af5761247a6020820182612c9d565b6124876020830183612f5e565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6124bc6020820182612f5e565b90506124cb6020830183612c9d565b63ffffffff1611156124e45761247a6020820182612c9d565b60015b6124f46020830183612f5e565b9050811015610aa15761250a6020830183612f5e565b612515600184613572565b81811061252457612524612fa3565b90506020020160208101906125399190612e62565b6001600160a01b031661254f6020840184612f5e565b8381811061255f5761255f612fa3565b90506020020160208101906125749190612e62565b6001600160a01b0316101561259c57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016124e7565b5f8051602061394e8339815191525f6001600160401b0380841690851611156125d8576125d1838561374b565b90506125e5565b6125e2848461374b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580612647575060018401548151612643916001600160401b0316906132b2565b8210155b1561266d576001600160401b03831660608201528181526040810151602082015261268c565b828160600181815161267f919061376b565b6001600160401b03169052505b606081015161269c90606461378b565b602082015160018601546001600160401b0392909216916126c79190600160401b900460ff166132e7565b10156126f757606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b03168160400181815161271291906132b2565b9052506040810180516001600160401b0387169190612732908390613572565b9052506001840154604082015160649161275791600160401b90910460ff16906132e7565b101561277e578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146127f05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98612831988a9860019892979296909590949093909291016137b6565b60405160208183030381529060405290505f5b846080015160200151518110156128a35781856080015160200151828151811061287057612870612fa3565b6020026020010151604051602001612889929190613870565b60408051601f198184030181529190529150600101612844565b5060a08401518051602091820151516040516128c39385939291016138a6565b60405160208183030381529060405290505f5b8460a00151602001515181101561293557818560a0015160200151828151811061290257612902612fa3565b602002602001015160405160200161291b929190613870565b60408051601f1981840301815291905291506001016128d6565b5060c084015160405161294c9183916020016138e1565b604051602081830303815290604052905060028160405161296d9190613183565b602060405180830381855afa158015612988573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129ab9190612f47565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8e57604051631afcd79f60e31b815260040160405180910390fd5b612a056129b4565b612a0d612a9c565b61101e81612aa4565b612a1e6129b4565b61101e81612b8c565b5f8181525f8051602061396e8339815191526020526040812060020180545f8051602061394e8339815191529190600890612a7190600160401b90046001600160401b0316613912565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a8e6129b4565b612aac6129b4565b80355f8051602061394e8339815191529081556014612ad1606084016040850161392d565b60ff161180612af05750612aeb606083016040840161392d565b60ff16155b15612b2457612b05606083016040840161392d565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612b34606083016040840161392d565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612b6560408301602084016135fe565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fec6129b4565b508054612ba090612eef565b5f825580601f10612baf575050565b601f0160209004905f5260205f209081019061101e9190612c08565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612c1c575f8155600101612c09565b5090565b5f60208284031215612c30575f80fd5b5035919050565b803563ffffffff81168114612c4a575f80fd5b919050565b5f8060408385031215612c60575f80fd5b82356001600160401b03811115612c75575f80fd5b830160808186031215612c86575f80fd5b9150612c9460208401612c37565b90509250929050565b5f60208284031215612cad575f80fd5b610ab882612c37565b80356001600160401b0381168114612c4a575f80fd5b5f8060408385031215612cdd575f80fd5b82356001600160401b03811115612cf2575f80fd5b830160a08186031215612d03575f80fd5b9150612c9460208401612cb6565b6001600160a01b038116811461101e575f80fd5b5f808284036080811215612d37575f80fd5b6060811215612d44575f80fd5b508291506060830135612d5681612d11565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612d9157634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612daf578181015183820152602001612d97565b50505f910152565b5f8151808452612dce816020860160208601612d95565b601f01601f19169290920160200192915050565b60208152612df4602082018351612d75565b5f602083015160e06040840152612e0f610100840182612db7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612e72575f80fd5b8135612e7d81612d11565b9392505050565b5f8060208385031215612e95575f80fd5b82356001600160401b0380821115612eab575f80fd5b818501915085601f830112612ebe575f80fd5b813581811115612ecc575f80fd5b866020828501011115612edd575f80fd5b60209290920196919550909350505050565b600181811c90821680612f0357607f821691505b602082108103612f2157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610abb8284612d75565b602081525f610ab86020830184612db7565b5f60208284031215612f57575f80fd5b5051919050565b5f808335601e19843603018112612f73575f80fd5b8301803591506001600160401b03821115612f8c575f80fd5b6020019150600581901b3603821315612434575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612fcb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561300b5761300b612fd5565b60405290565b604051608081016001600160401b038111828210171561300b5761300b612fd5565b604080519081016001600160401b038111828210171561300b5761300b612fd5565b604051601f8201601f191681016001600160401b038111828210171561307d5761307d612fd5565b604052919050565b5f6001600160401b0382111561309d5761309d612fd5565b50601f01601f191660200190565b5f82601f8301126130ba575f80fd5b81356130cd6130c882613085565b613055565b8181528460208386010111156130e1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060828403121561310d575f80fd5b613115612fe9565b905081356001600160401b038082111561312d575f80fd5b613139858386016130ab565b8352602084013591508082111561314e575f80fd5b5061315b848285016130ab565b60208301525061316d60408301612cb6565b604082015292915050565b5f610abb36836130fd565b5f8251612fcb818460208701612d95565b601f821115610a6457805f5260205f20601f840160051c810160208510156131b95750805b601f840160051c820191505b818110156131d8575f81556001016131c5565b5050505050565b81516001600160401b038111156131f8576131f8612fd5565b61320c816132068454612eef565b84613194565b602080601f83116001811461323f575f84156132285750858301515b5f19600386901b1c1916600185901b178555613296565b5f85815260208120601f198616915b8281101561326d5788860151825594840194600190910190840161324e565b508582101561328a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610abb57610abb61329e565b5f63ffffffff8083168181036132dd576132dd61329e565b6001019392505050565b8082028115828204841417610abb57610abb61329e565b5f6001600160401b0382111561331657613316612fd5565b5060051b60200190565b5f60808236031215613330575f80fd5b613338613011565b8235815260208084013581830152604084013561335481612d11565b604083015260608401356001600160401b0380821115613372575f80fd5b9085019036601f830112613384575f80fd5b81356133926130c8826132fe565b81815260059190911b830184019084810190368311156133b0575f80fd5b8585015b838110156133e6578035858111156133ca575f80fd5b6133d83689838a01016130fd565b8452509186019186016133b4565b50606087015250939695505050505050565b5f60208083525f845461340a81612eef565b806020870152604060018084165f811461342b576001811461344757613474565b60ff19851660408a0152604084151560051b8a01019550613474565b895f5260205f205f5b8581101561346b5781548b8201860152908301908801613450565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612c4a575f80fd5b5f80604083850312156134b1575f80fd5b82516001600160401b03808211156134c7575f80fd5b90840190606082870312156134da575f80fd5b6134e2612fe9565b825181526020808401516134f581612d11565b8282015260408401518381111561350a575f80fd5b80850194505087601f85011261351e575f80fd5b8351925061352e6130c884613085565b8381528882858701011115613541575f80fd5b61355084838301848801612d95565b80604084015250819550613565818801613491565b9450505050509250929050565b81810381811115610abb57610abb61329e565b5f8651613596818460208b01612d95565b60e087901b6001600160e01b03191690830190815285516135be816004840160208a01612d95565b85519101906135d4816004840160208901612d95565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b5f6020828403121561360e575f80fd5b610ab882612cb6565b5f8235603e19833603018112612fcb575f80fd5b5f808335601e19843603018112613640575f80fd5b8301803591506001600160401b03821115613659575f80fd5b602001915036819003821315612434575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156136ab575f80fd5b6136b3613033565b6136bc83612c37565b81526020808401356001600160401b038111156136d7575f80fd5b840136601f8201126136e7575f80fd5b80356136f56130c8826132fe565b81815260059190911b82018301908381019036831115613713575f80fd5b928401925b8284101561373a57833561372b81612d11565b82529284019290840190613718565b938501939093525091949350505050565b6001600160401b038281168282160390808211156111da576111da61329e565b6001600160401b038181168382160190808211156111da576111da61329e565b6001600160401b038181168382160280821691908281146137ae576137ae61329e565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516137fc81602a850160208b01612d95565b86519083019061381381602a840160208b01612d95565b60c087901b6001600160c01b031916602a9290910191820152613845603282018660e01b6001600160e01b0319169052565b61385e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351613881818460208801612d95565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516138b7818460208901612d95565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516138f2818460208801612d95565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b038083168181036132dd576132dd61329e565b5f6020828403121561393d575f80fd5b813560ff81168114612e7d575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 638762bcc..b57d14ae9 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -629,6 +629,7 @@ abstract contract PoSValidatorManager is } else if (validator.status == ValidatorStatus.Active) { delegationEndTime = uint64(block.timestamp); } else { + // Should be unreachable. revert InvalidValidatorStatus(validator.status); } @@ -663,6 +664,7 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(delegator.validationID); if (validator.messageNonce == 0) { + // Should be unreachable. revert InvalidDelegationID(delegationID); } diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index a96100814..3942a3b1d 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -9,18 +9,13 @@ import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; -import { - ValidatorManagerSettings, - ValidatorRegistrationInput, - IValidatorManager -} from "../interfaces/IValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ValidatorRegistrationInput, IValidatorManager} from "../interfaces/IValidatorManager.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; import {IERC20Mintable} from "../interfaces/IERC20Mintable.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; +import {Initializable} from "@openzeppelin/contracts@5.0.2/proxy/utils/Initializable.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { @@ -38,28 +33,30 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initializeValidatorSet(_defaultSubnetConversionData(), 0); } + function testDisableInitialization() public { + app = new ERC20TokenStakingManager(ICMInitializable.Disallowed); + vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); + app.initialize(defaultPoSSettings, token); + } + + function testZeroTokenAddress() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert( + abi.encodeWithSelector( + ERC20TokenStakingManager.InvalidTokenAddress.selector, address(0) + ) + ); + app.initialize(defaultPoSSettings, IERC20Mintable(address(0))); + } + function testZeroMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: 0, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); + + defaultPoSSettings.minimumDelegationFeeBips = 0; + app.initialize(defaultPoSSettings, token); } function testMaxMinimumDelegationFee() public { @@ -70,23 +67,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidDelegationFee.selector, minimumDelegationFeeBips ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: minimumDelegationFeeBips, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); + + defaultPoSSettings.minimumDelegationFeeBips = minimumDelegationFeeBips; + app.initialize(defaultPoSSettings, token); } function testInvalidStakeAmountRange() public { @@ -96,23 +79,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); + + defaultPoSSettings.minimumStakeAmount = DEFAULT_MAXIMUM_STAKE_AMOUNT; + defaultPoSSettings.maximumStakeAmount = DEFAULT_MINIMUM_STAKE_AMOUNT; + app.initialize(defaultPoSSettings, token); } function testZeroMaxStakeMultiplier() public { @@ -120,50 +90,22 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: 0, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); + + defaultPoSSettings.maximumStakeMultiplier = 0; + app.initialize(defaultPoSSettings, token); } function testMinStakeDurationTooLow() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - uint64 minStakeDuration = DEFAULT_CHURN_PERIOD - 1; + uint64 minimumStakeDuration = DEFAULT_CHURN_PERIOD - 1; vm.expectRevert( abi.encodeWithSelector( - PoSValidatorManager.InvalidMinStakeDuration.selector, minStakeDuration + PoSValidatorManager.InvalidMinStakeDuration.selector, minimumStakeDuration ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: minStakeDuration, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); + + defaultPoSSettings.minimumStakeDuration = minimumStakeDuration; + app.initialize(defaultPoSSettings, token); } function testMaxStakeMultiplierOverLimit() public { @@ -174,23 +116,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeMultiplier.selector, maximumStakeMultiplier ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: maximumStakeMultiplier, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); + + defaultPoSSettings.maximumStakeMultiplier = maximumStakeMultiplier; + app.initialize(defaultPoSSettings, token); } function testZeroWeightToValueFactor() public { @@ -198,23 +126,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: 0, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); + + defaultPoSSettings.weightToValueFactor = 0; + app.initialize(defaultPoSSettings, token); } function testInvalidValidatorMinStakeDuration() public { @@ -302,23 +216,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: rewardCalculator - }), - token - ); + + defaultPoSSettings.rewardCalculator = rewardCalculator; + app.initialize(defaultPoSSettings, token); + validatorManager = app; posValidatorManager = app; diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index adbfb79bb..77e774373 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -8,18 +8,13 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; -import { - ValidatorManagerSettings, - ValidatorRegistrationInput, - IValidatorManager -} from "../interfaces/IValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ValidatorRegistrationInput, IValidatorManager} from "../interfaces/IValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {INativeMinter} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {Initializable} from "@openzeppelin/contracts@5.0.2/proxy/utils/Initializable.sol"; contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { NativeTokenStakingManager public app; @@ -33,27 +28,21 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initializeValidatorSet(_defaultSubnetConversionData(), 0); } + function testDisableInitialization() public { + app = new NativeTokenStakingManager(ICMInitializable.Disallowed); + vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); + + app.initialize(defaultPoSSettings); + } + function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: 0, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); + + defaultPoSSettings.minimumDelegationFeeBips = 0; + app.initialize(defaultPoSSettings); } function testMaxMinimumDelegationFee() public { @@ -64,22 +53,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidDelegationFee.selector, minimumDelegationFeeBips ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: minimumDelegationFeeBips, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); + + defaultPoSSettings.minimumDelegationFeeBips = minimumDelegationFeeBips; + app.initialize(defaultPoSSettings); } function testInvalidStakeAmountRange() public { @@ -89,22 +65,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); + + defaultPoSSettings.minimumStakeAmount = DEFAULT_MAXIMUM_STAKE_AMOUNT; + defaultPoSSettings.maximumStakeAmount = DEFAULT_MINIMUM_STAKE_AMOUNT; + app.initialize(defaultPoSSettings); } function testZeroMaxStakeMultiplier() public { @@ -112,22 +76,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: 0, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); + + defaultPoSSettings.maximumStakeMultiplier = 0; + app.initialize(defaultPoSSettings); } function testMaxStakeMultiplierOverLimit() public { @@ -138,22 +89,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidStakeMultiplier.selector, maximumStakeMultiplier ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: maximumStakeMultiplier, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); + + defaultPoSSettings.maximumStakeMultiplier = maximumStakeMultiplier; + app.initialize(defaultPoSSettings); } function testZeroWeightToValueFactor() public { @@ -161,22 +99,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert( abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: 0, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); + + defaultPoSSettings.weightToValueFactor = 0; + app.initialize(defaultPoSSettings); } function testMinStakeDurationTooLow() public { @@ -187,22 +112,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManager.InvalidMinStakeDuration.selector, minStakeDuration ) ); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: minStakeDuration, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); + + defaultPoSSettings.minimumStakeDuration = minStakeDuration; + app.initialize(defaultPoSSettings); } // Helpers @@ -269,22 +181,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: rewardCalculator - }) - ); + + defaultPoSSettings.rewardCalculator = rewardCalculator; + app.initialize(defaultPoSSettings); + validatorManager = app; posValidatorManager = app; return app; diff --git a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol index 063bcd6f8..ad106df92 100644 --- a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol @@ -5,17 +5,17 @@ pragma solidity 0.8.25; -import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoAValidatorManager} from "../PoAValidatorManager.sol"; -import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import { ValidatorManagerSettings, ValidatorRegistrationInput, IValidatorManager } from "../interfaces/IValidatorManager.sol"; +import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; -import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {Initializable} from "@openzeppelin/contracts@5.0.2/proxy/utils/Initializable.sol"; contract PoAValidatorManagerTest is ValidatorManagerTest { PoAValidatorManager public app; @@ -31,6 +31,19 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { app.initializeValidatorSet(_defaultSubnetConversionData(), 0); } + function testDisableInitialization() public { + app = new PoAValidatorManager(ICMInitializable.Disallowed); + vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); + app.initialize( + ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + address(this) + ); + } + function testInvalidOwnerRegistration() public { vm.prank(vm.addr(1)); vm.expectRevert( diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 93a5a63cc..db7484a72 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -8,13 +8,20 @@ pragma solidity 0.8.25; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import { + DelegatorStatus, PoSValidatorManagerSettings +} from "../interfaces/IPoSValidatorManager.sol"; import {ValidatorManager} from "../ValidatorManager.sol"; +import { + ValidatorManagerSettings, + ValidatorRegistrationInput, + ValidatorStatus +} from "../interfaces/IValidatorManager.sol"; +import {ValidatorMessages} from "../ValidatorMessages.sol"; import { WarpMessage, IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {ValidatorRegistrationInput, ValidatorStatus} from "../interfaces/IValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); @@ -40,6 +47,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; IRewardCalculator public rewardCalculator; + PoSValidatorManagerSettings public defaultPoSSettings = PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, + rewardCalculator: IRewardCalculator(address(0)) + }); + + ValidatorRegistrationInput public defaultRegistrationInput = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationExpiry: DEFAULT_EXPIRY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER + }); + event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); event DelegatorAdded( @@ -72,13 +102,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event UptimeUpdated(bytes32 indexed validationID, uint64 uptime); function testDelegationFeeBipsTooLow() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidDelegationFee.selector, @@ -86,7 +109,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT @@ -94,13 +117,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testDelegationFeeBipsTooHigh() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; vm.expectRevert( abi.encodeWithSelector( @@ -109,7 +125,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, delegationFeeBips, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT @@ -117,13 +133,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInvalidMinStakeDuration() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidMinStakeDuration.selector, @@ -131,7 +140,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, DEFAULT_MINIMUM_STAKE_AMOUNT @@ -139,20 +148,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testStakeAmountTooLow() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 @@ -160,20 +162,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testStakeAmountTooHigh() public { - ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ - nodeID: DEFAULT_NODE_ID, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationExpiry: DEFAULT_EXPIRY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER - }); vm.expectRevert( abi.encodeWithSelector( PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 ) ); _initializeValidatorRegistration( - registrationInput, + defaultRegistrationInput, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 @@ -195,7 +190,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); _mockGetUptimeWarpMessage(new bytes(0), false); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert(ValidatorManager.InvalidWarpMessage.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -205,7 +200,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetUptimeWarpMessage(new bytes(0), true); _mockGetBlockchainID(posValidatorManager.P_CHAIN_BLOCKCHAIN_ID()); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert( abi.encodeWithSelector( ValidatorManager.InvalidWarpSourceChainID.selector, DEFAULT_SOURCE_BLOCKCHAIN_ID @@ -234,7 +229,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert( abi.encodeWithSelector( ValidatorManager.InvalidWarpOriginSenderAddress.selector, address(this) @@ -263,7 +258,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); vm.expectRevert( abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, validationID) ); @@ -550,15 +545,50 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); - _initializeEndDelegationValidatorActiveWithChecks({ - validationID: validationID, - sender: DEFAULT_DELEGATOR_ADDRESS, + _completeDefaultDelegator(validationID, delegationID); + } + + function testClaimDelegationFeesInvalidValidatorStatus() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _completeDefaultDelegator(validationID, delegationID); + + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.Active + ) + ); + + posValidatorManager.claimDelegationFees(validationID); + } + + function testClaimDelegationFeesInvalidSender() public { + bytes32 validationID = _registerDefaultValidator(); + _registerDefaultDelegator(validationID); + + _endDefaultValidatorWithChecks(validationID, 2); + + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.UnauthorizedOwner.selector, address(123)) + ); + + vm.prank(address(123)); + posValidatorManager.claimDelegationFees(validationID); + } + + function testClaimDelegationFees() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _endDefaultValidatorWithChecks(validationID, 2); + + // Validator is Completed, so this will also complete the delegation. + _initializeEndDelegation({ + sender: address(this), delegationID: delegationID, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2, - includeUptime: true, + endDelegationTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: false, force: false }); @@ -566,21 +596,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); - _completeEndDelegationWithChecks({ - validationID: validationID, - delegationID: delegationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, - delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedTotalReward: expectedTotalReward, - delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, - validatorWeight: DEFAULT_WEIGHT, - expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 - }); + _expectRewardIssuance( + address(this), expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000 + ); + posValidatorManager.claimDelegationFees(validationID); } // Delegator registration is not allowed when Validator is pending removed. @@ -590,7 +613,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation({ validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, expectedNonce: 1, includeUptime: true, force: false @@ -621,7 +644,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 1 }); - uint64 validatorEndTime = DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; + uint64 validatorEndTime = DEFAULT_COMPLETION_TIMESTAMP; _initializeEndValidation({ validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, @@ -647,7 +670,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation({ validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, expectedNonce: 1, includeUptime: true, force: false @@ -692,20 +715,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { force: false }); - uint256 expectedTotalReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: validationEndTime - DEFAULT_REGISTRATION_TIMESTAMP - }); - _completeEndDelegationWithChecks({ validationID: validationID, delegationID: delegationID, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedTotalReward: expectedTotalReward, + expectedTotalReward: _defaultDelegatorExpectedTotalReward(), delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: 0, @@ -715,7 +730,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testInitializeDelegatorRegistrationValidatorCompleted() public { bytes32 validationID = _registerDefaultValidator(); - _endDefaultValidator(validationID, 1); + _endDefaultValidatorWithChecks(validationID, 1); _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); @@ -734,7 +749,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); - _endDefaultValidator(validationID, 2); + _endDefaultValidatorWithChecks(validationID, 2); // completeDelegatorRegistration should fall through to _completeEndDelegation and refund the stake vm.expectEmit(true, true, true, true, address(validatorManager)); @@ -758,7 +773,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); - _endDefaultValidator(validationID, 2); + _endDefaultValidatorWithChecks(validationID, 2); uint64 delegationEndTime = DEFAULT_COMPLETION_TIMESTAMP + 1; @@ -811,17 +826,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { force: false }); - _endDefaultValidator(validationID, 3); + _endDefaultValidatorWithChecks(validationID, 3); - uint256 expectedTotalReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP - }); + uint256 expectedTotalReward = _defaultDelegatorExpectedTotalReward(); - uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedValidatorFees = (expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS) / 10000; uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; vm.expectEmit(true, true, true, true, address(posValidatorManager)); @@ -952,13 +961,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { force: false }); - uint256 expectedTotalReward = rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, - stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP - }); + uint256 expectedTotalReward = _defaultDelegatorExpectedTotalReward(); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) _completeEndDelegationWithChecks({ @@ -1023,8 +1026,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Submit an uptime proof via submitUptime uint64 uptimePercentage1 = 80; - uint64 uptime1 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) - * uptimePercentage1 / 100; + uint64 uptime1 = ( + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage1 + ) / 100; bytes memory uptimeMsg1 = ValidatorMessages.packValidationUptimeMessage(validationID, uptime1); _mockGetUptimeWarpMessage(uptimeMsg1, true); @@ -1037,8 +1041,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Submit a second uptime proof via initializeEndValidation. This one is not sufficient for rewards // Submit an uptime proof via submitUptime uint64 uptimePercentage2 = 79; - uint64 uptime2 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) - * uptimePercentage2 / 100; + uint64 uptime2 = ( + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage2 + ) / 100; bytes memory uptimeMsg2 = ValidatorMessages.packValidationUptimeMessage(validationID, uptime2); _mockGetUptimeWarpMessage(uptimeMsg2, true); @@ -1052,6 +1057,36 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation(validationID, true); } + function testInitializeEndValidationWithoutNewUptime() public { + bytes32 validationID = _registerDefaultValidator(); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + + // Submit an uptime proof via submitUptime + uint64 uptimePercentage1 = 80; + uint64 uptime1 = ( + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage1 + ) / 100; + bytes memory uptimeMsg1 = + ValidatorMessages.packValidationUptimeMessage(validationID, uptime1); + _mockGetUptimeWarpMessage(uptimeMsg1, true); + _mockGetBlockchainID(); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit UptimeUpdated(validationID, uptime1); + posValidatorManager.submitUptimeProof(validationID, 0); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidatorRemovalInitialized( + validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + ); + + _initializeEndValidation(validationID, false); + } + function testInitializeEndValidationInsufficientUptime() public { bytes32 validationID = _registerDefaultValidator(); uint64 uptimePercentage = 79; @@ -1063,7 +1098,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, - (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ((DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage) + / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); @@ -1077,19 +1113,267 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation(validationID, true); } - function testInitializeEndValidationPoAValidator() public { + function testSubmitUptimeProofPoaValidator() public { bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorNotPoS.selector, defaultInitialValidationID + ) + ); + posValidatorManager.submitUptimeProof(defaultInitialValidationID, 0); + } + + function testSubmitUptimeProofInactiveValidator() public { + bytes32 validationID = _registerDefaultValidator(); + + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 1, + includeUptime: true, + force: false + }); + + _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.PendingRemoved + ) + ); + posValidatorManager.submitUptimeProof(validationID, 0); + } + + function testEndValidationPoAValidator() public { + bytes32 validationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSubnetValidatorWeightMessage(defaultInitialValidationID, 1, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized( - defaultInitialValidationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + ); + + _initializeEndValidation(validationID, false); + + uint256 balanceBefore = _getStakeAssetBalance(address(this)); + + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + + posValidatorManager.completeEndValidation(0); + + assertEq(_getStakeAssetBalance(address(this)), balanceBefore); + } + + function testDelegationToPoAValidator() public { + bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); + + _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorNotPoS.selector, defaultInitialValidationID + ) + ); + + _initializeDelegatorRegistration( + defaultInitialValidationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT + ); + } + + function testDelegationOverWeightLimit() public { + bytes32 validationID = _registerDefaultValidator(); + + uint64 delegatorWeight = DEFAULT_WEIGHT * DEFAULT_MAXIMUM_STAKE_MULTIPLIER + 1; + + _beforeSend(_weightToValue(delegatorWeight), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.MaxWeightExceeded.selector, delegatorWeight + DEFAULT_WEIGHT + ) + ); + + _initializeDelegatorRegistration(validationID, DEFAULT_DELEGATOR_ADDRESS, delegatorWeight); + } + + function testCompleteDelegatorRegistrationAlreadyRegistered() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.Active + ) + ); + + posValidatorManager.completeDelegatorRegistration(0, delegationID); + } + + function testCompleteDelegatorRegistrationWrongValidationID() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( + delegationID, 2, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + ); + _mockGetPChainWarpMessage(setValidatorWeightPayload, true); + + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, validationID) + ); + + vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); + posValidatorManager.completeDelegatorRegistration(0, delegationID); + } + + function testCompleteEndDelegationWrongValidationID() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + sender: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: false + }); + + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSubnetValidatorWeightMessage(delegationID, 2, DEFAULT_WEIGHT); + _mockGetPChainWarpMessage(setValidatorWeightPayload, true); + + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, delegationID) + ); + + posValidatorManager.completeEndDelegation(0, delegationID); + } + + function testInitializeEndDelegationNotRegistered() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.PendingAdded + ) + ); + + posValidatorManager.initializeEndDelegation(delegationID, true, 0); + } + + function testInitializeEndDelegationWrongSender() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.UnauthorizedOwner.selector, address(123)) + ); + + vm.prank(address(123)); + posValidatorManager.initializeEndDelegation(delegationID, true, 0); + } + + function testCompleteDelegatorRegistrationForDelegatorRegisteredWhileValidatorPendingRemoved() + public + { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 2, + includeUptime: true, + force: false + }); + + _setUpCompleteDelegatorRegistrationWithChecks( + validationID, delegationID, DEFAULT_COMPLETION_TIMESTAMP + 1, 0, 2 + ); + + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + }); + + _completeEndValidationWithChecks({ + validationID: validationID, + validatorOwner: address(this), + expectedReward: expectedReward, + validatorWeight: DEFAULT_WEIGHT + }); + + _expectStakeUnlock(DEFAULT_DELEGATOR_ADDRESS, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); + posValidatorManager.initializeEndDelegation(delegationID, true, 0); + } + + function testCompleteEndDelegationWhileActive() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.Active + ) + ); + + posValidatorManager.completeEndDelegation(0, delegationID); + } + + function testCompleteDelegatorRegistrationValidatorPendingRemoved() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 2, + includeUptime: true, + force: false + }); + + _setUpCompleteDelegatorRegistrationWithChecks( + validationID, delegationID, DEFAULT_COMPLETION_TIMESTAMP + 1, 0, 2 + ); + + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.PendingRemoved + ) + ); + + posValidatorManager.initializeEndDelegation(delegationID, false, 0); + } + + function testResendEndDelegationWhileActive() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegatorStatus.selector, DelegatorStatus.Active + ) ); - _initializeEndValidation(defaultInitialValidationID, false); + posValidatorManager.resendUpdateDelegation(delegationID); } function testForceInitializeEndValidation() public { @@ -1115,7 +1399,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, - (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ((DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage) + / 100 ); _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); @@ -1311,6 +1596,34 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + function _completeDefaultDelegator(bytes32 validationID, bytes32 delegationID) internal { + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + sender: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: false + }); + + uint256 expectedTotalReward = _defaultDelegatorExpectedTotalReward(); + + _completeEndDelegationWithChecks({ + validationID: validationID, + delegationID: delegationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedTotalReward: expectedTotalReward, + delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); + } + function _registerDelegator( bytes32 validationID, address delegatorAddress, @@ -1414,6 +1727,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } } + function _endDefaultValidatorWithChecks(bytes32 validationID, uint64 expectedNonce) internal { + _endValidationWithChecks({ + validationID: validationID, + validatorOwner: address(this), + completeRegistrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + validatorWeight: DEFAULT_WEIGHT, + expectedNonce: expectedNonce + }); + } + function _endDefaultValidator(bytes32 validationID, uint64 expectedNonce) internal { _endValidationWithChecks({ validationID: validationID, @@ -1471,20 +1795,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); _expectRewardIssuance(validatorOwner, expectedReward); - _completeEndValidation(validationID); - - assertEq( - _getStakeAssetBalance(validatorOwner), - balanceBefore + _weightToValue(validatorWeight) + expectedReward - ); - } - - function _completeEndValidation(bytes32 validationID) internal { bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); posValidatorManager.completeEndValidation(0); + + assertEq( + _getStakeAssetBalance(validatorOwner), + balanceBefore + _weightToValue(validatorWeight) + expectedReward + ); } function _completeEndDelegationWithChecks( @@ -1498,7 +1818,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 expectedValidatorWeight, uint64 expectedNonce ) internal { - uint256 expectedValidatorFees = expectedTotalReward * delegationFeeBips / 10000; + uint256 expectedValidatorFees = (expectedTotalReward * delegationFeeBips) / 10000; uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; vm.expectEmit(true, true, true, true, address(posValidatorManager)); @@ -1536,4 +1856,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _getStakeAssetBalance(address account) internal virtual returns (uint256); function _expectStakeUnlock(address account, uint256 amount) internal virtual; function _expectRewardIssuance(address account, uint256 amount) internal virtual; + + function _defaultDelegatorExpectedTotalReward() internal view returns (uint256) { + return rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + }); + } } From 1a643f7815f13c465dde09c4f0b0d8f26556bf17 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 10:16:56 -0400 Subject: [PATCH 04/10] Revert change --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/validator-manager/ValidatorMessages.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8f0696093..126411919 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516161ca3803806161ca83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61607d8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615179565b6104b3565b005b6102146102243660046151b4565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615179565b6106f6565b6102146102693660046151cb565b610701565b61021461027c366004615219565b610c33565b61029461028f3660046151b4565b610ca7565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615179565b610d01565b6102146102e936600461523a565b610d0c565b6103016102fc36600461527a565b610dcd565b60405190815260200161023f565b61021461031d3660046152df565b610e02565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d366004615307565b61106d565b6102946103603660046151b4565b6110a4565b6103015f81565b61021461037a366004615179565b6110b8565b610231603081565b6102146103953660046151b4565b6110e3565b6102146103a83660046152df565b6111ae565b6103016103bb366004615320565b611386565b6102146103ce36600461523a565b6113b2565b6103015f80516020615fd183398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046151b4565b61153b565b6103015f80516020615ff183398151915281565b6102146104423660046151b4565b611724565b610231601481565b61046261045d3660046151b4565b611861565b60405161023f91906153b5565b6102946202a30081565b6103015f80516020615fb183398151915281565b61021461049b366004615449565b6119b0565b6103016104ae366004615487565b611a8f565b6104be838383611aea565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160518339815191526020526040808220815160e0810190925280545f80516020615ff183398151915293929190829060ff16600581111561053557610535615340565b600581111561054657610546615340565b815260200160018201805461055a906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906154f2565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615340565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e42565b6040518263ffffffff1660e01b81526004016106b09190615538565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061554a565b50505050565b6106f0838383611aea565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ff18339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba919061554a565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615561565b6001600160a01b031614610837576108126060840160408501615561565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561557c565b905090505f805b828163ffffffff161015610b2d575f610868606088018861557c565b8363ffffffff1681811061087e5761087e6155c1565b905060200281019061089091906155d5565b61089990615796565b80516040519192505f9160088801916108b1916157a1565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da9190600401615538565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a916157a1565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610968919061554a565b90508086600801835f015160405161098091906157a1565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615340565b021790555060208201516001820190610a1b90826157f6565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac09116856158c5565b8251604051919550610ad1916157a1565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906158d8565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836158fa565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e91565b60400151611fa7565b90505f610b9d610b9888615933565b612134565b90505f600282604051610bb091906157a1565b602060405180830381855afa158015610bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610bee919061554a565b9050828114610c1a57604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3c8261226f565b610c5c576040516330efa98b60e01b8152600481018390526024016104da565b5f610c6683611861565b5190506002816005811115610c7d57610c7d615340565b14610c9d578060405163170cc93360e21b81526004016104da919061552a565b6106f083836122aa565b5f805f80516020615fd183398151915260030154610cc59084615a0b565b9050801580610cda57506001600160401b0381115b15610cfb5760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612524565b610d14612710565b5f80516020615fd18339815191525f80610d2d84612747565b91509150610d3a8261226f565b610d4657505050610db4565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d7457610d74615340565b03610d99575f83815260088501602052604081208054919055610d978282612a85565b505b610daf81610daa846040015161106d565b612afb565b505050505b610dca60015f8051602061603183398151915255565b50565b5f610dd6612710565b610de285858585612b31565b9050610dfa60015f8051602061603183398151915255565b949350505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff166003811115610e4f57610e4f615340565b6003811115610e6057610e60615340565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ed682611861565b9050600183516003811115610eed57610eed615340565b14610f0e578251604051633b0d540d60e21b81526104da9190600401615a2a565b600481516005811115610f2357610f23615340565b03610f3957610f3185612d0a565b505050505050565b5f80610f50610f4789611e91565b60400151612ef1565b5091509150818414610f7d57846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fb65750806001600160401b03168560a001516001600160401b0316115b15610fdf57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cfb906001600160401b0384166158fa565b5f6110ae82611861565b6080015192915050565b6110c3838383612524565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615fd18339815191525f6110fb83611861565b519050600481600581111561111257611112615340565b14611132578060405163170cc93360e21b81526004016104da919061552a565b5f8381526005830160205260409020546001600160a01b0316331461117857335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612a85565b6111b6612710565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff16600381111561120357611203615340565b600381111561121457611214615340565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128d5761128d615340565b146112ae578051604051633b0d540d60e21b81526104da9190600401615a2a565b60046112bd8260400151611861565b5160058111156112cf576112cf615340565b14611361575f6112de85611e91565b90505f806112ef8360400151612ef1565b50915091508184604001511461131b5760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135d57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136a83612d0a565b505061138260015f8051602061603183398151915255565b5050565b5f61138f612710565b61139a833384613147565b9050610cfb60015f8051602061603183398151915255565b5f80516020615ff18339815191525f806113d76113ce85611e91565b6040015161341f565b91509150806113fd57604051632d07135360e01b815281151560048201526024016104da565b5f82815260068401602052604090208054611417906154f2565b90505f0361143b5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561146157611461615340565b14611494575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b5f82815260068401602052604081206114ac916150c8565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff16600381111561158857611588615340565b600381111561159957611599615340565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561161257611612615340565b14158015611633575060038151600381111561163057611630615340565b14155b15611654578051604051633b0d540d60e21b81526104da9190600401615a2a565b5f6116628260400151611861565b905080606001516001600160401b03165f03611694576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116c1846040015184606001518560800151611e42565b6040518263ffffffff1660e01b81526004016116dd9190615538565b6020604051808303815f875af11580156116f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171d919061554a565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ff1833981519152919061176b906154f2565b90505f0361178f5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117b5576117b5615340565b146117e8575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118219190600401615a44565b6020604051808303815f875af115801561183d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e3919061554a565b6118696150ff565b5f8281525f80516020616051833981519152602052604090819020815160e0810190925280545f80516020615ff1833981519152929190829060ff1660058111156118b6576118b6615340565b60058111156118c7576118c7615340565b81526020016001820180546118db906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611907906154f2565b80156119525780601f1061192957610100808354040283529160200191611952565b820191905f5260205f20905b81548152906001019060200180831161193557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f9575080546001600160401b03808416911610155b15611a175760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a4284846135db565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615ff1833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611ad29086908690615ace565b90815260200160405180910390205491505092915050565b5f8381525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd18339815191529284929091829060ff166003811115611b3857611b38615340565b6003811115611b4957611b49615340565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bbf82611861565b9050600283516003811115611bd657611bd6615340565b14611bf7578251604051633b0d540d60e21b81526104da9190600401615a2a565b60208301516001600160a01b03163314611c93575f8281526005850160205260409020546001600160a01b03163314611c305733611153565b5f82815260058501602052604090205460a0820151611c5f91600160b01b90046001600160401b031690615add565b6001600160401b0316421015611c935760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca857611ca8615340565b03611dd65760028401546080840151611cca916001600160401b031690615add565b6001600160401b0316421015611cfe5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d1057611d0e82876122aa565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d49918491611d449190615afd565b6135f5565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d8a8461374c565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e3b9350505050565b600481516005811115611deb57611deb615340565b03611e1f57611df98361374c565b5f898152600786016020526040902055611e1288612d0a565b6001945050505050611e3b565b805160405163170cc93360e21b81526104da919060040161552a565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ef5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1c9190810190615b28565b9150915080611f3e57604051636b2f19e960e01b815260040160405180910390fd5b815115611f64578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611fa0576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fdc57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202b57611ff3816001615bfa565b611ffe9060086158fa565b61ffff16848281518110612014576120146155c1565b016020015160f81c901b9190911790600101611fdf565b5061ffff8116156120555760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120b05761206c816003615bfa565b6120779060086158fa565b63ffffffff16856120898360026158c5565b81518110612099576120996155c1565b016020015160f81c901b9190911790600101612058565b5063ffffffff8116156120d657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561212b576120ed81601f615bfa565b6120f89060086158fa565b866121048360066158c5565b81518110612114576121146155c1565b016020015160f81c901b91909117906001016120d9565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015611fa05781846060015182815181106121d0576121d06155c1565b60200260200101515f015151856060015183815181106121f2576121f26155c1565b60200260200101515f015186606001518481518110612213576122136155c1565b60200260200101516020015187606001518581518110612235576122356155c1565b602002602001015160400151604051602001612255959493929190615c0d565b60408051601f1981840301815291905291506001016121ac565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261231c9190810190615b28565b915091508061233e57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612381573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a5919061554a565b8251146123cb578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612407576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061241684604001516138e9565b9150915081871461243d5760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615fd1833981519152906001600160401b0390811690831611156124fa575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612519565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615fd18339815191528161253d86613ada565b90506125488661226f565b61255757600192505050611e3b565b5f8681526005830160205260409020546001600160a01b0316331461257c5733611153565b5f86815260058301602052604090205460a08201516125ab91600160b01b90046001600160401b031690615add565b6001600160401b03168160c001516001600160401b031610156125f25760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f851561260a5761260387866122aa565b9050612628565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061264d9061106d565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126da919061554a565b905080846008015f8a81526020019081526020015f205f8282546126fe91906158c5565b90915550501515979650505050505050565b5f8051602061603183398151915280546001190161274157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127506150ff565b5f80516020615ff18339815191525f8061276c6113ce87611e91565b91509150801561279357604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127c4576127c4615340565b60058111156127d5576127d5615340565b81526020016001820180546127e9906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054612815906154f2565b80156128605780601f1061283757610100808354040283529160200191612860565b820191905f5260205f20905b81548152906001019060200180831161284357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128cb576128cb615340565b141580156128ec57506001815160058111156128e9576128e9615340565b14155b1561290d57805160405163170cc93360e21b81526104da919060040161552a565b60038151600581111561292257612922615340565b036129305760048152612935565b600581525b83600801816020015160405161294b91906157a1565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561298f5761298f615340565b0217905550602082015160018201906129a890826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a4e57612a4e615340565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615fb183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ae0575f80fd5b505af1158015612af2573d5f803e3d5ffd5b50505050505050565b5f80516020615fb183398151915254611382906001600160a01b03168383613dbe565b60015f8051602061603183398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615fd183398151915290600160401b900461ffff9081169086161080612b85575061271061ffff8616115b15612ba957604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612be5576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612bf75750806001015483115b15612c185760405163222d164360e21b8152600481018490526024016104da565b5f612c2284613e1d565b90505f612c2e82610ca7565b90505f612c3b8983613e40565b90506040518060800160405280612c4f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff166003811115612d5757612d57615340565b6003811115612d6857612d68615340565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e96575f84815260058701602052604090205461271090612e4890600160a01b900461ffff16856158fa565b612e529190615a0b565b915081866008015f8681526020019081526020015f205f828254612e7691906158c5565b90915550612e8690508284615bfa565b9050612e96856020015182612a85565b612eab8560200151610daa876060015161106d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f2857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612f7757612f3f816001615bfa565b612f4a9060086158fa565b61ffff16868281518110612f6057612f606155c1565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612fa15760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015612ffc57612fb8816003615bfa565b612fc39060086158fa565b63ffffffff1687612fd58360026158c5565b81518110612fe557612fe56155c1565b016020015160f81c901b9190911790600101612fa4565b5063ffffffff811660031461302457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130795761303b81601f615bfa565b6130469060086158fa565b886130528360066158c5565b81518110613062576130626155c1565b016020015160f81c901b9190911790600101613027565b505f805b60088110156130d857613091816007615bfa565b61309c9060086158fa565b6001600160401b0316896130b18360266158c5565b815181106130c1576130c16155c1565b016020015160f81c901b919091179060010161307d565b505f805b6008811015613137576130f0816007615bfa565b6130fb9060086158fa565b6001600160401b03168a61311083602e6158c5565b81518110613120576131206155c1565b016020015160f81c901b91909117906001016130dc565b5091989097509095509350505050565b5f5f80516020615fd18339815191528161316361028f85613e1d565b90505f61316f87611861565b905061317a8761226f565b61319a576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131af576131af615340565b146131d057805160405163170cc93360e21b81526104da919060040161552a565b5f8282608001516131e19190615add565b905083600201600a9054906101000a90046001600160401b0316826040015161320a9190615c86565b6001600160401b0316816001600160401b0316111561324757604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132538a846135f5565b915091505f8a8360405160200161328192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561331457613314615340565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461345557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134a45761346c816001615bfa565b6134779060086158fa565b61ffff1685828151811061348d5761348d6155c1565b016020015160f81c901b9190911790600101613458565b5061ffff8116156134ce5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613529576134e5816003615bfa565b6134f09060086158fa565b63ffffffff16866135028360026158c5565b81518110613512576135126155c1565b016020015160f81c901b91909117906001016134d1565b5063ffffffff811660021461355157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a65761356881601f615bfa565b6135739060086158fa565b8761357f8360066158c5565b8151811061358f5761358f6155c1565b016020015160f81c901b9190911790600101613554565b505f866026815181106135bb576135bb6155c1565b016020015191976001600160f81b03199092161515965090945050505050565b6135e36143b8565b6135ec82614403565b61138281614477565b5f8281525f80516020616051833981519152602052604081206002015481905f80516020615ff183398151915290600160801b90046001600160401b031661363d85826144df565b5f61364787614702565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136978a858b611e42565b6040518263ffffffff1660e01b81526004016136b39190615538565b6020604051808303815f875af11580156136cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136f3919061554a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615fd183398151915290505f61376c8460400151611861565b90505f60038251600581111561378457613784615340565b14806137a257506004825160058111156137a0576137a0615340565b145b156137b2575060c08101516137ef565b6002825160058111156137c7576137c7615340565b036137d35750426137ef565b815160405163170cc93360e21b81526104da919060040161552a565b84608001516001600160401b0316816001600160401b03161161381657505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061383b9061106d565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156138bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138e0919061554a565b95945050505050565b5f808251602e1461391f57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b600281101561396e57613936816001615bfa565b6139419060086158fa565b61ffff16858281518110613957576139576155c1565b016020015160f81c901b9190911790600101613922565b5061ffff8116156139985760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156139f3576139af816003615bfa565b6139ba9060086158fa565b63ffffffff16866139cc8360026158c5565b815181106139dc576139dc6155c1565b016020015160f81c901b919091179060010161399b565b5063ffffffff811615613a1957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a6e57613a3081601f615bfa565b613a3b9060086158fa565b87613a478360066158c5565b81518110613a5757613a576155c1565b016020015160f81c901b9190911790600101613a1c565b505f805b6008811015613acd57613a86816007615bfa565b613a919060086158fa565b6001600160401b031688613aa68360266158c5565b81518110613ab657613ab66155c1565b016020015160f81c901b9190911790600101613a72565b5090969095509350505050565b613ae26150ff565b5f8281525f805160206160518339815191526020526040808220815160e0810190925280545f80516020615ff183398151915293929190829060ff166005811115613b2f57613b2f615340565b6005811115613b4057613b40615340565b8152602001600182018054613b54906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054613b80906154f2565b8015613bcb5780601f10613ba257610100808354040283529160200191613bcb565b820191905f5260205f20905b815481529060010190602001808311613bae57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c3957613c39615340565b14613c6c575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cb057613cb0615340565b021790555060208201516001820190613cc990826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d6785826135f5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614777565b5f610cfb825f80516020615fb1833981519152546001600160a01b0316906147d8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e8457604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ff183398151915242613ea36060860160408701615307565b6001600160401b0316111580613edd5750613ec16202a300426158c5565b613ed16060860160408701615307565b6001600160401b031610155b15613f1757613ef26060850160408601615307565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f2c613f276060860186615cb1565b614931565b613f3c613f276080860186615cb1565b6030613f4b6020860186615cc5565b905014613f7d57613f5f6020850185615cc5565b6040516326475b2f60e11b81526104da925060040190815260200190565b613f878480615cc5565b90505f03613fb457613f998480615cc5565b604051633e08a12560e11b81526004016104da929190615d07565b5f60088201613fc38680615cc5565b604051613fd1929190615ace565b9081526020016040518091039020541461400a57613fef8480615cc5565b60405163a41f772f60e01b81526004016104da929190615d07565b614014835f6144df565b6040805160e08101909152815481525f90819061412090602081016140398980615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614081908a018a615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140ca60608a0160408b01615307565b6001600160401b031681526020016140e560608a018a615cb1565b6140ee90615d35565b815260200161410060808a018a615cb1565b61410990615d35565b8152602001876001600160401b0316815250614a9a565b5f8281526006860160205260409020919350915061413e82826157f6565b50816008840161414e8880615cc5565b60405161415c929190615ace565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614198908590600401615538565b6020604051808303815f875af11580156141b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d8919061554a565b6040805160e0810190915290915080600181526020016141f88980615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561428757614287615340565b0217905550602082015160018201906142a090826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061433e8880615cc5565b60405161434c929190615ace565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061438a9190615307565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661440157604051631afcd79f60e31b815260040160405180910390fd5b565b61440b6143b8565b61441481614c87565b61441c614ca0565b610dca6060820135608083013561443960c0850160a08601615307565b61444960e0860160c08701615de5565b61445a610100870160e08801615dfe565b61010087013561447261014089016101208a01615561565b614cb0565b61447f6143b8565b5f80516020615fb18339815191526001600160a01b0382166144bf57604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615ff18339815191525f6001600160401b0380841690851611156145135761450c8385615afd565b9050614520565b61451d8484615afd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061458257506001840154815161457e916001600160401b0316906158c5565b8210155b156145a8576001600160401b0383166060820152818152604081015160208201526145c7565b82816060018181516145ba9190615add565b6001600160401b03169052505b60608101516145d7906064615c86565b602082015160018601546001600160401b0392909216916146029190600160401b900460ff166158fa565b101561463257606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b03168160400181815161464d91906158c5565b9052506040810180516001600160401b038716919061466d908390615bfa565b9052506001840154604082015160649161469291600160401b90910460ff16906158fa565b10156146b9578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160518339815191526020526040812060020180545f80516020615ff1833981519152919060089061474c90600160401b90046001600160401b0316615e1e565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61478b6001600160a01b03841683614e6c565b905080515f141580156147af5750808060200190518101906147ad9190615e39565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614842919061554a565b90506148596001600160a01b038516333086614e79565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c1919061554a565b90508181116149275760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6138e08282615bfa565b61493e602082018261523a565b63ffffffff1615801561495e5750614959602082018261557c565b151590505b156149a557614970602082018261523a565b61497d602083018361557c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149b2602082018261557c565b90506149c1602083018361523a565b63ffffffff1611156149da57614970602082018261523a565b60015b6149ea602083018361557c565b905081101561138257614a00602083018361557c565b614a0b600184615bfa565b818110614a1a57614a1a6155c1565b9050602002016020810190614a2f9190615561565b6001600160a01b0316614a45602084018461557c565b83818110614a5557614a556155c1565b9050602002016020810190614a6a9190615561565b6001600160a01b03161015614a9257604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149dd565b5f6060826040015151603014614ac35760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b04988a986001989297929690959094909390929101615e54565b60405160208183030381529060405290505f5b84608001516020015151811015614b7657818560800151602001518281518110614b4357614b436155c1565b6020026020010151604051602001614b5c929190615f0e565b60408051601f198184030181529190529150600101614b17565b5060a0840151805160209182015151604051614b96938593929101615f44565b60405160208183030381529060405290505f5b8460a001516020015151811015614c0857818560a00151602001518281518110614bd557614bd56155c1565b6020026020010151604051602001614bee929190615f0e565b60408051601f198184030181529190529150600101614ba9565b5060c0840151604051614c1f918391602001615f7f565b6040516020818303038152906040529050600281604051614c4091906157a1565b602060405180830381855afa158015614c5b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c7e919061554a565b94909350915050565b614c8f6143b8565b614c97614eb2565b610dca81614eba565b614ca86143b8565b614401614fa2565b614cb86143b8565b5f80516020615fd183398151915261ffff85161580614cdc575061271061ffff8616115b15614d0057604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d245760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d375750600a60ff8516115b15614d5a5760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614dc1576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614de15760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3b83835f614faa565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613deb565b6144016143b8565b614ec26143b8565b80355f80516020615ff18339815191529081556014614ee76060840160408501615dfe565b60ff161180614f065750614f016060830160408401615dfe565b60ff16155b15614f3a57614f1b6060830160408401615dfe565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614f4a6060830160408401615dfe565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f7b6040830160208401615307565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b1e6143b8565b606081471015614fcf5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614fea91906157a1565b5f6040518083038185875af1925050503d805f8114615024576040519150601f19603f3d011682016040523d82523d5f602084013e615029565b606091505b5091509150615039868383615043565b9695505050505050565b606082615058576150538261509f565b611e3b565b815115801561506f57506001600160a01b0384163b155b1561509857604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e3b565b8051156150af5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546150d4906154f2565b5f825580601f106150e3575050565b601f0160209004905f5260205f2090810190610dca919061513c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615150575f815560010161513d565b5090565b8015158114610dca575f80fd5b803563ffffffff81168114615174575f80fd5b919050565b5f805f6060848603121561518b575f80fd5b83359250602084013561519d81615154565b91506151ab60408501615161565b90509250925092565b5f602082840312156151c4575f80fd5b5035919050565b5f80604083850312156151dc575f80fd5b82356001600160401b038111156151f1575f80fd5b830160808186031215615202575f80fd5b915061521060208401615161565b90509250929050565b5f806040838503121561522a575f80fd5b8235915061521060208401615161565b5f6020828403121561524a575f80fd5b611e3b82615161565b803561ffff81168114615174575f80fd5b80356001600160401b0381168114615174575f80fd5b5f805f806080858703121561528d575f80fd5b84356001600160401b038111156152a2575f80fd5b850160a081880312156152b3575f80fd5b93506152c160208601615253565b92506152cf60408601615264565b9396929550929360600135925050565b5f80604083850312156152f0575f80fd5b6152f983615161565b946020939093013593505050565b5f60208284031215615317575f80fd5b611e3b82615264565b5f8060408385031215615331575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061536457615364615340565b9052565b5f5b8381101561538257818101518382015260200161536a565b50505f910152565b5f81518084526153a1816020860160208601615368565b601f01601f19169290920160200192915050565b602081526153c7602082018351615354565b5f602083015160e060408401526153e261010084018261538a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dca575f80fd5b5f8082840361016081121561545c575f80fd5b6101408082121561546b575f80fd5b849350830135905061547c81615435565b809150509250929050565b5f8060208385031215615498575f80fd5b82356001600160401b03808211156154ae575f80fd5b818501915085601f8301126154c1575f80fd5b8135818111156154cf575f80fd5b8660208285010111156154e0575f80fd5b60209290920196919550909350505050565b600181811c9082168061550657607f821691505b60208210810361552457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cfb8284615354565b602081525f611e3b602083018461538a565b5f6020828403121561555a575f80fd5b5051919050565b5f60208284031215615571575f80fd5b8135611e3b81615435565b5f808335601e19843603018112615591575f80fd5b8301803591506001600160401b038211156155aa575f80fd5b6020019150600581901b3603821315613745575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155e9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615629576156296155f3565b60405290565b604051608081016001600160401b0381118282101715615629576156296155f3565b604080519081016001600160401b0381118282101715615629576156296155f3565b604051601f8201601f191681016001600160401b038111828210171561569b5761569b6155f3565b604052919050565b5f6001600160401b038211156156bb576156bb6155f3565b50601f01601f191660200190565b5f82601f8301126156d8575f80fd5b81356156eb6156e6826156a3565b615673565b8181528460208386010111156156ff575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060828403121561572b575f80fd5b615733615607565b905081356001600160401b038082111561574b575f80fd5b615757858386016156c9565b8352602084013591508082111561576c575f80fd5b50615779848285016156c9565b60208301525061578b60408301615264565b604082015292915050565b5f610cfb368361571b565b5f82516155e9818460208701615368565b601f8211156104e357805f5260205f20601f840160051c810160208510156157d75750805b601f840160051c820191505b8181101561171d575f81556001016157e3565b81516001600160401b0381111561580f5761580f6155f3565b6158238161581d84546154f2565b846157b2565b602080601f831160018114615856575f841561583f5750858301515b5f19600386901b1c1916600185901b178555610f31565b5f85815260208120601f198616915b8281101561588457888601518255948401946001909101908401615865565b50858210156158a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cfb57610cfb6158b1565b5f63ffffffff8083168181036158f0576158f06158b1565b6001019392505050565b8082028115828204841417610cfb57610cfb6158b1565b5f6001600160401b03821115615929576159296155f3565b5060051b60200190565b5f60808236031215615943575f80fd5b61594b61562f565b8235815260208084013581830152604084013561596781615435565b604083015260608401356001600160401b0380821115615985575f80fd5b9085019036601f830112615997575f80fd5b81356159a56156e682615911565b81815260059190911b830184019084810190368311156159c3575f80fd5b8585015b838110156159f9578035858111156159dd575f80fd5b6159eb3689838a010161571b565b8452509186019186016159c7565b50606087015250939695505050505050565b5f82615a2557634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a3e57615a3e615340565b91905290565b5f60208083525f8454615a56816154f2565b806020870152604060018084165f8114615a775760018114615a9357615ac0565b60ff19851660408a0152604084151560051b8a01019550615ac0565b895f5260205f205f5b85811015615ab75781548b8201860152908301908801615a9c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611fa057611fa06158b1565b6001600160401b03828116828216039080821115611fa057611fa06158b1565b805161517481615154565b5f8060408385031215615b39575f80fd5b82516001600160401b0380821115615b4f575f80fd5b9084019060608287031215615b62575f80fd5b615b6a615607565b82518152602080840151615b7d81615435565b82820152604084015183811115615b92575f80fd5b80850194505087601f850112615ba6575f80fd5b83519250615bb66156e6846156a3565b8381528882858701011115615bc9575f80fd5b615bd884838301848801615368565b80604084015250819550615bed818801615b1d565b9450505050509250929050565b81810381811115610cfb57610cfb6158b1565b5f8651615c1e818460208b01615368565b60e087901b6001600160e01b0319169083019081528551615c46816004840160208a01615368565b8551910190615c5c816004840160208901615368565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b6001600160401b03818116838216028082169190828114615ca957615ca96158b1565b505092915050565b5f8235603e198336030181126155e9575f80fd5b5f808335601e19843603018112615cda575f80fd5b8301803591506001600160401b03821115615cf3575f80fd5b602001915036819003821315613745575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d45575f80fd5b615d4d615651565b615d5683615161565b81526020808401356001600160401b03811115615d71575f80fd5b840136601f820112615d81575f80fd5b8035615d8f6156e682615911565b81815260059190911b82018301908381019036831115615dad575f80fd5b928401925b82841015615dd4578335615dc581615435565b82529284019290840190615db2565b938501939093525091949350505050565b5f60208284031215615df5575f80fd5b611e3b82615253565b5f60208284031215615e0e575f80fd5b813560ff81168114611e3b575f80fd5b5f6001600160401b038083168181036158f0576158f06158b1565b5f60208284031215615e49575f80fd5b8151611e3b81615154565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e9a81602a850160208b01615368565b865190830190615eb181602a840160208b01615368565b60c087901b6001600160c01b031916602a9290910191820152615ee3603282018660e01b6001600160e01b0319169052565b615efc603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f1f818460208801615368565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f55818460208901615368565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f90818460208801615368565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161613f38038061613f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ff28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615210565b6104b3565b005b61021461022436600461524b565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615210565b6106f6565b610214610269366004615262565b610701565b61021461027c3660046152b0565b610c2b565b61029461028f36600461524b565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615210565b610cf9565b6102146102e93660046152d1565b610d04565b6103016102fc366004615311565b610dc5565b60405190815260200161023f565b61021461031d366004615376565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461539e565b611065565b61029461036036600461524b565b61109c565b6103015f81565b61021461037a366004615210565b6110b0565b610231603081565b61021461039536600461524b565b6110db565b6102146103a8366004615376565b6111a6565b6103016103bb3660046153b7565b61137e565b6102146103ce3660046152d1565b6113aa565b6103015f80516020615f4683398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461524b565b611533565b6103015f80516020615f6683398151915281565b61021461044236600461524b565b61171c565b610231601481565b61046261045d36600461524b565b611859565b60405161023f919061544c565b6102946202a30081565b6103015f80516020615f2683398151915281565b61021461049b3660046154e0565b6119a8565b6103016104ae36600461551e565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115610535576105356153d7565b6005811115610546576105466153d7565b815260200160018201805461055a90615589565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615589565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c6153d7565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e3a565b6040518263ffffffff1660e01b81526004016106b091906155cf565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906155e1565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f668339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906155e1565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f460608501604086016155f8565b6001600160a01b0316146108375761081260608401604085016155f8565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615613565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615613565b8363ffffffff1681811061087e5761087e615658565b9050602002810190610890919061566c565b61089990615790565b80516040519192505f9160088801916108b191615809565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da91906004016155cf565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615809565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906155e1565b90508086600801835f01516040516109809190615809565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a026153d7565b021790555060208201516001820190610a1b908261585e565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561592d565b8251604051919550610ad191615809565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615940565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff1683615962565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e89565b60400151611f9f565b90505f610b958761212c565b90505f600282604051610ba89190615809565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906155e1565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612306565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c756153d7565b14610c95578060405163170cc93360e21b81526004016104da91906155c1565b6106f08383612341565b5f805f80516020615f4683398151915260030154610cbd9084615979565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f08383836125bb565b610d0c6127a7565b5f80516020615f468339815191525f80610d25846127de565b91509150610d3282612306565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c6153d7565b03610d91575f83815260088501602052604081208054919055610d8f8282612b1c565b505b610da781610da28460400151611065565b612b92565b505050505b610dc260015f80516020615fa683398151915255565b50565b5f610dce6127a7565b610dda85858585612bc8565b9050610df260015f80516020615fa683398151915255565b949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115610e4757610e476153d7565b6003811115610e5857610e586153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee56153d7565b14610f06578251604051633b0d540d60e21b81526104da9190600401615998565b600481516005811115610f1b57610f1b6153d7565b03610f3157610f2985612da1565b505050505050565b5f80610f48610f3f89611e89565b60400151612f88565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b038416615962565b5f6110a682611859565b6080015192915050565b6110bb8383836125bb565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615f468339815191525f6110f383611859565b519050600481600581111561110a5761110a6153d7565b1461112a578060405163170cc93360e21b81526004016104da91906155c1565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b1c565b6111ae6127a7565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff1660038111156111fb576111fb6153d7565b600381111561120c5761120c6153d7565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611285576112856153d7565b146112a6578051604051633b0d540d60e21b81526104da9190600401615998565b60046112b58260400151611859565b5160058111156112c7576112c76153d7565b14611359575f6112d685611e89565b90505f806112e78360400151612f88565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612da1565b505061137a60015f80516020615fa683398151915255565b5050565b5f6113876127a7565b6113928333846131de565b9050610cf360015f80516020615fa683398151915255565b5f80516020615f668339815191525f806113cf6113c685611e89565b604001516134b6565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f90615589565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff166005811115611459576114596153d7565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068401602052604081206114a49161515f565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115611580576115806153d7565b6003811115611591576115916153d7565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a6153d7565b1415801561162b5750600381516003811115611628576116286153d7565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615998565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611e3a565b6040518263ffffffff1660e01b81526004016116d591906155cf565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171591906155e1565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615f66833981519152919061176390615589565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad6153d7565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161181991906004016159b2565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906155e1565b611861615196565b5f8281525f80516020615fc6833981519152602052604090819020815160e0810190925280545f80516020615f66833981519152929190829060ff1660058111156118ae576118ae6153d7565b60058111156118bf576118bf6153d7565b81526020016001820180546118d390615589565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff90615589565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a8484613672565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615f66833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615a3c565b90815260200160405180910390205491505092915050565b5f8381525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f468339815191529284929091829060ff166003811115611b3057611b306153d7565b6003811115611b4157611b416153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce6153d7565b14611bef578251604051633b0d540d60e21b81526104da9190600401615998565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615a4b565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca06153d7565b03611dce5760028401546080840151611cc2916001600160401b031690615a4b565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d068287612341565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615a6b565b61368c565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d82846137e3565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e339350505050565b600481516005811115611de357611de36153d7565b03611e1757611df1836137e3565b5f898152600786016020526040902055611e0a88612da1565b6001945050505050611e33565b805160405163170cc93360e21b81526104da91906004016155c1565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615a96565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b815115611f5c578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f98576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fd457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202357611feb816001615b68565b611ff6906008615962565b61ffff1684828151811061200c5761200c615658565b016020015160f81c901b9190911790600101611fd7565b5061ffff81161561204d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120a857612064816003615b68565b61206f906008615962565b63ffffffff168561208183600261592d565b8151811061209157612091615658565b016020015160f81c901b9190911790600101612050565b5063ffffffff8116156120ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612123576120e581601f615b68565b6120f0906008615962565b866120fc83600661592d565b8151811061210c5761210c615658565b016020015160f81c901b91909117906001016120d1565b50949350505050565b60605f80833560208501356014612148878701604089016155f8565b6121556060890189615613565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121db6060850185615613565b9050811015611f9857816121f26060860186615613565b8381811061220257612202615658565b9050602002810190612214919061566c565b61221e9080615b7b565b905061222d6060870187615613565b8481811061223d5761223d615658565b905060200281019061224f919061566c565b6122599080615b7b565b6122666060890189615613565b8681811061227657612276615658565b9050602002810190612288919061566c565b612296906020810190615b7b565b6122a360608b018b615613565b888181106122b3576122b3615658565b90506020028101906122c5919061566c565b6122d690606081019060400161539e565b6040516020016122ec9796959493929190615bbd565b60408051601f1981840301815291905291506001016121ce565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561238c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123b39190810190615a96565b91509150806123d557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243c91906155e1565b825114612462578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561249e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806124ad8460400151613980565b915091508187146124d45760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615f46833981519152906001600160401b039081169083161115612591575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125b0565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615f46833981519152816125d486613b71565b90506125df86612306565b6125ee57600192505050611e33565b5f8681526005830160205260409020546001600160a01b03163314612613573361114b565b5f86815260058301602052604090205460a082015161264291600160b01b90046001600160401b031690615a4b565b6001600160401b03168160c001516001600160401b031610156126895760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126a15761269a8786612341565b90506126bf565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126e490611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561274d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061277191906155e1565b905080846008015f8a81526020019081526020015f205f828254612795919061592d565b90915550501515979650505050505050565b5f80516020615fa68339815191528054600119016127d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e7615196565b5f80516020615f668339815191525f806128036113c687611e89565b91509150801561282a57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285b5761285b6153d7565b600581111561286c5761286c6153d7565b815260200160018201805461288090615589565b80601f01602080910402602001604051908101604052809291908181526020018280546128ac90615589565b80156128f75780601f106128ce576101008083540402835291602001916128f7565b820191905f5260205f20905b8154815290600101906020018083116128da57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612962576129626153d7565b141580156129835750600181516005811115612980576129806153d7565b14155b156129a457805160405163170cc93360e21b81526104da91906004016155c1565b6003815160058111156129b9576129b96153d7565b036129c757600481526129cc565b600581525b8360080181602001516040516129e29190615809565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2657612a266153d7565b021790555060208201516001820190612a3f908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae557612ae56153d7565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f2683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b77575f80fd5b505af1158015612b89573d5f803e3d5ffd5b50505050505050565b5f80516020615f268339815191525461137a906001600160a01b03168383613e55565b60015f80516020615fa683398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615f4683398151915290600160401b900461ffff9081169086161080612c1c575061271061ffff8616115b15612c4057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c7c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c8e5750806001015483115b15612caf5760405163222d164360e21b8152600481018490526024016104da565b5f612cb984613eb4565b90505f612cc582610c9f565b90505f612cd28983613ed7565b90506040518060800160405280612ce63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115612dee57612dee6153d7565b6003811115612dff57612dff6153d7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f2d575f84815260058701602052604090205461271090612edf90600160a01b900461ffff1685615962565b612ee99190615979565b915081866008015f8681526020019081526020015f205f828254612f0d919061592d565b90915550612f1d90508284615b68565b9050612f2d856020015182612b1c565b612f428560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612fbf57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561300e57612fd6816001615b68565b612fe1906008615962565b61ffff16868281518110612ff757612ff7615658565b016020015160f81c901b9190911790600101612fc2565b5061ffff8116156130385760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156130935761304f816003615b68565b61305a906008615962565b63ffffffff168761306c83600261592d565b8151811061307c5761307c615658565b016020015160f81c901b919091179060010161303b565b5063ffffffff81166003146130bb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613110576130d281601f615b68565b6130dd906008615962565b886130e983600661592d565b815181106130f9576130f9615658565b016020015160f81c901b91909117906001016130be565b505f805b600881101561316f57613128816007615b68565b613133906008615962565b6001600160401b03168961314883602661592d565b8151811061315857613158615658565b016020015160f81c901b9190911790600101613114565b505f805b60088110156131ce57613187816007615b68565b613192906008615962565b6001600160401b03168a6131a783602e61592d565b815181106131b7576131b7615658565b016020015160f81c901b9190911790600101613173565b5091989097509095509350505050565b5f5f80516020615f46833981519152816131fa61028f85613eb4565b90505f61320687611859565b905061321187612306565b613231576040516330efa98b60e01b8152600481018890526024016104da565b600281516005811115613246576132466153d7565b1461326757805160405163170cc93360e21b81526104da91906004016155c1565b5f8282608001516132789190615a4b565b905083600201600a9054906101000a90046001600160401b031682604001516132a19190615c26565b6001600160401b0316816001600160401b031611156132de57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132ea8a8461368c565b915091505f8a8360405160200161331892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156133ab576133ab6153d7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146134ec57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b600281101561353b57613503816001615b68565b61350e906008615962565b61ffff1685828151811061352457613524615658565b016020015160f81c901b91909117906001016134ef565b5061ffff8116156135655760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156135c05761357c816003615b68565b613587906008615962565b63ffffffff168661359983600261592d565b815181106135a9576135a9615658565b016020015160f81c901b9190911790600101613568565b5063ffffffff81166002146135e857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561363d576135ff81601f615b68565b61360a906008615962565b8761361683600661592d565b8151811061362657613626615658565b016020015160f81c901b91909117906001016135eb565b505f8660268151811061365257613652615658565b016020015191976001600160f81b03199092161515965090945050505050565b61367a61444f565b6136838261449a565b61137a8161450e565b5f8281525f80516020615fc6833981519152602052604081206002015481905f80516020615f6683398151915290600160801b90046001600160401b03166136d48582614576565b5f6136de87614799565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61372e8a858b611e3a565b6040518263ffffffff1660e01b815260040161374a91906155cf565b6020604051808303815f875af1158015613766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061378a91906155e1565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615f4683398151915290505f6138038460400151611859565b90505f60038251600581111561381b5761381b6153d7565b14806138395750600482516005811115613837576138376153d7565b145b15613849575060c0810151613886565b60028251600581111561385e5761385e6153d7565b0361386a575042613886565b815160405163170cc93360e21b81526104da91906004016155c1565b84608001516001600160401b0316816001600160401b0316116138ad57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138d290611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613953573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397791906155e1565b95945050505050565b5f808251602e146139b657825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a05576139cd816001615b68565b6139d8906008615962565b61ffff168582815181106139ee576139ee615658565b016020015160f81c901b91909117906001016139b9565b5061ffff811615613a2f5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a8a57613a46816003615b68565b613a51906008615962565b63ffffffff1686613a6383600261592d565b81518110613a7357613a73615658565b016020015160f81c901b9190911790600101613a32565b5063ffffffff811615613ab057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b0557613ac781601f615b68565b613ad2906008615962565b87613ade83600661592d565b81518110613aee57613aee615658565b016020015160f81c901b9190911790600101613ab3565b505f805b6008811015613b6457613b1d816007615b68565b613b28906008615962565b6001600160401b031688613b3d83602661592d565b81518110613b4d57613b4d615658565b016020015160f81c901b9190911790600101613b09565b5090969095509350505050565b613b79615196565b5f8281525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115613bc657613bc66153d7565b6005811115613bd757613bd76153d7565b8152602001600182018054613beb90615589565b80601f0160208091040260200160405190810160405280929190818152602001828054613c1790615589565b8015613c625780601f10613c3957610100808354040283529160200191613c62565b820191905f5260205f20905b815481529060010190602001808311613c4557829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613cd057613cd06153d7565b14613d03575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d4757613d476153d7565b021790555060208201516001820190613d60908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613dfe858261368c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061480e565b5f610cf3825f80516020615f26833981519152546001600160a01b03169061486f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f1b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615f6683398151915242613f3a606086016040870161539e565b6001600160401b0316111580613f745750613f586202a3004261592d565b613f68606086016040870161539e565b6001600160401b031610155b15613fae57613f89606085016040860161539e565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613fc3613fbe6060860186615c51565b6149c8565b613fd3613fbe6080860186615c51565b6030613fe26020860186615b7b565b90501461401457613ff66020850185615b7b565b6040516326475b2f60e11b81526104da925060040190815260200190565b61401e8480615b7b565b90505f0361404b576140308480615b7b565b604051633e08a12560e11b81526004016104da929190615c65565b5f6008820161405a8680615b7b565b604051614068929190615a3c565b908152602001604051809103902054146140a1576140868480615b7b565b60405163a41f772f60e01b81526004016104da929190615c65565b6140ab835f614576565b6040805160e08101909152815481525f9081906141b790602081016140d08980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614118908a018a615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161416160608a0160408b0161539e565b6001600160401b0316815260200161417c60608a018a615c51565b61418590615c93565b815260200161419760808a018a615c51565b6141a090615c93565b8152602001876001600160401b0316815250614b31565b5f828152600686016020526040902091935091506141d5828261585e565b5081600884016141e58880615b7b565b6040516141f3929190615a3c565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061422f9085906004016155cf565b6020604051808303815f875af115801561424b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426f91906155e1565b6040805160e08101909152909150806001815260200161428f8980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561431e5761431e6153d7565b021790555060208201516001820190614337908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143d58880615b7b565b6040516143e3929190615a3c565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614421919061539e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661449857604051631afcd79f60e31b815260040160405180910390fd5b565b6144a261444f565b6144ab81614d1e565b6144b3614d37565b610dc2606082013560808301356144d060c0850160a0860161539e565b6144e060e0860160c08701615d5a565b6144f1610100870160e08801615d73565b61010087013561450961014089016101208a016155f8565b614d47565b61451661444f565b5f80516020615f268339815191526001600160a01b03821661455657604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615f668339815191525f6001600160401b0380841690851611156145aa576145a38385615a6b565b90506145b7565b6145b48484615a6b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614619575060018401548151614615916001600160401b03169061592d565b8210155b1561463f576001600160401b03831660608201528181526040810151602082015261465e565b82816060018181516146519190615a4b565b6001600160401b03169052505b606081015161466e906064615c26565b602082015160018601546001600160401b0392909216916146999190600160401b900460ff16615962565b10156146c957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146e4919061592d565b9052506040810180516001600160401b0387169190614704908390615b68565b9052506001840154604082015160649161472991600160401b90910460ff1690615962565b1015614750578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615fc68339815191526020526040812060020180545f80516020615f6683398151915291906008906147e390600160401b90046001600160401b0316615d93565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148226001600160a01b03841683614f03565b905080515f141580156148465750808060200190518101906148449190615dae565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148d991906155e1565b90506148f06001600160a01b038516333086614f10565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614934573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495891906155e1565b90508181116149be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139778282615b68565b6149d560208201826152d1565b63ffffffff161580156149f557506149f06020820182615613565b151590505b15614a3c57614a0760208201826152d1565b614a146020830183615613565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614a496020820182615613565b9050614a5860208301836152d1565b63ffffffff161115614a7157614a0760208201826152d1565b60015b614a816020830183615613565b905081101561137a57614a976020830183615613565b614aa2600184615b68565b818110614ab157614ab1615658565b9050602002016020810190614ac691906155f8565b6001600160a01b0316614adc6020840184615613565b83818110614aec57614aec615658565b9050602002016020810190614b0191906155f8565b6001600160a01b03161015614b2957604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a74565b5f6060826040015151603014614b5a5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b9b988a986001989297929690959094909390929101615dc9565b60405160208183030381529060405290505f5b84608001516020015151811015614c0d57818560800151602001518281518110614bda57614bda615658565b6020026020010151604051602001614bf3929190615e83565b60408051601f198184030181529190529150600101614bae565b5060a0840151805160209182015151604051614c2d938593929101615eb9565b60405160208183030381529060405290505f5b8460a001516020015151811015614c9f57818560a00151602001518281518110614c6c57614c6c615658565b6020026020010151604051602001614c85929190615e83565b60408051601f198184030181529190529150600101614c40565b5060c0840151604051614cb6918391602001615ef4565b6040516020818303038152906040529050600281604051614cd79190615809565b602060405180830381855afa158015614cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d1591906155e1565b94909350915050565b614d2661444f565b614d2e614f49565b610dc281614f51565b614d3f61444f565b614498615039565b614d4f61444f565b5f80516020615f4683398151915261ffff85161580614d73575061271061ffff8616115b15614d9757604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614dbb5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614dce5750600a60ff8516115b15614df15760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614e58576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614e785760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3383835f615041565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e82565b61449861444f565b614f5961444f565b80355f80516020615f668339815191529081556014614f7e6060840160408501615d73565b60ff161180614f9d5750614f986060830160408401615d73565b60ff16155b15614fd157614fb26060830160408401615d73565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614fe16060830160408401615d73565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615012604083016020840161539e565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bb561444f565b6060814710156150665760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150819190615809565b5f6040518083038185875af1925050503d805f81146150bb576040519150601f19603f3d011682016040523d82523d5f602084013e6150c0565b606091505b50915091506150d08683836150da565b9695505050505050565b6060826150ef576150ea82615136565b611e33565b815115801561510657506001600160a01b0384163b155b1561512f57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e33565b8051156151465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461516b90615589565b5f825580601f1061517a575050565b601f0160209004905f5260205f2090810190610dc291906151d3565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156151e7575f81556001016151d4565b5090565b8015158114610dc2575f80fd5b803563ffffffff8116811461520b575f80fd5b919050565b5f805f60608486031215615222575f80fd5b833592506020840135615234816151eb565b9150615242604085016151f8565b90509250925092565b5f6020828403121561525b575f80fd5b5035919050565b5f8060408385031215615273575f80fd5b82356001600160401b03811115615288575f80fd5b830160808186031215615299575f80fd5b91506152a7602084016151f8565b90509250929050565b5f80604083850312156152c1575f80fd5b823591506152a7602084016151f8565b5f602082840312156152e1575f80fd5b611e33826151f8565b803561ffff8116811461520b575f80fd5b80356001600160401b038116811461520b575f80fd5b5f805f8060808587031215615324575f80fd5b84356001600160401b03811115615339575f80fd5b850160a0818803121561534a575f80fd5b9350615358602086016152ea565b9250615366604086016152fb565b9396929550929360600135925050565b5f8060408385031215615387575f80fd5b615390836151f8565b946020939093013593505050565b5f602082840312156153ae575f80fd5b611e33826152fb565b5f80604083850312156153c8575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106153fb576153fb6153d7565b9052565b5f5b83811015615419578181015183820152602001615401565b50505f910152565b5f81518084526154388160208601602086016153ff565b601f01601f19169290920160200192915050565b6020815261545e6020820183516153eb565b5f602083015160e06040840152615479610100840182615421565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f808284036101608112156154f3575f80fd5b61014080821215615502575f80fd5b8493508301359050615513816154cc565b809150509250929050565b5f806020838503121561552f575f80fd5b82356001600160401b0380821115615545575f80fd5b818501915085601f830112615558575f80fd5b813581811115615566575f80fd5b866020828501011115615577575f80fd5b60209290920196919550909350505050565b600181811c9082168061559d57607f821691505b6020821081036155bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf382846153eb565b602081525f611e336020830184615421565b5f602082840312156155f1575f80fd5b5051919050565b5f60208284031215615608575f80fd5b8135611e33816154cc565b5f808335601e19843603018112615628575f80fd5b8301803591506001600160401b03821115615641575f80fd5b6020019150600581901b36038213156137dc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615680575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156156c0576156c061568a565b60405290565b604080519081016001600160401b03811182821017156156c0576156c061568a565b604051601f8201601f191681016001600160401b03811182821017156157105761571061568a565b604052919050565b5f6001600160401b038211156157305761573061568a565b50601f01601f191660200190565b5f82601f83011261574d575f80fd5b813561576061575b82615718565b6156e8565b818152846020838601011115615774575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156157a0575f80fd5b6157a861569e565b82356001600160401b03808211156157be575f80fd5b6157ca3683870161573e565b835260208501359150808211156157df575f80fd5b506157ec3682860161573e565b6020830152506157fe604084016152fb565b604082015292915050565b5f82516156808184602087016153ff565b601f8211156104e357805f5260205f20601f840160051c8101602085101561583f5750805b601f840160051c820191505b81811015611715575f815560010161584b565b81516001600160401b038111156158775761587761568a565b61588b816158858454615589565b8461581a565b602080601f8311600181146158be575f84156158a75750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156158ec578886015182559484019460019091019084016158cd565b508582101561590957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615919565b5f63ffffffff80831681810361595857615958615919565b6001019392505050565b8082028115828204841417610cf357610cf3615919565b5f8261599357634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106159ac576159ac6153d7565b91905290565b5f60208083525f84546159c481615589565b806020870152604060018084165f81146159e55760018114615a0157615a2e565b60ff19851660408a0152604084151560051b8a01019550615a2e565b895f5260205f205f5b85811015615a255781548b8201860152908301908801615a0a565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f9857611f98615919565b6001600160401b03828116828216039080821115611f9857611f98615919565b805161520b816151eb565b5f8060408385031215615aa7575f80fd5b82516001600160401b0380821115615abd575f80fd5b9084019060608287031215615ad0575f80fd5b615ad861569e565b82518152602080840151615aeb816154cc565b82820152604084015183811115615b00575f80fd5b80850194505087601f850112615b14575f80fd5b83519250615b2461575b84615718565b8381528882858701011115615b37575f80fd5b615b46848383018488016153ff565b80604084015250819550615b5b818801615a8b565b9450505050509250929050565b81810381811115610cf357610cf3615919565b5f808335601e19843603018112615b90575f80fd5b8301803591506001600160401b03821115615ba9575f80fd5b6020019150368190038213156137dc575f80fd5b5f8851615bce818460208d016153ff565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615c4957615c49615919565b505092915050565b5f8235603e19833603018112615680575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ca3575f80fd5b615cab6156c6565b615cb4836151f8565b81526020808401356001600160401b0380821115615cd0575f80fd5b9085019036601f830112615ce2575f80fd5b813581811115615cf457615cf461568a565b8060051b9150615d058483016156e8565b8181529183018401918481019036841115615d1e575f80fd5b938501935b83851015615d485784359250615d38836154cc565b8282529385019390850190615d23565b94860194909452509295945050505050565b5f60208284031215615d6a575f80fd5b611e33826152ea565b5f60208284031215615d83575f80fd5b813560ff81168114611e33575f80fd5b5f6001600160401b0380831681810361595857615958615919565b5f60208284031215615dbe575f80fd5b8151611e33816151eb565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e0f81602a850160208b016153ff565b865190830190615e2681602a840160208b016153ff565b60c087901b6001600160c01b031916602a9290910191820152615e58603282018660e01b6001600160e01b0319169052565b615e71603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615e948184602088016153ff565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615eca8184602089016153ff565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f058184602088016153ff565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 68b7aa6ed..131a01b91 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615ed5380380615ed583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d888061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614f1d565b610615565b005b348015610221575f80fd5b50610214610230366004614f58565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614f1d565b610858565b34801561028a575f80fd5b50610214610299366004614f6f565b610863565b3480156102a9575f80fd5b506102146102b8366004614fbd565b610d95565b3480156102c8575f80fd5b506102dc6102d7366004614f58565b610e09565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614f1d565b610e63565b348015610378575f80fd5b50610214610387366004614fde565b610e6e565b348015610397575f80fd5b506102146103a6366004614ff7565b610f2f565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004615035565b61119a565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614f58565b6111d1565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614f1d565b6111e5565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614f58565b611210565b348015610490575f80fd5b5061021461049f366004614ff7565b6112db565b3480156104af575f80fd5b506102146104be366004614fde565b6114b3565b6103f36104d136600461505f565b61163c565b3480156104e1575f80fd5b506103f35f80516020615cdc83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614f58565b611670565b34801561053a575f80fd5b506103f35f80516020615cfc83398151915281565b34801561055a575f80fd5b50610214610569366004614f58565b611859565b348015610579575f80fd5b506102146105883660046150b3565b611996565b6103f361059b366004614f58565b611a73565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614f58565b611aa4565b604051610257919061513f565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046151bf565b611bf3565b610620838383611c4e565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d5c8339815191526020526040808220815160e0810190925280545f80516020615cfc83398151915293929190829060ff166005811115610697576106976150ca565b60058111156106a8576106a86150ca565b81526020016001820180546106bc9061522a565b80601f01602080910402602001604051908101604052809291908181526020018280546106e89061522a565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6150ca565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f9f565b6040518263ffffffff1660e01b8152600401610812919061526a565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061527c565b50505050565b610852838383611c4e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cfc8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061527c565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016152a7565b6001600160a01b0316146109995761097460608401604085016152a7565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856152c2565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886152c2565b8363ffffffff168181106109e0576109e0615307565b90506020028101906109f2919061531b565b6109fb906154dc565b80516040519192505f916008880191610a13916154e7565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161526a565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916154e7565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061527c565b90508086600801835f0151604051610ae291906154e7565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646150ca565b021790555060208201516001820190610b7d908261553c565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c2291168561560b565b8251604051919550610c33916154e7565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c889061561e565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615640565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fee565b60400151612104565b90505f610cff610cfa88615679565b612291565b90505f600282604051610d1291906154e7565b602060405180830381855afa158015610d2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d50919061527c565b9050828114610d7c57604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9e826123cc565b610dbe576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc883611aa4565b5190506002816005811115610ddf57610ddf6150ca565b14610dff578060405163170cc93360e21b815260040161063c919061525c565b6108528383612407565b5f805f80516020615cdc83398151915260030154610e279084615751565b9050801580610e3c57506001600160401b0381115b15610e5d5760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612681565b610e7661286d565b5f80516020615cdc8339815191525f80610e8f846128a4565b91509150610e9c826123cc565b610ea857505050610f16565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ed657610ed66150ca565b03610efb575f83815260088501602052604081208054919055610ef98282612be2565b505b610f1181610f0c846040015161119a565b612c40565b505050505b610f2c60015f80516020615d3c83398151915255565b50565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115610f7c57610f7c6150ca565b6003811115610f8d57610f8d6150ca565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61100382611aa4565b905060018351600381111561101a5761101a6150ca565b1461103b578251604051633b0d540d60e21b815261063c9190600401615770565b600481516005811115611050576110506150ca565b036110665761105e85612c66565b505050505050565b5f8061107d61107489611fee565b60400151612e4d565b50915091508184146110aa57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110e35750806001600160401b03168560a001516001600160401b0316115b1561110c57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e5d906001600160401b038416615640565b5f6111db82611aa4565b6080015192915050565b6111f0838383612681565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615cdc8339815191525f61122883611aa4565b519050600481600581111561123f5761123f6150ca565b1461125f578060405163170cc93360e21b815260040161063c919061525c565b5f8381526005830160205260409020546001600160a01b031633146112a557335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612be2565b6112e361286d565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115611330576113306150ca565b6003811115611341576113416150ca565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113ba576113ba6150ca565b146113db578051604051633b0d540d60e21b815261063c9190600401615770565b60046113ea8260400151611aa4565b5160058111156113fc576113fc6150ca565b1461148e575f61140b85611fee565b90505f8061141c8360400151612e4d565b5091509150818460400151146114485760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148a57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61149783612c66565b50506114af60015f80516020615d3c83398151915255565b5050565b5f80516020615cfc8339815191525f806114d86114cf85611fee565b604001516130a3565b91509150806114fe57604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546115189061522a565b90505f0361153c5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff166005811115611562576115626150ca565b14611595575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b5f82815260068401602052604081206115ad91614e71565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61164561286d565b6116518484843461325f565b905061166960015f80516020615d3c83398151915255565b9392505050565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff1660038111156116bd576116bd6150ca565b60038111156116ce576116ce6150ca565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611747576117476150ca565b141580156117685750600381516003811115611765576117656150ca565b14155b15611789578051604051633b0d540d60e21b815261063c9190600401615770565b5f6117978260400151611aa4565b905080606001516001600160401b03165f036117c9576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117f6846040015184606001518560800151611f9f565b6040518263ffffffff1660e01b8152600401611812919061526a565b6020604051808303815f875af115801561182e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611852919061527c565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cfc83398151915291906118a09061522a565b90505f036118c45760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118ea576118ea6150ca565b1461191d575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611956919060040161578a565b6020604051808303815f875af1158015611972573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061527c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119df575080546001600160401b03808416911610155b156119fd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a278361342d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a7c61286d565b611a8782333461343e565b9050611a9f60015f80516020615d3c83398151915255565b919050565b611aac614ea8565b5f8281525f80516020615d5c833981519152602052604090819020815160e0810190925280545f80516020615cfc833981519152929190829060ff166005811115611af957611af96150ca565b6005811115611b0a57611b0a6150ca565b8152602001600182018054611b1e9061522a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4a9061522a565b8015611b955780601f10611b6c57610100808354040283529160200191611b95565b820191905f5260205f20905b815481529060010190602001808311611b7857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615cfc833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c369086908690615814565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc8339815191529284929091829060ff166003811115611c9c57611c9c6150ca565b6003811115611cad57611cad6150ca565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d2382611aa4565b9050600283516003811115611d3a57611d3a6150ca565b14611d5b578251604051633b0d540d60e21b815261063c9190600401615770565b60208301516001600160a01b03163314611df7575f8281526005850160205260409020546001600160a01b03163314611d945733611280565b5f82815260058501602052604090205460a0820151611dc391600160b01b90046001600160401b031690615823565b6001600160401b0316421015611df75760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0c57611e0c6150ca565b03611f3a5760028401546080840151611e2e916001600160401b031690615823565b6001600160401b0316421015611e625760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e7457611e728287612407565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ead918491611ea89190615843565b613713565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611eee8461386a565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116699350505050565b600481516005811115611f4f57611f4f6150ca565b03611f8357611f5d8361386a565b5f898152600786016020526040902055611f7688612c66565b6001945050505050611669565b805160405163170cc93360e21b815261063c919060040161525c565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612052573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612079919081019061586e565b915091508061209b57604051636b2f19e960e01b815260040160405180910390fd5b8151156120c1578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120fd576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213957815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b600281101561218857612150816001615940565b61215b906008615640565b61ffff1684828151811061217157612171615307565b016020015160f81c901b919091179060010161213c565b5061ffff8116156121b25760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561220d576121c9816003615940565b6121d4906008615640565b63ffffffff16856121e683600261560b565b815181106121f6576121f6615307565b016020015160f81c901b91909117906001016121b5565b5063ffffffff81161561223357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122885761224a81601f615940565b612255906008615640565b8661226183600661560b565b8151811061227157612271615307565b016020015160f81c901b9190911790600101612236565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b8360600151518110156120fd57818460600151828151811061232d5761232d615307565b60200260200101515f0151518560600151838151811061234f5761234f615307565b60200260200101515f01518660600151848151811061237057612370615307565b6020026020010151602001518760600151858151811061239257612392615307565b6020026020010151604001516040516020016123b2959493929190615953565b60408051601f198184030181529190529150600101612309565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612452573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612479919081019061586e565b915091508061249b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612502919061527c565b825114612528578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612564576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125738460400151613a07565b9150915081871461259a5760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615cdc833981519152906001600160401b039081169083161115612657575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612676565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615cdc8339815191528161269a86613bf8565b90506126a5866123cc565b6126b457600192505050611669565b5f8681526005830160205260409020546001600160a01b031633146126d95733611280565b5f86815260058301602052604090205460a082015161270891600160b01b90046001600160401b031690615823565b6001600160401b03168160c001516001600160401b0316101561274f5760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f8515612767576127608786612407565b9050612785565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127aa9061119a565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612837919061527c565b905080846008015f8a81526020019081526020015f205f82825461285b919061560b565b90915550501515979650505050505050565b5f80516020615d3c83398151915280546001190161289e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128ad614ea8565b5f80516020615cfc8339815191525f806128c96114cf87611fee565b9150915080156128f057604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612921576129216150ca565b6005811115612932576129326150ca565b81526020016001820180546129469061522a565b80601f01602080910402602001604051908101604052809291908181526020018280546129729061522a565b80156129bd5780601f10612994576101008083540402835291602001916129bd565b820191905f5260205f20905b8154815290600101906020018083116129a057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a2857612a286150ca565b14158015612a495750600181516005811115612a4657612a466150ca565b14155b15612a6a57805160405163170cc93360e21b815261063c919060040161525c565b600381516005811115612a7f57612a7f6150ca565b03612a8d5760048152612a92565b600581525b836008018160200151604051612aa891906154e7565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aec57612aec6150ca565b021790555060208201516001820190612b05908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bab57612bab6150ca565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c2e575f80fd5b505af115801561105e573d5f803e3d5ffd5b6114af6001600160a01b03831682613edc565b60015f80516020615d3c83398151915255565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115612cb357612cb36150ca565b6003811115612cc457612cc46150ca565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612df2575f84815260058701602052604090205461271090612da490600160a01b900461ffff1685615640565b612dae9190615751565b915081866008015f8681526020019081526020015f205f828254612dd2919061560b565b90915550612de290508284615940565b9050612df2856020015182612be2565b612e078560200151610f0c876060015161119a565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8457835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612ed357612e9b816001615940565b612ea6906008615640565b61ffff16868281518110612ebc57612ebc615307565b016020015160f81c901b9190911790600101612e87565b5061ffff811615612efd5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f5857612f14816003615940565b612f1f906008615640565b63ffffffff1687612f3183600261560b565b81518110612f4157612f41615307565b016020015160f81c901b9190911790600101612f00565b5063ffffffff8116600314612f8057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fd557612f9781601f615940565b612fa2906008615640565b88612fae83600661560b565b81518110612fbe57612fbe615307565b016020015160f81c901b9190911790600101612f83565b505f805b600881101561303457612fed816007615940565b612ff8906008615640565b6001600160401b03168961300d83602661560b565b8151811061301d5761301d615307565b016020015160f81c901b9190911790600101612fd9565b505f805b60088110156130935761304c816007615940565b613057906008615640565b6001600160401b03168a61306c83602e61560b565b8151811061307c5761307c615307565b016020015160f81c901b9190911790600101613038565b5091989097509095509350505050565b5f8082516027146130d957825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b6002811015613128576130f0816001615940565b6130fb906008615640565b61ffff1685828151811061311157613111615307565b016020015160f81c901b91909117906001016130dc565b5061ffff8116156131525760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131ad57613169816003615940565b613174906008615640565b63ffffffff168661318683600261560b565b8151811061319657613196615307565b016020015160f81c901b9190911790600101613155565b5063ffffffff81166002146131d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561322a576131ec81601f615940565b6131f7906008615640565b8761320383600661560b565b8151811061321357613213615307565b016020015160f81c901b91909117906001016131d8565b505f8660268151811061323f5761323f615307565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615cdc83398151915290600160401b900461ffff90811690861610806132b3575061271061ffff8616115b156132d757604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613313576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133255750806001015483115b156133465760405163222d164360e21b81526004810184905260240161063c565b825f61335182610e09565b90505f61335e8983613f6f565b905060405180608001604052806133723390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6134356144e7565b610f2c81614532565b5f5f80516020615cdc8339815191528161345784610e09565b90505f61346387611aa4565b905061346e876123cc565b61348e576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134a3576134a36150ca565b146134c457805160405163170cc93360e21b815261063c919060040161525c565b5f8282608001516134d59190615823565b905083600201600a9054906101000a90046001600160401b031682604001516134fe91906159cc565b6001600160401b0316816001600160401b0316111561353b57604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135478a84613713565b915091505f8a8360405160200161357592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff19166001836003811115613608576136086150ca565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d5c833981519152602052604081206002015481905f80516020615cfc83398151915290600160801b90046001600160401b031661375b85826145a6565b5f613765876147c9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137b58a858b611f9f565b6040518263ffffffff1660e01b81526004016137d1919061526a565b6020604051808303815f875af11580156137ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613811919061527c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615cdc83398151915290505f61388a8460400151611aa4565b90505f6003825160058111156138a2576138a26150ca565b14806138c057506004825160058111156138be576138be6150ca565b145b156138d0575060c081015161390d565b6002825160058111156138e5576138e56150ca565b036138f157504261390d565b815160405163170cc93360e21b815261063c919060040161525c565b84608001516001600160401b0316816001600160401b03161161393457505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139599061119a565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fe919061527c565b95945050505050565b5f808251602e14613a3d57825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613a8c57613a54816001615940565b613a5f906008615640565b61ffff16858281518110613a7557613a75615307565b016020015160f81c901b9190911790600101613a40565b5061ffff811615613ab65760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b1157613acd816003615940565b613ad8906008615640565b63ffffffff1686613aea83600261560b565b81518110613afa57613afa615307565b016020015160f81c901b9190911790600101613ab9565b5063ffffffff811615613b3757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b8c57613b4e81601f615940565b613b59906008615640565b87613b6583600661560b565b81518110613b7557613b75615307565b016020015160f81c901b9190911790600101613b3a565b505f805b6008811015613beb57613ba4816007615940565b613baf906008615640565b6001600160401b031688613bc483602661560b565b81518110613bd457613bd4615307565b016020015160f81c901b9190911790600101613b90565b5090969095509350505050565b613c00614ea8565b5f8281525f80516020615d5c8339815191526020526040808220815160e0810190925280545f80516020615cfc83398151915293929190829060ff166005811115613c4d57613c4d6150ca565b6005811115613c5e57613c5e6150ca565b8152602001600182018054613c729061522a565b80601f0160208091040260200160405190810160405280929190818152602001828054613c9e9061522a565b8015613ce95780601f10613cc057610100808354040283529160200191613ce9565b820191905f5260205f20905b815481529060010190602001808311613ccc57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d5757613d576150ca565b14613d8a575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dce57613dce6150ca565b021790555060208201516001820190613de7908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e858582613713565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eff5760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f48576040519150601f19603f3d011682016040523d82523d5f602084013e613f4d565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fb357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cfc83398151915242613fd26060860160408701615035565b6001600160401b031611158061400c5750613ff06202a3004261560b565b6140006060860160408701615035565b6001600160401b031610155b15614046576140216060850160408601615035565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61405b61405660608601866159f7565b61483e565b61406b61405660808601866159f7565b603061407a6020860186615a0b565b9050146140ac5761408e6020850185615a0b565b6040516326475b2f60e11b815261063c925060040190815260200190565b6140b68480615a0b565b90505f036140e3576140c88480615a0b565b604051633e08a12560e11b815260040161063c929190615a4d565b5f600882016140f28680615a0b565b604051614100929190615814565b908152602001604051809103902054146141395761411e8480615a0b565b60405163a41f772f60e01b815260040161063c929190615a4d565b614143835f6145a6565b6040805160e08101909152815481525f90819061424f90602081016141688980615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141b0908a018a615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141f960608a0160408b01615035565b6001600160401b0316815260200161421460608a018a6159f7565b61421d90615a7b565b815260200161422f60808a018a6159f7565b61423890615a7b565b8152602001876001600160401b03168152506149a7565b5f8281526006860160205260409020919350915061426d828261553c565b50816008840161427d8880615a0b565b60405161428b929190615814565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142c790859060040161526a565b6020604051808303815f875af11580156142e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614307919061527c565b6040805160e0810190915290915080600181526020016143278980615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143b6576143b66150ca565b0217905550602082015160018201906143cf908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061446d8880615a0b565b60405161447b929190615814565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144b99190615035565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661453057604051631afcd79f60e31b815260040160405180910390fd5b565b61453a6144e7565b61454381614b94565b61454b614bad565b610f2c6060820135608083013561456860c0850160a08601615035565b61457860e0860160c08701615b2b565b614589610100870160e08801615b44565b6101008701356145a161014089016101208a016152a7565b614bbd565b5f80516020615cfc8339815191525f6001600160401b0380841690851611156145da576145d38385615843565b90506145e7565b6145e48484615843565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614649575060018401548151614645916001600160401b03169061560b565b8210155b1561466f576001600160401b03831660608201528181526040810151602082015261468e565b82816060018181516146819190615823565b6001600160401b03169052505b606081015161469e9060646159cc565b602082015160018601546001600160401b0392909216916146c99190600160401b900460ff16615640565b10156146f957606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b031681604001818151614714919061560b565b9052506040810180516001600160401b0387169190614734908390615940565b9052506001840154604082015160649161475991600160401b90910460ff1690615640565b1015614780578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d5c8339815191526020526040812060020180545f80516020615cfc833981519152919060089061481390600160401b90046001600160401b0316615b64565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61484b6020820182614fde565b63ffffffff1615801561486b575061486660208201826152c2565b151590505b156148b25761487d6020820182614fde565b61488a60208301836152c2565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6148bf60208201826152c2565b90506148ce6020830183614fde565b63ffffffff1611156148e75761487d6020820182614fde565b60015b6148f760208301836152c2565b90508110156114af5761490d60208301836152c2565b614918600184615940565b81811061492757614927615307565b905060200201602081019061493c91906152a7565b6001600160a01b031661495260208401846152c2565b8381811061496257614962615307565b905060200201602081019061497791906152a7565b6001600160a01b0316101561499f57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148ea565b5f60608260400151516030146149d05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a11988a986001989297929690959094909390929101615b7f565b60405160208183030381529060405290505f5b84608001516020015151811015614a8357818560800151602001518281518110614a5057614a50615307565b6020026020010151604051602001614a69929190615c39565b60408051601f198184030181529190529150600101614a24565b5060a0840151805160209182015151604051614aa3938593929101615c6f565b60405160208183030381529060405290505f5b8460a001516020015151811015614b1557818560a00151602001518281518110614ae257614ae2615307565b6020026020010151604051602001614afb929190615c39565b60408051601f198184030181529190529150600101614ab6565b5060c0840151604051614b2c918391602001615caa565b6040516020818303038152906040529050600281604051614b4d91906154e7565b602060405180830381855afa158015614b68573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8b919061527c565b94909350915050565b614b9c6144e7565b614ba4614d79565b610f2c81614d81565b614bb56144e7565b614530614e69565b614bc56144e7565b5f80516020615cdc83398151915261ffff85161580614be9575061271061ffff8616115b15614c0d57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c315760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c445750600a60ff8516115b15614c675760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614cce576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614cee5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6145306144e7565b614d896144e7565b80355f80516020615cfc8339815191529081556014614dae6060840160408501615b44565b60ff161180614dcd5750614dc86060830160408401615b44565b60ff16155b15614e0157614de26060830160408401615b44565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614e116060830160408401615b44565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e426040830160208401615035565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c536144e7565b508054614e7d9061522a565b5f825580601f10614e8c575050565b601f0160209004905f5260205f2090810190610f2c9190614ee5565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ef9575f8155600101614ee6565b5090565b8015158114610f2c575f80fd5b803563ffffffff81168114611a9f575f80fd5b5f805f60608486031215614f2f575f80fd5b833592506020840135614f4181614efd565b9150614f4f60408501614f0a565b90509250925092565b5f60208284031215614f68575f80fd5b5035919050565b5f8060408385031215614f80575f80fd5b82356001600160401b03811115614f95575f80fd5b830160808186031215614fa6575f80fd5b9150614fb460208401614f0a565b90509250929050565b5f8060408385031215614fce575f80fd5b82359150614fb460208401614f0a565b5f60208284031215614fee575f80fd5b61166982614f0a565b5f8060408385031215615008575f80fd5b61501183614f0a565b946020939093013593505050565b80356001600160401b0381168114611a9f575f80fd5b5f60208284031215615045575f80fd5b6116698261501f565b803561ffff81168114611a9f575f80fd5b5f805f60608486031215615071575f80fd5b83356001600160401b03811115615086575f80fd5b840160a08187031215615097575f80fd5b92506150a56020850161504e565b9150614f4f6040850161501f565b5f61014082840312156150c4575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106150ee576150ee6150ca565b9052565b5f5b8381101561510c5781810151838201526020016150f4565b50505f910152565b5f815180845261512b8160208601602086016150f2565b601f01601f19169290920160200192915050565b602081526151516020820183516150de565b5f602083015160e0604084015261516c610100840182615114565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156151d0575f80fd5b82356001600160401b03808211156151e6575f80fd5b818501915085601f8301126151f9575f80fd5b813581811115615207575f80fd5b866020828501011115615218575f80fd5b60209290920196919550909350505050565b600181811c9082168061523e57607f821691505b6020821081036150c457634e487b7160e01b5f52602260045260245ffd5b60208101610e5d82846150de565b602081525f6116696020830184615114565b5f6020828403121561528c575f80fd5b5051919050565b6001600160a01b0381168114610f2c575f80fd5b5f602082840312156152b7575f80fd5b813561166981615293565b5f808335601e198436030181126152d7575f80fd5b8301803591506001600160401b038211156152f0575f80fd5b6020019150600581901b3603821315613863575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261532f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561536f5761536f615339565b60405290565b604051608081016001600160401b038111828210171561536f5761536f615339565b604080519081016001600160401b038111828210171561536f5761536f615339565b604051601f8201601f191681016001600160401b03811182821017156153e1576153e1615339565b604052919050565b5f6001600160401b0382111561540157615401615339565b50601f01601f191660200190565b5f82601f83011261541e575f80fd5b813561543161542c826153e9565b6153b9565b818152846020838601011115615445575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215615471575f80fd5b61547961534d565b905081356001600160401b0380821115615491575f80fd5b61549d8583860161540f565b835260208401359150808211156154b2575f80fd5b506154bf8482850161540f565b6020830152506154d16040830161501f565b604082015292915050565b5f610e5d3683615461565b5f825161532f8184602087016150f2565b601f82111561064557805f5260205f20601f840160051c8101602085101561551d5750805b601f840160051c820191505b81811015611852575f8155600101615529565b81516001600160401b0381111561555557615555615339565b61556981615563845461522a565b846154f8565b602080601f83116001811461559c575f84156155855750858301515b5f19600386901b1c1916600185901b17855561105e565b5f85815260208120601f198616915b828110156155ca578886015182559484019460019091019084016155ab565b50858210156155e757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5d57610e5d6155f7565b5f63ffffffff808316818103615636576156366155f7565b6001019392505050565b8082028115828204841417610e5d57610e5d6155f7565b5f6001600160401b0382111561566f5761566f615339565b5060051b60200190565b5f60808236031215615689575f80fd5b615691615375565b823581526020808401358183015260408401356156ad81615293565b604083015260608401356001600160401b03808211156156cb575f80fd5b9085019036601f8301126156dd575f80fd5b81356156eb61542c82615657565b81815260059190911b83018401908481019036831115615709575f80fd5b8585015b8381101561573f57803585811115615723575f80fd5b6157313689838a0101615461565b84525091860191860161570d565b50606087015250939695505050505050565b5f8261576b57634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615784576157846150ca565b91905290565b5f60208083525f845461579c8161522a565b806020870152604060018084165f81146157bd57600181146157d957615806565b60ff19851660408a0152604084151560051b8a01019550615806565b895f5260205f205f5b858110156157fd5781548b82018601529083019088016157e2565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120fd576120fd6155f7565b6001600160401b038281168282160390808211156120fd576120fd6155f7565b8051611a9f81614efd565b5f806040838503121561587f575f80fd5b82516001600160401b0380821115615895575f80fd5b90840190606082870312156158a8575f80fd5b6158b061534d565b825181526020808401516158c381615293565b828201526040840151838111156158d8575f80fd5b80850194505087601f8501126158ec575f80fd5b835192506158fc61542c846153e9565b838152888285870101111561590f575f80fd5b61591e848383018488016150f2565b80604084015250819550615933818801615863565b9450505050509250929050565b81810381811115610e5d57610e5d6155f7565b5f8651615964818460208b016150f2565b60e087901b6001600160e01b031916908301908152855161598c816004840160208a016150f2565b85519101906159a28160048401602089016150f2565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b6001600160401b038181168382160280821691908281146159ef576159ef6155f7565b505092915050565b5f8235603e1983360301811261532f575f80fd5b5f808335601e19843603018112615a20575f80fd5b8301803591506001600160401b03821115615a39575f80fd5b602001915036819003821315613863575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a8b575f80fd5b615a93615397565b615a9c83614f0a565b81526020808401356001600160401b03811115615ab7575f80fd5b840136601f820112615ac7575f80fd5b8035615ad561542c82615657565b81815260059190911b82018301908381019036831115615af3575f80fd5b928401925b82841015615b1a578335615b0b81615293565b82529284019290840190615af8565b938501939093525091949350505050565b5f60208284031215615b3b575f80fd5b6116698261504e565b5f60208284031215615b54575f80fd5b813560ff81168114611669575f80fd5b5f6001600160401b03808316818103615636576156366155f7565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bc581602a850160208b016150f2565b865190830190615bdc81602a840160208b016150f2565b60c087901b6001600160c01b031916602a9290910191820152615c0e603282018660e01b6001600160e01b0319169052565b615c27603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c4a8184602088016150f2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c808184602089016150f2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cbb8184602088016150f2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615e4a380380615e4a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615cfd8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614fb4565b610615565b005b348015610221575f80fd5b50610214610230366004614fef565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614fb4565b610858565b34801561028a575f80fd5b50610214610299366004615006565b610863565b3480156102a9575f80fd5b506102146102b8366004615054565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614fef565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614fb4565b610e5b565b348015610378575f80fd5b50610214610387366004615075565b610e66565b348015610397575f80fd5b506102146103a636600461508e565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee3660046150cc565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614fef565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614fb4565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614fef565b611208565b348015610490575f80fd5b5061021461049f36600461508e565b6112d3565b3480156104af575f80fd5b506102146104be366004615075565b6114ab565b6103f36104d13660046150f6565b611634565b3480156104e1575f80fd5b506103f35f80516020615c5183398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614fef565b611668565b34801561053a575f80fd5b506103f35f80516020615c7183398151915281565b34801561055a575f80fd5b50610214610569366004614fef565b611851565b348015610579575f80fd5b5061021461058836600461514a565b61198e565b6103f361059b366004614fef565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614fef565b611a9c565b60405161025791906151d6565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f3610610366004615256565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff16600581111561069757610697615161565b60058111156106a8576106a8615161565b81526020016001820180546106bc906152c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106e8906152c1565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e615161565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f97565b6040518263ffffffff1660e01b81526004016108129190615301565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615313565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c718339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615313565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b30610956606085016040860161533e565b6001600160a01b03161461099957610974606084016040850161533e565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615359565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615359565b8363ffffffff168181106109e0576109e061539e565b90506020028101906109f291906153b2565b6109fb906154d6565b80516040519192505f916008880191610a139161554f565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615301565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c9161554f565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615313565b90508086600801835f0151604051610ae2919061554f565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64615161565b021790555060208201516001820190610b7d90826155a4565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c22911685615673565b8251604051919550610c339161554f565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c8890615686565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836156a8565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fe6565b604001516120fc565b90505f610cf787612289565b90505f600282604051610d0a919061554f565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615313565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612463565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd7615161565b14610df7578060405163170cc93360e21b815260040161063c91906152f3565b610852838361249e565b5f805f80516020615c5183398151915260030154610e1f90846156bf565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612718565b610e6e612904565b5f80516020615c518339815191525f80610e878461293b565b91509150610e9482612463565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece615161565b03610ef3575f83815260088501602052604081208054919055610ef18282612c79565b505b610f0981610f048460400151611192565b612cd7565b505050505b610f2460015f80516020615cb183398151915255565b50565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115610f7457610f74615161565b6003811115610f8557610f85615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b905060018351600381111561101257611012615161565b14611033578251604051633b0d540d60e21b815261063c91906004016156de565b60048151600581111561104857611048615161565b0361105e5761105685612cfd565b505050505050565b5f8061107561106c89611fe6565b60400151612ee4565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b0384166156a8565b5f6111d382611a9c565b6080015192915050565b6111e8838383612718565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615c518339815191525f61122083611a9c565b519050600481600581111561123757611237615161565b14611257578060405163170cc93360e21b815260040161063c91906152f3565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c79565b6112db612904565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff16600381111561132857611328615161565b600381111561133957611339615161565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b2615161565b146113d3578051604051633b0d540d60e21b815261063c91906004016156de565b60046113e28260400151611a9c565b5160058111156113f4576113f4615161565b14611486575f61140385611fe6565b90505f806114148360400151612ee4565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612cfd565b50506114a760015f80516020615cb183398151915255565b5050565b5f80516020615c718339815191525f806114d06114c785611fe6565b6040015161313a565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f82815260068401602052604090208054611510906152c1565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a615161565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068401602052604081206115a591614f08565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612904565b611649848484346132f6565b905061166160015f80516020615cb183398151915255565b9392505050565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff1660038111156116b5576116b5615161565b60038111156116c6576116c6615161565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f615161565b14158015611760575060038151600381111561175d5761175d615161565b14155b15611781578051604051633b0d540d60e21b815261063c91906004016156de565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611f97565b6040518263ffffffff1660e01b815260040161180a9190615301565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615313565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615c718339815191529190611898906152c1565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e2615161565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e91906004016156f8565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615313565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f836134c4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612904565b611a7f8233346134d5565b9050611a9760015f80516020615cb183398151915255565b919050565b611aa4614f3f565b5f8281525f80516020615cd1833981519152602052604090819020815160e0810190925280545f80516020615c71833981519152929190829060ff166005811115611af157611af1615161565b6005811115611b0257611b02615161565b8152602001600182018054611b16906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b42906152c1565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615c71833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e9086908690615782565b90815260200160405180910390205491505092915050565b5f8381525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c518339815191529284929091829060ff166003811115611c9457611c94615161565b6003811115611ca557611ca5615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d32615161565b14611d53578251604051633b0d540d60e21b815261063c91906004016156de565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b031690615791565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e04615161565b03611f325760028401546080840151611e26916001600160401b031690615791565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761249e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea091906157b1565b6137aa565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee684613901565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f47615161565b03611f7b57611f5583613901565b5f898152600786016020526040902055611f6e88612cfd565b6001945050505050611661565b805160405163170cc93360e21b815261063c91906004016152f3565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561204a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207191908101906157dc565b915091508061209357604051636b2f19e960e01b815260040160405180910390fd5b8151156120b9578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120f5576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b6002811015612180576121488160016158ae565b6121539060086156a8565b61ffff168482815181106121695761216961539e565b016020015160f81c901b9190911790600101612134565b5061ffff8116156121aa5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612205576121c18160036158ae565b6121cc9060086156a8565b63ffffffff16856121de836002615673565b815181106121ee576121ee61539e565b016020015160f81c901b91909117906001016121ad565b5063ffffffff81161561222b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122805761224281601f6158ae565b61224d9060086156a8565b86612259836006615673565b815181106122695761226961539e565b016020015160f81c901b919091179060010161222e565b50949350505050565b60605f808335602085013560146122a58787016040890161533e565b6122b26060890189615359565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123386060850185615359565b90508110156120f5578161234f6060860186615359565b8381811061235f5761235f61539e565b905060200281019061237191906153b2565b61237b90806158c1565b905061238a6060870187615359565b8481811061239a5761239a61539e565b90506020028101906123ac91906153b2565b6123b690806158c1565b6123c36060890189615359565b868181106123d3576123d361539e565b90506020028101906123e591906153b2565b6123f39060208101906158c1565b61240060608b018b615359565b888181106124105761241061539e565b905060200281019061242291906153b2565b6124339060608101906040016150cc565b6040516020016124499796959493929190615903565b60408051601f19818403018152919052915060010161232b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261251091908101906157dc565b915091508061253257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612575573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125999190615313565b8251146125bf578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125fb576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061260a8460400151613a9e565b915091508187146126315760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615c51833981519152906001600160401b0390811690831611156126ee575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261270d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615c518339815191528161273186613c8f565b905061273c86612463565b61274b57600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127705733611278565b5f86815260058301602052604090205460a082015161279f91600160b01b90046001600160401b031690615791565b6001600160401b03168160c001516001600160401b031610156127e65760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127fe576127f7878661249e565b905061281c565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061284190611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156128aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ce9190615313565b905080846008015f8a81526020019081526020015f205f8282546128f29190615673565b90915550501515979650505050505050565b5f80516020615cb183398151915280546001190161293557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612944614f3f565b5f80516020615c718339815191525f806129606114c787611fe6565b91509150801561298757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129b8576129b8615161565b60058111156129c9576129c9615161565b81526020016001820180546129dd906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612a09906152c1565b8015612a545780601f10612a2b57610100808354040283529160200191612a54565b820191905f5260205f20905b815481529060010190602001808311612a3757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612abf57612abf615161565b14158015612ae05750600181516005811115612add57612add615161565b14155b15612b0157805160405163170cc93360e21b815261063c91906004016152f3565b600381516005811115612b1657612b16615161565b03612b245760048152612b29565b600581525b836008018160200151604051612b3f919061554f565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b8357612b83615161565b021790555060208201516001820190612b9c90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612c4257612c42615161565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612cc5575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613f73565b60015f80516020615cb183398151915255565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115612d4a57612d4a615161565b6003811115612d5b57612d5b615161565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e89575f84815260058701602052604090205461271090612e3b90600160a01b900461ffff16856156a8565b612e4591906156bf565b915081866008015f8681526020019081526020015f205f828254612e699190615673565b90915550612e79905082846158ae565b9050612e89856020015182612c79565b612e9e8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f1b57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612f6a57612f328160016158ae565b612f3d9060086156a8565b61ffff16868281518110612f5357612f5361539e565b016020015160f81c901b9190911790600101612f1e565b5061ffff811615612f945760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612fef57612fab8160036158ae565b612fb69060086156a8565b63ffffffff1687612fc8836002615673565b81518110612fd857612fd861539e565b016020015160f81c901b9190911790600101612f97565b5063ffffffff811660031461301757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561306c5761302e81601f6158ae565b6130399060086156a8565b88613045836006615673565b815181106130555761305561539e565b016020015160f81c901b919091179060010161301a565b505f805b60088110156130cb576130848160076158ae565b61308f9060086156a8565b6001600160401b0316896130a4836026615673565b815181106130b4576130b461539e565b016020015160f81c901b9190911790600101613070565b505f805b600881101561312a576130e38160076158ae565b6130ee9060086156a8565b6001600160401b03168a61310383602e615673565b815181106131135761311361539e565b016020015160f81c901b91909117906001016130cf565b5091989097509095509350505050565b5f80825160271461317057825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b60028110156131bf576131878160016158ae565b6131929060086156a8565b61ffff168582815181106131a8576131a861539e565b016020015160f81c901b9190911790600101613173565b5061ffff8116156131e95760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613244576132008160036158ae565b61320b9060086156a8565b63ffffffff168661321d836002615673565b8151811061322d5761322d61539e565b016020015160f81c901b91909117906001016131ec565b5063ffffffff811660021461326c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132c15761328381601f6158ae565b61328e9060086156a8565b8761329a836006615673565b815181106132aa576132aa61539e565b016020015160f81c901b919091179060010161326f565b505f866026815181106132d6576132d661539e565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615c5183398151915290600160401b900461ffff908116908616108061334a575061271061ffff8616115b1561336e57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b0390811690851610156133aa576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133bc5750806001015483115b156133dd5760405163222d164360e21b81526004810184905260240161063c565b825f6133e882610e01565b90505f6133f58983614006565b905060405180608001604052806134093390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6134cc61457e565b610f24816145c9565b5f5f80516020615c51833981519152816134ee84610e01565b90505f6134fa87611a9c565b905061350587612463565b613525576040516330efa98b60e01b81526004810188905260240161063c565b60028151600581111561353a5761353a615161565b1461355b57805160405163170cc93360e21b815261063c91906004016152f3565b5f82826080015161356c9190615791565b905083600201600a9054906101000a90046001600160401b03168260400151613595919061596c565b6001600160401b0316816001600160401b031611156135d257604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135de8a846137aa565b915091505f8a8360405160200161360c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561369f5761369f615161565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615cd1833981519152602052604081206002015481905f80516020615c7183398151915290600160801b90046001600160401b03166137f2858261463d565b5f6137fc87614860565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61384c8a858b611f97565b6040518263ffffffff1660e01b81526004016138689190615301565b6020604051808303815f875af1158015613884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138a89190615313565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615c5183398151915290505f6139218460400151611a9c565b90505f60038251600581111561393957613939615161565b1480613957575060048251600581111561395557613955615161565b145b15613967575060c08101516139a4565b60028251600581111561397c5761397c615161565b036139885750426139a4565b815160405163170cc93360e21b815261063c91906004016152f3565b84608001516001600160401b0316816001600160401b0316116139cb57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139f090611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a959190615313565b95945050505050565b5f808251602e14613ad457825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b2357613aeb8160016158ae565b613af69060086156a8565b61ffff16858281518110613b0c57613b0c61539e565b016020015160f81c901b9190911790600101613ad7565b5061ffff811615613b4d5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613ba857613b648160036158ae565b613b6f9060086156a8565b63ffffffff1686613b81836002615673565b81518110613b9157613b9161539e565b016020015160f81c901b9190911790600101613b50565b5063ffffffff811615613bce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c2357613be581601f6158ae565b613bf09060086156a8565b87613bfc836006615673565b81518110613c0c57613c0c61539e565b016020015160f81c901b9190911790600101613bd1565b505f805b6008811015613c8257613c3b8160076158ae565b613c469060086156a8565b6001600160401b031688613c5b836026615673565b81518110613c6b57613c6b61539e565b016020015160f81c901b9190911790600101613c27565b5090969095509350505050565b613c97614f3f565b5f8281525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff166005811115613ce457613ce4615161565b6005811115613cf557613cf5615161565b8152602001600182018054613d09906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054613d35906152c1565b8015613d805780601f10613d5757610100808354040283529160200191613d80565b820191905f5260205f20905b815481529060010190602001808311613d6357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dee57613dee615161565b14613e21575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e6557613e65615161565b021790555060208201516001820190613e7e90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f1c85826137aa565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f965760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fdf576040519150601f19603f3d011682016040523d82523d5f602084013e613fe4565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661404a57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615c718339815191524261406960608601604087016150cc565b6001600160401b03161115806140a357506140876202a30042615673565b61409760608601604087016150cc565b6001600160401b031610155b156140dd576140b860608501604086016150cc565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140f26140ed6060860186615997565b6148d5565b6141026140ed6080860186615997565b603061411160208601866158c1565b9050146141435761412560208501856158c1565b6040516326475b2f60e11b815261063c925060040190815260200190565b61414d84806158c1565b90505f0361417a5761415f84806158c1565b604051633e08a12560e11b815260040161063c9291906159ab565b5f6008820161418986806158c1565b604051614197929190615782565b908152602001604051809103902054146141d0576141b584806158c1565b60405163a41f772f60e01b815260040161063c9291906159ab565b6141da835f61463d565b6040805160e08101909152815481525f9081906142e690602081016141ff89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614247908a018a6158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161429060608a0160408b016150cc565b6001600160401b031681526020016142ab60608a018a615997565b6142b4906159d9565b81526020016142c660808a018a615997565b6142cf906159d9565b8152602001876001600160401b0316815250614a3e565b5f8281526006860160205260409020919350915061430482826155a4565b50816008840161431488806158c1565b604051614322929190615782565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061435e908590600401615301565b6020604051808303815f875af115801561437a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061439e9190615313565b6040805160e0810190915290915080600181526020016143be89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561444d5761444d615161565b02179055506020820151600182019061446690826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061450488806158c1565b604051614512929190615782565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061455091906150cc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166145c757604051631afcd79f60e31b815260040160405180910390fd5b565b6145d161457e565b6145da81614c2b565b6145e2614c44565b610f24606082013560808301356145ff60c0850160a086016150cc565b61460f60e0860160c08701615aa0565b614620610100870160e08801615ab9565b61010087013561463861014089016101208a0161533e565b614c54565b5f80516020615c718339815191525f6001600160401b0380841690851611156146715761466a83856157b1565b905061467e565b61467b84846157b1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146e05750600184015481516146dc916001600160401b031690615673565b8210155b15614706576001600160401b038316606082015281815260408101516020820152614725565b82816060018181516147189190615791565b6001600160401b03169052505b606081015161473590606461596c565b602082015160018601546001600160401b0392909216916147609190600160401b900460ff166156a8565b101561479057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b0316816040018181516147ab9190615673565b9052506040810180516001600160401b03871691906147cb9083906158ae565b905250600184015460408201516064916147f091600160401b90910460ff16906156a8565b1015614817578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615cd18339815191526020526040812060020180545f80516020615c7183398151915291906008906148aa90600160401b90046001600160401b0316615ad9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148e26020820182615075565b63ffffffff1615801561490257506148fd6020820182615359565b151590505b15614949576149146020820182615075565b6149216020830183615359565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149566020820182615359565b90506149656020830183615075565b63ffffffff16111561497e576149146020820182615075565b60015b61498e6020830183615359565b90508110156114a7576149a46020830183615359565b6149af6001846158ae565b8181106149be576149be61539e565b90506020020160208101906149d3919061533e565b6001600160a01b03166149e96020840184615359565b838181106149f9576149f961539e565b9050602002016020810190614a0e919061533e565b6001600160a01b03161015614a3657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614981565b5f6060826040015151603014614a675760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614aa8988a986001989297929690959094909390929101615af4565b60405160208183030381529060405290505f5b84608001516020015151811015614b1a57818560800151602001518281518110614ae757614ae761539e565b6020026020010151604051602001614b00929190615bae565b60408051601f198184030181529190529150600101614abb565b5060a0840151805160209182015151604051614b3a938593929101615be4565b60405160208183030381529060405290505f5b8460a001516020015151811015614bac57818560a00151602001518281518110614b7957614b7961539e565b6020026020010151604051602001614b92929190615bae565b60408051601f198184030181529190529150600101614b4d565b5060c0840151604051614bc3918391602001615c1f565b6040516020818303038152906040529050600281604051614be4919061554f565b602060405180830381855afa158015614bff573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c229190615313565b94909350915050565b614c3361457e565b614c3b614e10565b610f2481614e18565b614c4c61457e565b6145c7614f00565b614c5c61457e565b5f80516020615c5183398151915261ffff85161580614c80575061271061ffff8616115b15614ca457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614cc85760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614cdb5750600a60ff8516115b15614cfe5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614d65576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614d855760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6145c761457e565b614e2061457e565b80355f80516020615c718339815191529081556014614e456060840160408501615ab9565b60ff161180614e645750614e5f6060830160408401615ab9565b60ff16155b15614e9857614e796060830160408401615ab9565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614ea86060830160408401615ab9565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ed960408301602084016150cc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612cea61457e565b508054614f14906152c1565b5f825580601f10614f23575050565b601f0160209004905f5260205f2090810190610f249190614f7c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614f90575f8155600101614f7d565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215614fc6575f80fd5b833592506020840135614fd881614f94565b9150614fe660408501614fa1565b90509250925092565b5f60208284031215614fff575f80fd5b5035919050565b5f8060408385031215615017575f80fd5b82356001600160401b0381111561502c575f80fd5b83016080818603121561503d575f80fd5b915061504b60208401614fa1565b90509250929050565b5f8060408385031215615065575f80fd5b8235915061504b60208401614fa1565b5f60208284031215615085575f80fd5b61166182614fa1565b5f806040838503121561509f575f80fd5b6150a883614fa1565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f602082840312156150dc575f80fd5b611661826150b6565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615108575f80fd5b83356001600160401b0381111561511d575f80fd5b840160a0818703121561512e575f80fd5b925061513c602085016150e5565b9150614fe6604085016150b6565b5f610140828403121561515b575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061518557615185615161565b9052565b5f5b838110156151a357818101518382015260200161518b565b50505f910152565b5f81518084526151c2816020860160208601615189565b601f01601f19169290920160200192915050565b602081526151e8602082018351615175565b5f602083015160e060408401526152036101008401826151ab565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615267575f80fd5b82356001600160401b038082111561527d575f80fd5b818501915085601f830112615290575f80fd5b81358181111561529e575f80fd5b8660208285010111156152af575f80fd5b60209290920196919550909350505050565b600181811c908216806152d557607f821691505b60208210810361515b57634e487b7160e01b5f52602260045260245ffd5b60208101610e558284615175565b602081525f61166160208301846151ab565b5f60208284031215615323575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f6020828403121561534e575f80fd5b81356116618161532a565b5f808335601e1984360301811261536e575f80fd5b8301803591506001600160401b03821115615387575f80fd5b6020019150600581901b36038213156138fa575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153c6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615406576154066153d0565b60405290565b604080519081016001600160401b0381118282101715615406576154066153d0565b604051601f8201601f191681016001600160401b0381118282101715615456576154566153d0565b604052919050565b5f6001600160401b03821115615476576154766153d0565b50601f01601f191660200190565b5f82601f830112615493575f80fd5b81356154a66154a18261545e565b61542e565b8181528460208386010111156154ba575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156154e6575f80fd5b6154ee6153e4565b82356001600160401b0380821115615504575f80fd5b61551036838701615484565b83526020850135915080821115615525575f80fd5b5061553236828601615484565b602083015250615544604084016150b6565b604082015292915050565b5f82516153c6818460208701615189565b601f82111561064557805f5260205f20601f840160051c810160208510156155855750805b601f840160051c820191505b8181101561184a575f8155600101615591565b81516001600160401b038111156155bd576155bd6153d0565b6155d1816155cb84546152c1565b84615560565b602080601f831160018114615604575f84156155ed5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b8281101561563257888601518255948401946001909101908401615613565b508582101561564f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e5561565f565b5f63ffffffff80831681810361569e5761569e61565f565b6001019392505050565b8082028115828204841417610e5557610e5561565f565b5f826156d957634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106156f2576156f2615161565b91905290565b5f60208083525f845461570a816152c1565b806020870152604060018084165f811461572b576001811461574757615774565b60ff19851660408a0152604084151560051b8a01019550615774565b895f5260205f205f5b8581101561576b5781548b8201860152908301908801615750565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120f5576120f561565f565b6001600160401b038281168282160390808211156120f5576120f561565f565b8051611a9781614f94565b5f80604083850312156157ed575f80fd5b82516001600160401b0380821115615803575f80fd5b9084019060608287031215615816575f80fd5b61581e6153e4565b825181526020808401516158318161532a565b82820152604084015183811115615846575f80fd5b80850194505087601f85011261585a575f80fd5b8351925061586a6154a18461545e565b838152888285870101111561587d575f80fd5b61588c84838301848801615189565b806040840152508195506158a18188016157d1565b9450505050509250929050565b81810381811115610e5557610e5561565f565b5f808335601e198436030181126158d6575f80fd5b8301803591506001600160401b038211156158ef575f80fd5b6020019150368190038213156138fa575f80fd5b5f8851615914818460208d01615189565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461598f5761598f61565f565b505092915050565b5f8235603e198336030181126153c6575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156159e9575f80fd5b6159f161540c565b6159fa83614fa1565b81526020808401356001600160401b0380821115615a16575f80fd5b9085019036601f830112615a28575f80fd5b813581811115615a3a57615a3a6153d0565b8060051b9150615a4b84830161542e565b8181529183018401918481019036841115615a64575f80fd5b938501935b83851015615a8e5784359250615a7e8361532a565b8282529385019390850190615a69565b94860194909452509295945050505050565b5f60208284031215615ab0575f80fd5b611661826150e5565b5f60208284031215615ac9575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361569e5761569e61565f565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615b3a81602a850160208b01615189565b865190830190615b5181602a840160208b01615189565b60c087901b6001600160c01b031916602a9290910191820152615b83603282018660e01b6001600160e01b0319169052565b615b9c603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615bbf818460208801615189565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615bf5818460208901615189565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c30818460208801615189565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index 5f7f58817..a072d6ff7 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -80,7 +80,7 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613ae7380380613ae783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61399a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612c20565b610312565b005b610149610159366004612c4f565b610529565b61014961016c366004612c9d565b610a5b565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612c20565b610a69565b6040516001600160401b03909116815260200161018a565b610149610a7d565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612c20565b610a90565b6101cd61025a366004612ccc565b610aa5565b61014961026d366004612c9d565b610ac1565b6102216005600160991b0181565b6101cd5f8051602061394e83398151915281565b6101496102a2366004612c20565b610c4a565b6101e3601481565b6101496102bd366004612d25565b610d87565b6102d56102d0366004612c20565b610e95565b60405161018a9190612de2565b6101a66202a30081565b6101496102fa366004612e62565b610fe4565b6101cd61030d366004612e84565b611021565b5f8181525f8051602061396e8339815191526020526040808220815160e0810190925280545f8051602061394e83398151915293929190829060ff16600581111561035f5761035f612d61565b600581111561037057610370612d61565b815260200160018201805461038490612eef565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612eef565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612d61565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f61107c565b6040518263ffffffff1660e01b81526004016104e39190612f35565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612f47565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061394e8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612f47565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612e62565b6001600160a01b03161461065f5761063a6060840160408501612e62565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612f5e565b905090505f805b828163ffffffff161015610955575f6106906060880188612f5e565b8363ffffffff168181106106a6576106a6612fa3565b90506020028101906106b89190612fb7565b6106c190613178565b80516040519192505f9160088801916106d991613183565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612f35565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291613183565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612f47565b90508086600801835f01516040516107a89190613183565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612d61565b02179055506020820151600182019061084390826131df565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e89116856132b2565b82516040519195506108f991613183565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e906132c5565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff16836132e7565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110cb565b604001516111e1565b90505f6109c56109c088613320565b61136e565b90505f6002826040516109d89190613183565b602060405180830381855afa1580156109f3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a169190612f47565b9050828114610a4257604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a64816114a9565b505050565b5f610a7382610e95565b6080015192915050565b610a856117e7565b610a8e5f611842565b565b610a986117e7565b610aa1816118b2565b5050565b5f610aae6117e7565b610ab88383611b96565b90505b92915050565b5f8051602061394e8339815191525f80610ae6610add856110cb565b6040015161210e565b9150915080610b0c57604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b2690612eef565b90505f03610b4a5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b7057610b70612d61565b14610ba3575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b5f8281526006840160205260408120610bbb91612b94565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061394e8339815191529190610c9190612eef565b90505f03610cb55760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cdb57610cdb612d61565b14610d0e575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d4791906004016133f8565b6020604051808303815f875af1158015610d63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a649190612f47565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dcb5750825b90505f826001600160401b03166001148015610de65750303b155b905081158015610df4575080155b15610e125760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3c57845460ff60401b1916600160401b1785555b610e4687876122ca565b8315610e8c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e9d612bcb565b5f8281525f8051602061396e833981519152602052604090819020815160e0810190925280545f8051602061394e833981519152929190829060ff166005811115610eea57610eea612d61565b6005811115610efb57610efb612d61565b8152602001600182018054610f0f90612eef565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3b90612eef565b8015610f865780601f10610f5d57610100808354040283529160200191610f86565b820191905f5260205f20905b815481529060010190602001808311610f6957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fec6117e7565b6001600160a01b03811661101557604051631e4fbdf760e01b81525f6004820152602401610499565b61101e81611842565b50565b6040515f905f8051602061394e833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08906110649086908690613482565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561112f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261115691908101906134a0565b915091508061117857604051636b2f19e960e01b815260040160405180910390fd5b81511561119e578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111da576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461121657815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b60028110156112655761122d816001613572565b6112389060086132e7565b61ffff1684828151811061124e5761124e612fa3565b016020015160f81c901b9190911790600101611219565b5061ffff81161561128f5760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112ea576112a6816003613572565b6112b19060086132e7565b63ffffffff16856112c38360026132b2565b815181106112d3576112d3612fa3565b016020015160f81c901b9190911790600101611292565b5063ffffffff81161561131057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113655761132781601f613572565b6113329060086132e7565b8661133e8360066132b2565b8151811061134e5761134e612fa3565b016020015160f81c901b9190911790600101611313565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b8360600151518110156111da57818460600151828151811061140a5761140a612fa3565b60200260200101515f0151518560600151838151811061142c5761142c612fa3565b60200260200101515f01518660600151848151811061144d5761144d612fa3565b6020026020010151602001518760600151858151811061146f5761146f612fa3565b60200260200101516040015160405160200161148f959493929190613585565b60408051601f1981840301815291905291506001016113e6565b5f6114b2612bcb565b5f8051602061394e8339815191525f806114ce610add876110cb565b9150915080156114f557604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561152657611526612d61565b600581111561153757611537612d61565b815260200160018201805461154b90612eef565b80601f016020809104026020016040519081016040528092919081815260200182805461157790612eef565b80156115c25780601f10611599576101008083540402835291602001916115c2565b820191905f5260205f20905b8154815290600101906020018083116115a557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561162d5761162d612d61565b1415801561164e575060018151600581111561164b5761164b612d61565b14155b1561166f57805160405163170cc93360e21b81526104999190600401612f27565b60038151600581111561168457611684612d61565b036116925760048152611697565b600581525b8360080181602001516040516116ad9190613183565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156116f1576116f1612d61565b02179055506020820151600182019061170a90826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156117b0576117b0612d61565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118197f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a8e5760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6118ba612bcb565b5f8281525f8051602061396e8339815191526020526040808220815160e0810190925280545f8051602061394e83398151915293929190829060ff16600581111561190757611907612d61565b600581111561191857611918612d61565b815260200160018201805461192c90612eef565b80601f016020809104026020016040519081016040528092919081815260200182805461195890612eef565b80156119a35780601f1061197a576101008083540402835291602001916119a3565b820191905f5260205f20905b81548152906001019060200180831161198657829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611a1157611a11612d61565b14611a44575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611a8857611a88612d61565b021790555060208201516001820190611aa190826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611b3f85826122e4565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611bda57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061394e83398151915242611bf960608601604087016135fe565b6001600160401b0316111580611c335750611c176202a300426132b2565b611c2760608601604087016135fe565b6001600160401b031610155b15611c6d57611c4860608501604086016135fe565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611c82611c7d6060860186613617565b61243b565b611c92611c7d6080860186613617565b6030611ca1602086018661362b565b905014611cd357611cb5602085018561362b565b6040516326475b2f60e11b8152610499925060040190815260200190565b611cdd848061362b565b90505f03611d0a57611cef848061362b565b604051633e08a12560e11b815260040161049992919061366d565b5f60088201611d19868061362b565b604051611d27929190613482565b90815260200160405180910390205414611d6057611d45848061362b565b60405163a41f772f60e01b815260040161049992919061366d565b611d6a835f6125a4565b6040805160e08101909152815481525f908190611e769060208101611d8f898061362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611dd7908a018a61362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611e2060608a0160408b016135fe565b6001600160401b03168152602001611e3b60608a018a613617565b611e449061369b565b8152602001611e5660808a018a613617565b611e5f9061369b565b8152602001876001600160401b03168152506127c7565b5f82815260068601602052604090209193509150611e9482826131df565b508160088401611ea4888061362b565b604051611eb2929190613482565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611eee908590600401612f35565b6020604051808303815f875af1158015611f0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2e9190612f47565b6040805160e081019091529091508060018152602001611f4e898061362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115611fdd57611fdd612d61565b021790555060208201516001820190611ff690826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580612094888061362b565b6040516120a2929190613482565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906120e091906135fe565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80825160271461214457825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b60028110156121935761215b816001613572565b6121669060086132e7565b61ffff1685828151811061217c5761217c612fa3565b016020015160f81c901b9190911790600101612147565b5061ffff8116156121bd5760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b6004811015612218576121d4816003613572565b6121df9060086132e7565b63ffffffff16866121f18360026132b2565b8151811061220157612201612fa3565b016020015160f81c901b91909117906001016121c0565b5063ffffffff811660021461224057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122955761225781601f613572565b6122629060086132e7565b8761226e8360066132b2565b8151811061227e5761227e612fa3565b016020015160f81c901b9190911790600101612243565b505f866026815181106122aa576122aa612fa3565b016020015191976001600160f81b03199092161515965090945050505050565b6122d26129b4565b6122db826129fd565b610aa181612a16565b5f8281525f8051602061396e833981519152602052604081206002015481905f8051602061394e83398151915290600160801b90046001600160401b031661232c85826125a4565b5f61233687612a27565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123868a858b61107c565b6040518263ffffffff1660e01b81526004016123a29190612f35565b6020604051808303815f875af11580156123be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e29190612f47565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124486020820182612c9d565b63ffffffff1615801561246857506124636020820182612f5e565b151590505b156124af5761247a6020820182612c9d565b6124876020830183612f5e565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6124bc6020820182612f5e565b90506124cb6020830183612c9d565b63ffffffff1611156124e45761247a6020820182612c9d565b60015b6124f46020830183612f5e565b9050811015610aa15761250a6020830183612f5e565b612515600184613572565b81811061252457612524612fa3565b90506020020160208101906125399190612e62565b6001600160a01b031661254f6020840184612f5e565b8381811061255f5761255f612fa3565b90506020020160208101906125749190612e62565b6001600160a01b0316101561259c57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016124e7565b5f8051602061394e8339815191525f6001600160401b0380841690851611156125d8576125d1838561374b565b90506125e5565b6125e2848461374b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580612647575060018401548151612643916001600160401b0316906132b2565b8210155b1561266d576001600160401b03831660608201528181526040810151602082015261268c565b828160600181815161267f919061376b565b6001600160401b03169052505b606081015161269c90606461378b565b602082015160018601546001600160401b0392909216916126c79190600160401b900460ff166132e7565b10156126f757606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b03168160400181815161271291906132b2565b9052506040810180516001600160401b0387169190612732908390613572565b9052506001840154604082015160649161275791600160401b90910460ff16906132e7565b101561277e578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146127f05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98612831988a9860019892979296909590949093909291016137b6565b60405160208183030381529060405290505f5b846080015160200151518110156128a35781856080015160200151828151811061287057612870612fa3565b6020026020010151604051602001612889929190613870565b60408051601f198184030181529190529150600101612844565b5060a08401518051602091820151516040516128c39385939291016138a6565b60405160208183030381529060405290505f5b8460a00151602001515181101561293557818560a0015160200151828151811061290257612902612fa3565b602002602001015160405160200161291b929190613870565b60408051601f1981840301815291905291506001016128d6565b5060c084015160405161294c9183916020016138e1565b604051602081830303815290604052905060028160405161296d9190613183565b602060405180830381855afa158015612988573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129ab9190612f47565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8e57604051631afcd79f60e31b815260040160405180910390fd5b612a056129b4565b612a0d612a9c565b61101e81612aa4565b612a1e6129b4565b61101e81612b8c565b5f8181525f8051602061396e8339815191526020526040812060020180545f8051602061394e8339815191529190600890612a7190600160401b90046001600160401b0316613912565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a8e6129b4565b612aac6129b4565b80355f8051602061394e8339815191529081556014612ad1606084016040850161392d565b60ff161180612af05750612aeb606083016040840161392d565b60ff16155b15612b2457612b05606083016040840161392d565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612b34606083016040840161392d565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612b6560408301602084016135fe565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fec6129b4565b508054612ba090612eef565b5f825580601f10612baf575050565b601f0160209004905f5260205f209081019061101e9190612c08565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612c1c575f8155600101612c09565b5090565b5f60208284031215612c30575f80fd5b5035919050565b803563ffffffff81168114612c4a575f80fd5b919050565b5f8060408385031215612c60575f80fd5b82356001600160401b03811115612c75575f80fd5b830160808186031215612c86575f80fd5b9150612c9460208401612c37565b90509250929050565b5f60208284031215612cad575f80fd5b610ab882612c37565b80356001600160401b0381168114612c4a575f80fd5b5f8060408385031215612cdd575f80fd5b82356001600160401b03811115612cf2575f80fd5b830160a08186031215612d03575f80fd5b9150612c9460208401612cb6565b6001600160a01b038116811461101e575f80fd5b5f808284036080811215612d37575f80fd5b6060811215612d44575f80fd5b508291506060830135612d5681612d11565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612d9157634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612daf578181015183820152602001612d97565b50505f910152565b5f8151808452612dce816020860160208601612d95565b601f01601f19169290920160200192915050565b60208152612df4602082018351612d75565b5f602083015160e06040840152612e0f610100840182612db7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612e72575f80fd5b8135612e7d81612d11565b9392505050565b5f8060208385031215612e95575f80fd5b82356001600160401b0380821115612eab575f80fd5b818501915085601f830112612ebe575f80fd5b813581811115612ecc575f80fd5b866020828501011115612edd575f80fd5b60209290920196919550909350505050565b600181811c90821680612f0357607f821691505b602082108103612f2157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610abb8284612d75565b602081525f610ab86020830184612db7565b5f60208284031215612f57575f80fd5b5051919050565b5f808335601e19843603018112612f73575f80fd5b8301803591506001600160401b03821115612f8c575f80fd5b6020019150600581901b3603821315612434575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612fcb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561300b5761300b612fd5565b60405290565b604051608081016001600160401b038111828210171561300b5761300b612fd5565b604080519081016001600160401b038111828210171561300b5761300b612fd5565b604051601f8201601f191681016001600160401b038111828210171561307d5761307d612fd5565b604052919050565b5f6001600160401b0382111561309d5761309d612fd5565b50601f01601f191660200190565b5f82601f8301126130ba575f80fd5b81356130cd6130c882613085565b613055565b8181528460208386010111156130e1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060828403121561310d575f80fd5b613115612fe9565b905081356001600160401b038082111561312d575f80fd5b613139858386016130ab565b8352602084013591508082111561314e575f80fd5b5061315b848285016130ab565b60208301525061316d60408301612cb6565b604082015292915050565b5f610abb36836130fd565b5f8251612fcb818460208701612d95565b601f821115610a6457805f5260205f20601f840160051c810160208510156131b95750805b601f840160051c820191505b818110156131d8575f81556001016131c5565b5050505050565b81516001600160401b038111156131f8576131f8612fd5565b61320c816132068454612eef565b84613194565b602080601f83116001811461323f575f84156132285750858301515b5f19600386901b1c1916600185901b178555613296565b5f85815260208120601f198616915b8281101561326d5788860151825594840194600190910190840161324e565b508582101561328a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610abb57610abb61329e565b5f63ffffffff8083168181036132dd576132dd61329e565b6001019392505050565b8082028115828204841417610abb57610abb61329e565b5f6001600160401b0382111561331657613316612fd5565b5060051b60200190565b5f60808236031215613330575f80fd5b613338613011565b8235815260208084013581830152604084013561335481612d11565b604083015260608401356001600160401b0380821115613372575f80fd5b9085019036601f830112613384575f80fd5b81356133926130c8826132fe565b81815260059190911b830184019084810190368311156133b0575f80fd5b8585015b838110156133e6578035858111156133ca575f80fd5b6133d83689838a01016130fd565b8452509186019186016133b4565b50606087015250939695505050505050565b5f60208083525f845461340a81612eef565b806020870152604060018084165f811461342b576001811461344757613474565b60ff19851660408a0152604084151560051b8a01019550613474565b895f5260205f205f5b8581101561346b5781548b8201860152908301908801613450565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612c4a575f80fd5b5f80604083850312156134b1575f80fd5b82516001600160401b03808211156134c7575f80fd5b90840190606082870312156134da575f80fd5b6134e2612fe9565b825181526020808401516134f581612d11565b8282015260408401518381111561350a575f80fd5b80850194505087601f85011261351e575f80fd5b8351925061352e6130c884613085565b8381528882858701011115613541575f80fd5b61355084838301848801612d95565b80604084015250819550613565818801613491565b9450505050509250929050565b81810381811115610abb57610abb61329e565b5f8651613596818460208b01612d95565b60e087901b6001600160e01b03191690830190815285516135be816004840160208a01612d95565b85519101906135d4816004840160208901612d95565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b5f6020828403121561360e575f80fd5b610ab882612cb6565b5f8235603e19833603018112612fcb575f80fd5b5f808335601e19843603018112613640575f80fd5b8301803591506001600160401b03821115613659575f80fd5b602001915036819003821315612434575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156136ab575f80fd5b6136b3613033565b6136bc83612c37565b81526020808401356001600160401b038111156136d7575f80fd5b840136601f8201126136e7575f80fd5b80356136f56130c8826132fe565b81815260059190911b82018301908381019036831115613713575f80fd5b928401925b8284101561373a57833561372b81612d11565b82529284019290840190613718565b938501939093525091949350505050565b6001600160401b038281168282160390808211156111da576111da61329e565b6001600160401b038181168382160190808211156111da576111da61329e565b6001600160401b038181168382160280821691908281146137ae576137ae61329e565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516137fc81602a850160208b01612d95565b86519083019061381381602a840160208b01612d95565b60c087901b6001600160c01b031916602a9290910191820152613845603282018660e01b6001600160e01b0319169052565b61385e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351613881818460208801612d95565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516138b7818460208901612d95565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516138f2818460208801612d95565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b038083168181036132dd576132dd61329e565b5f6020828403121561393d575f80fd5b813560ff81168114612e7d575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051613a5c380380613a5c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61390f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612cb7565b610312565b005b610149610159366004612ce6565b610529565b61014961016c366004612d34565b610a53565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612cb7565b610a61565b6040516001600160401b03909116815260200161018a565b610149610a75565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612cb7565b610a88565b6101cd61025a366004612d63565b610a9d565b61014961026d366004612d34565b610ab9565b6102216005600160991b0181565b6101cd5f805160206138c383398151915281565b6101496102a2366004612cb7565b610c42565b6101e3601481565b6101496102bd366004612dbc565b610d7f565b6102d56102d0366004612cb7565b610e8d565b60405161018a9190612e79565b6101a66202a30081565b6101496102fa366004612ef9565b610fdc565b6101cd61030d366004612f1b565b611019565b5f8181525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561035f5761035f612df8565b600581111561037057610370612df8565b815260200160018201805461038490612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612f86565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612df8565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611074565b6040518263ffffffff1660e01b81526004016104e39190612fcc565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612fde565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206138c38339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612fde565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612ef9565b6001600160a01b03161461065f5761063a6060840160408501612ef9565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612ff5565b905090505f805b828163ffffffff161015610955575f6106906060880188612ff5565b8363ffffffff168181106106a6576106a661303a565b90506020028101906106b8919061304e565b6106c190613172565b80516040519192505f9160088801916106d9916131eb565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612fcc565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610752916131eb565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612fde565b90508086600801835f01516040516107a891906131eb565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612df8565b0217905550602082015160018201906108439082613247565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e891168561331a565b82516040519195506108f9916131eb565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e9061332d565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff168361334f565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110c3565b604001516111d9565b90505f6109bd87611366565b90505f6002826040516109d091906131eb565b602060405180830381855afa1580156109eb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a0e9190612fde565b9050828114610a3a57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a5c81611540565b505050565b5f610a6b82610e8d565b6080015192915050565b610a7d61187e565b610a865f6118d9565b565b610a9061187e565b610a9981611949565b5050565b5f610aa661187e565b610ab08383611c2d565b90505b92915050565b5f805160206138c38339815191525f80610ade610ad5856110c3565b604001516121a5565b9150915080610b0457604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b1e90612f86565b90505f03610b425760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b6857610b68612df8565b14610b9b575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f8281526006840160205260408120610bb391612c2b565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206138c38339815191529190610c8990612f86565b90505f03610cad5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cd357610cd3612df8565b14610d06575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d3f9190600401613366565b6020604051808303815f875af1158015610d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190612fde565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dc35750825b90505f826001600160401b03166001148015610dde5750303b155b905081158015610dec575080155b15610e0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3457845460ff60401b1916600160401b1785555b610e3e8787612361565b8315610e8457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e95612c62565b5f8281525f805160206138e3833981519152602052604090819020815160e0810190925280545f805160206138c3833981519152929190829060ff166005811115610ee257610ee2612df8565b6005811115610ef357610ef3612df8565b8152602001600182018054610f0790612f86565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3390612f86565b8015610f7e5780601f10610f5557610100808354040283529160200191610f7e565b820191905f5260205f20905b815481529060010190602001808311610f6157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fe461187e565b6001600160a01b03811661100d57604051631e4fbdf760e01b81525f6004820152602401610499565b611016816118d9565b50565b6040515f905f805160206138c3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061105c90869086906133f0565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611127573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261114e919081019061340e565b915091508061117057604051636b2f19e960e01b815260040160405180910390fd5b815115611196578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111d2576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461120e57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561125d576112258160016134e0565b61123090600861334f565b61ffff168482815181106112465761124661303a565b016020015160f81c901b9190911790600101611211565b5061ffff8116156112875760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112e25761129e8160036134e0565b6112a990600861334f565b63ffffffff16856112bb83600261331a565b815181106112cb576112cb61303a565b016020015160f81c901b919091179060010161128a565b5063ffffffff81161561130857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561135d5761131f81601f6134e0565b61132a90600861334f565b8661133683600661331a565b815181106113465761134661303a565b016020015160f81c901b919091179060010161130b565b50949350505050565b60605f8083356020850135601461138287870160408901612ef9565b61138f6060890189612ff5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6114156060850185612ff5565b90508110156111d2578161142c6060860186612ff5565b8381811061143c5761143c61303a565b905060200281019061144e919061304e565b61145890806134f3565b90506114676060870187612ff5565b848181106114775761147761303a565b9050602002810190611489919061304e565b61149390806134f3565b6114a06060890189612ff5565b868181106114b0576114b061303a565b90506020028101906114c2919061304e565b6114d09060208101906134f3565b6114dd60608b018b612ff5565b888181106114ed576114ed61303a565b90506020028101906114ff919061304e565b611510906060810190604001613535565b604051602001611526979695949392919061354e565b60408051601f198184030181529190529150600101611408565b5f611549612c62565b5f805160206138c38339815191525f80611565610ad5876110c3565b91509150801561158c57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156115bd576115bd612df8565b60058111156115ce576115ce612df8565b81526020016001820180546115e290612f86565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90612f86565b80156116595780601f1061163057610100808354040283529160200191611659565b820191905f5260205f20905b81548152906001019060200180831161163c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156116c4576116c4612df8565b141580156116e557506001815160058111156116e2576116e2612df8565b14155b1561170657805160405163170cc93360e21b81526104999190600401612fbe565b60038151600581111561171b5761171b612df8565b03611729576004815261172e565b600581525b83600801816020015160405161174491906131eb565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561178857611788612df8565b0217905550602082015160018201906117a19082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561184757611847612df8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118b07f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a865760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611951612c62565b5f8281525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561199e5761199e612df8565b60058111156119af576119af612df8565b81526020016001820180546119c390612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546119ef90612f86565b8015611a3a5780601f10611a1157610100808354040283529160200191611a3a565b820191905f5260205f20905b815481529060010190602001808311611a1d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611aa857611aa8612df8565b14611adb575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b1f57611b1f612df8565b021790555060208201516001820190611b389082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bd6858261237b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c7157604051637fab81e560e01b815260040160405180910390fd5b5f805160206138c383398151915242611c906060860160408701613535565b6001600160401b0316111580611cca5750611cae6202a3004261331a565b611cbe6060860160408701613535565b6001600160401b031610155b15611d0457611cdf6060850160408601613535565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611d19611d1460608601866135b7565b6124d2565b611d29611d1460808601866135b7565b6030611d3860208601866134f3565b905014611d6a57611d4c60208501856134f3565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d7484806134f3565b90505f03611da157611d8684806134f3565b604051633e08a12560e11b81526004016104999291906135cb565b5f60088201611db086806134f3565b604051611dbe9291906133f0565b90815260200160405180910390205414611df757611ddc84806134f3565b60405163a41f772f60e01b81526004016104999291906135cb565b611e01835f61263b565b6040805160e08101909152815481525f908190611f0d9060208101611e2689806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e6e908a018a6134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611eb760608a0160408b01613535565b6001600160401b03168152602001611ed260608a018a6135b7565b611edb906135f9565b8152602001611eed60808a018a6135b7565b611ef6906135f9565b8152602001876001600160401b031681525061285e565b5f82815260068601602052604090209193509150611f2b8282613247565b508160088401611f3b88806134f3565b604051611f499291906133f0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f85908590600401612fcc565b6020604051808303815f875af1158015611fa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc59190612fde565b6040805160e081019091529091508060018152602001611fe589806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561207457612074612df8565b02179055506020820151600182019061208d9082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061212b88806134f3565b6040516121399291906133f0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906121779190613535565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8082516027146121db57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b600281101561222a576121f28160016134e0565b6121fd90600861334f565b61ffff168582815181106122135761221361303a565b016020015160f81c901b91909117906001016121de565b5061ffff8116156122545760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122af5761226b8160036134e0565b61227690600861334f565b63ffffffff168661228883600261331a565b815181106122985761229861303a565b016020015160f81c901b9190911790600101612257565b5063ffffffff81166002146122d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561232c576122ee81601f6134e0565b6122f990600861334f565b8761230583600661331a565b815181106123155761231561303a565b016020015160f81c901b91909117906001016122da565b505f866026815181106123415761234161303a565b016020015191976001600160f81b03199092161515965090945050505050565b612369612a4b565b61237282612a94565b610a9981612aad565b5f8281525f805160206138e3833981519152602052604081206002015481905f805160206138c383398151915290600160801b90046001600160401b03166123c3858261263b565b5f6123cd87612abe565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241d8a858b611074565b6040518263ffffffff1660e01b81526004016124399190612fcc565b6020604051808303815f875af1158015612455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124799190612fde565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124df6020820182612d34565b63ffffffff161580156124ff57506124fa6020820182612ff5565b151590505b15612546576125116020820182612d34565b61251e6020830183612ff5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6125536020820182612ff5565b90506125626020830183612d34565b63ffffffff16111561257b576125116020820182612d34565b60015b61258b6020830183612ff5565b9050811015610a99576125a16020830183612ff5565b6125ac6001846134e0565b8181106125bb576125bb61303a565b90506020020160208101906125d09190612ef9565b6001600160a01b03166125e66020840184612ff5565b838181106125f6576125f661303a565b905060200201602081019061260b9190612ef9565b6001600160a01b0316101561263357604051630dbc8d5f60e31b815260040160405180910390fd5b60010161257e565b5f805160206138c38339815191525f6001600160401b03808416908516111561266f5761266883856136c0565b905061267c565b61267984846136c0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806126de5750600184015481516126da916001600160401b03169061331a565b8210155b15612704576001600160401b038316606082015281815260408101516020820152612723565b828160600181815161271691906136e0565b6001600160401b03169052505b6060810151612733906064613700565b602082015160018601546001600160401b03929092169161275e9190600160401b900460ff1661334f565b101561278e57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516127a9919061331a565b9052506040810180516001600160401b03871691906127c99083906134e0565b905250600184015460408201516064916127ee91600160401b90910460ff169061334f565b1015612815578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146128875760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986128c8988a98600198929792969095909490939092910161372b565b60405160208183030381529060405290505f5b8460800151602001515181101561293a578185608001516020015182815181106129075761290761303a565b60200260200101516040516020016129209291906137e5565b60408051601f1981840301815291905291506001016128db565b5060a084015180516020918201515160405161295a93859392910161381b565b60405160208183030381529060405290505f5b8460a0015160200151518110156129cc57818560a001516020015182815181106129995761299961303a565b60200260200101516040516020016129b29291906137e5565b60408051601f19818403018152919052915060010161296d565b5060c08401516040516129e3918391602001613856565b6040516020818303038152906040529050600281604051612a0491906131eb565b602060405180830381855afa158015612a1f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a429190612fde565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8657604051631afcd79f60e31b815260040160405180910390fd5b612a9c612a4b565b612aa4612b33565b61101681612b3b565b612ab5612a4b565b61101681612c23565b5f8181525f805160206138e38339815191526020526040812060020180545f805160206138c38339815191529190600890612b0890600160401b90046001600160401b0316613887565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a86612a4b565b612b43612a4b565b80355f805160206138c38339815191529081556014612b6860608401604085016138a2565b60ff161180612b875750612b8260608301604084016138a2565b60ff16155b15612bbb57612b9c60608301604084016138a2565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612bcb60608301604084016138a2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612bfc6040830160208401613535565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fe4612a4b565b508054612c3790612f86565b5f825580601f10612c46575050565b601f0160209004905f5260205f20908101906110169190612c9f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612cb3575f8155600101612ca0565b5090565b5f60208284031215612cc7575f80fd5b5035919050565b803563ffffffff81168114612ce1575f80fd5b919050565b5f8060408385031215612cf7575f80fd5b82356001600160401b03811115612d0c575f80fd5b830160808186031215612d1d575f80fd5b9150612d2b60208401612cce565b90509250929050565b5f60208284031215612d44575f80fd5b610ab082612cce565b80356001600160401b0381168114612ce1575f80fd5b5f8060408385031215612d74575f80fd5b82356001600160401b03811115612d89575f80fd5b830160a08186031215612d9a575f80fd5b9150612d2b60208401612d4d565b6001600160a01b0381168114611016575f80fd5b5f808284036080811215612dce575f80fd5b6060811215612ddb575f80fd5b508291506060830135612ded81612da8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612e2857634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612e46578181015183820152602001612e2e565b50505f910152565b5f8151808452612e65816020860160208601612e2c565b601f01601f19169290920160200192915050565b60208152612e8b602082018351612e0c565b5f602083015160e06040840152612ea6610100840182612e4e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612f09575f80fd5b8135612f1481612da8565b9392505050565b5f8060208385031215612f2c575f80fd5b82356001600160401b0380821115612f42575f80fd5b818501915085601f830112612f55575f80fd5b813581811115612f63575f80fd5b866020828501011115612f74575f80fd5b60209290920196919550909350505050565b600181811c90821680612f9a57607f821691505b602082108103612fb857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ab38284612e0c565b602081525f610ab06020830184612e4e565b5f60208284031215612fee575f80fd5b5051919050565b5f808335601e1984360301811261300a575f80fd5b8301803591506001600160401b03821115613023575f80fd5b6020019150600581901b36038213156124cb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613062575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130a2576130a261306c565b60405290565b604080519081016001600160401b03811182821017156130a2576130a261306c565b604051601f8201601f191681016001600160401b03811182821017156130f2576130f261306c565b604052919050565b5f6001600160401b038211156131125761311261306c565b50601f01601f191660200190565b5f82601f83011261312f575f80fd5b813561314261313d826130fa565b6130ca565b818152846020838601011115613156575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215613182575f80fd5b61318a613080565b82356001600160401b03808211156131a0575f80fd5b6131ac36838701613120565b835260208501359150808211156131c1575f80fd5b506131ce36828601613120565b6020830152506131e060408401612d4d565b604082015292915050565b5f8251613062818460208701612e2c565b601f821115610a5c57805f5260205f20601f840160051c810160208510156132215750805b601f840160051c820191505b81811015613240575f815560010161322d565b5050505050565b81516001600160401b038111156132605761326061306c565b6132748161326e8454612f86565b846131fc565b602080601f8311600181146132a7575f84156132905750858301515b5f19600386901b1c1916600185901b1785556132fe565b5f85815260208120601f198616915b828110156132d5578886015182559484019460019091019084016132b6565b50858210156132f257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ab357610ab3613306565b5f63ffffffff80831681810361334557613345613306565b6001019392505050565b8082028115828204841417610ab357610ab3613306565b5f60208083525f845461337881612f86565b806020870152604060018084165f811461339957600181146133b5576133e2565b60ff19851660408a0152604084151560051b8a010195506133e2565b895f5260205f205f5b858110156133d95781548b82018601529083019088016133be565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612ce1575f80fd5b5f806040838503121561341f575f80fd5b82516001600160401b0380821115613435575f80fd5b9084019060608287031215613448575f80fd5b613450613080565b8251815260208084015161346381612da8565b82820152604084015183811115613478575f80fd5b80850194505087601f85011261348c575f80fd5b8351925061349c61313d846130fa565b83815288828587010111156134af575f80fd5b6134be84838301848801612e2c565b806040840152508195506134d38188016133ff565b9450505050509250929050565b81810381811115610ab357610ab3613306565b5f808335601e19843603018112613508575f80fd5b8301803591506001600160401b03821115613521575f80fd5b6020019150368190038213156124cb575f80fd5b5f60208284031215613545575f80fd5b610ab082612d4d565b5f885161355f818460208d01612e2c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112613062575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215613609575f80fd5b6136116130a8565b61361a83612cce565b81526020808401356001600160401b0380821115613636575f80fd5b9085019036601f830112613648575f80fd5b81358181111561365a5761365a61306c565b8060051b915061366b8483016130ca565b8181529183018401918481019036841115613684575f80fd5b938501935b838510156136ae578435925061369e83612da8565b8282529385019390850190613689565b94860194909452509295945050505050565b6001600160401b038281168282160390808211156111d2576111d2613306565b6001600160401b038181168382160190808211156111d2576111d2613306565b6001600160401b0381811683821602808216919082811461372357613723613306565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161377181602a850160208b01612e2c565b86519083019061378881602a840160208b01612e2c565b60c087901b6001600160c01b031916602a92909101918201526137ba603282018660e01b6001600160e01b0319169052565b6137d3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516137f6818460208801612e2c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161382c818460208901612e2c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351613867818460208801612e2c565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361334557613345613306565b5f602082840312156138b2575f80fd5b813560ff81168114612f14575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 4c13db388..ca836eb5a 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -148,7 +148,7 @@ library ValidatorMessages { * @param subnetConversionData The struct representing data to pack into the message. * @return The packed message. */ - function packSubnetConversionData(SubnetConversionData memory subnetConversionData) + function packSubnetConversionData(SubnetConversionData calldata subnetConversionData) internal pure returns (bytes memory) From 1591fced65881329d2b32b843e721354233fa8d8 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 10:57:41 -0400 Subject: [PATCH 05/10] Type to memory --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/validator-manager/ValidatorMessages.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 126411919..8f0696093 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenAddress\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161613f38038061613f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ff28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615210565b6104b3565b005b61021461022436600461524b565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615210565b6106f6565b610214610269366004615262565b610701565b61021461027c3660046152b0565b610c2b565b61029461028f36600461524b565b610c9f565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615210565b610cf9565b6102146102e93660046152d1565b610d04565b6103016102fc366004615311565b610dc5565b60405190815260200161023f565b61021461031d366004615376565b610dfa565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d36600461539e565b611065565b61029461036036600461524b565b61109c565b6103015f81565b61021461037a366004615210565b6110b0565b610231603081565b61021461039536600461524b565b6110db565b6102146103a8366004615376565b6111a6565b6103016103bb3660046153b7565b61137e565b6102146103ce3660046152d1565b6113aa565b6103015f80516020615f4683398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b36600461524b565b611533565b6103015f80516020615f6683398151915281565b61021461044236600461524b565b61171c565b610231601481565b61046261045d36600461524b565b611859565b60405161023f919061544c565b6102946202a30081565b6103015f80516020615f2683398151915281565b61021461049b3660046154e0565b6119a8565b6103016104ae36600461551e565b611a87565b6104be838383611ae2565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115610535576105356153d7565b6005811115610546576105466153d7565b815260200160018201805461055a90615589565b80601f016020809104026020016040519081016040528092919081815260200182805461058690615589565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c6153d7565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e3a565b6040518263ffffffff1660e01b81526004016106b091906155cf565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f091906155e1565b50505050565b6106f0838383611ae2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f668339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906155e1565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f460608501604086016155f8565b6001600160a01b0316146108375761081260608401604085016155f8565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f6108456060850185615613565b905090505f805b828163ffffffff161015610b2d575f6108686060880188615613565b8363ffffffff1681811061087e5761087e615658565b9050602002810190610890919061566c565b61089990615790565b80516040519192505f9160088801916108b191615809565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da91906004016155cf565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a91615809565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061096891906155e1565b90508086600801835f01516040516109809190615809565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a026153d7565b021790555060208201516001820190610a1b908261585e565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac091168561592d565b8251604051919550610ad191615809565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b2690615940565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff1683615962565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e89565b60400151611f9f565b90505f610b958761212c565b90505f600282604051610ba89190615809565b602060405180830381855afa158015610bc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610be691906155e1565b9050828114610c1257604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3482612306565b610c54576040516330efa98b60e01b8152600481018390526024016104da565b5f610c5e83611859565b5190506002816005811115610c7557610c756153d7565b14610c95578060405163170cc93360e21b81526004016104da91906155c1565b6106f08383612341565b5f805f80516020615f4683398151915260030154610cbd9084615979565b9050801580610cd257506001600160401b0381115b15610cf35760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f08383836125bb565b610d0c6127a7565b5f80516020615f468339815191525f80610d25846127de565b91509150610d3282612306565b610d3e57505050610dac565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d6c57610d6c6153d7565b03610d91575f83815260088501602052604081208054919055610d8f8282612b1c565b505b610da781610da28460400151611065565b612b92565b505050505b610dc260015f80516020615fa683398151915255565b50565b5f610dce6127a7565b610dda85858585612bc8565b9050610df260015f80516020615fa683398151915255565b949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115610e4757610e476153d7565b6003811115610e5857610e586153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ece82611859565b9050600183516003811115610ee557610ee56153d7565b14610f06578251604051633b0d540d60e21b81526104da9190600401615998565b600481516005811115610f1b57610f1b6153d7565b03610f3157610f2985612da1565b505050505050565b5f80610f48610f3f89611e89565b60400151612f88565b5091509150818414610f7557846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fae5750806001600160401b03168560a001516001600160401b0316115b15610fd757604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cf3906001600160401b038416615962565b5f6110a682611859565b6080015192915050565b6110bb8383836125bb565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615f468339815191525f6110f383611859565b519050600481600581111561110a5761110a6153d7565b1461112a578060405163170cc93360e21b81526004016104da91906155c1565b5f8381526005830160205260409020546001600160a01b0316331461117057335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612b1c565b6111ae6127a7565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff1660038111156111fb576111fb6153d7565b600381111561120c5761120c6153d7565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611285576112856153d7565b146112a6578051604051633b0d540d60e21b81526104da9190600401615998565b60046112b58260400151611859565b5160058111156112c7576112c76153d7565b14611359575f6112d685611e89565b90505f806112e78360400151612f88565b5091509150818460400151146113135760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135557604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136283612da1565b505061137a60015f80516020615fa683398151915255565b5050565b5f6113876127a7565b6113928333846131de565b9050610cf360015f80516020615fa683398151915255565b5f80516020615f668339815191525f806113cf6113c685611e89565b604001516134b6565b91509150806113f557604051632d07135360e01b815281151560048201526024016104da565b5f8281526006840160205260409020805461140f90615589565b90505f036114335760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff166005811115611459576114596153d7565b1461148c575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068401602052604081206114a49161515f565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115611580576115806153d7565b6003811115611591576115916153d7565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561160a5761160a6153d7565b1415801561162b5750600381516003811115611628576116286153d7565b14155b1561164c578051604051633b0d540d60e21b81526104da9190600401615998565b5f61165a8260400151611859565b905080606001516001600160401b03165f0361168c576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116b9846040015184606001518560800151611e3a565b6040518263ffffffff1660e01b81526004016116d591906155cf565b6020604051808303815f875af11580156116f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171591906155e1565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615f66833981519152919061176390615589565b90505f036117875760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117ad576117ad6153d7565b146117e0575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161181991906004016159b2565b6020604051808303815f875af1158015611835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e391906155e1565b611861615196565b5f8281525f80516020615fc6833981519152602052604090819020815160e0810190925280545f80516020615f66833981519152929190829060ff1660058111156118ae576118ae6153d7565b60058111156118bf576118bf6153d7565b81526020016001820180546118d390615589565b80601f01602080910402602001604051908101604052809291908181526020018280546118ff90615589565b801561194a5780601f106119215761010080835404028352916020019161194a565b820191905f5260205f20905b81548152906001019060200180831161192d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f1575080546001600160401b03808416911610155b15611a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a3a8484613672565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615f66833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611aca9086908690615a3c565b90815260200160405180910390205491505092915050565b5f8381525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f468339815191529284929091829060ff166003811115611b3057611b306153d7565b6003811115611b4157611b416153d7565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bb782611859565b9050600283516003811115611bce57611bce6153d7565b14611bef578251604051633b0d540d60e21b81526104da9190600401615998565b60208301516001600160a01b03163314611c8b575f8281526005850160205260409020546001600160a01b03163314611c28573361114b565b5f82815260058501602052604090205460a0820151611c5791600160b01b90046001600160401b031690615a4b565b6001600160401b0316421015611c8b5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca057611ca06153d7565b03611dce5760028401546080840151611cc2916001600160401b031690615a4b565b6001600160401b0316421015611cf65760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d0857611d068287612341565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d41918491611d3c9190615a6b565b61368c565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d82846137e3565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e339350505050565b600481516005811115611de357611de36153d7565b03611e1757611df1836137e3565b5f898152600786016020526040902055611e0a88612da1565b6001945050505050611e33565b805160405163170cc93360e21b81526104da91906004016155c1565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615a96565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b815115611f5c578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611f98576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fd457815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202357611feb816001615b68565b611ff6906008615962565b61ffff1684828151811061200c5761200c615658565b016020015160f81c901b9190911790600101611fd7565b5061ffff81161561204d5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120a857612064816003615b68565b61206f906008615962565b63ffffffff168561208183600261592d565b8151811061209157612091615658565b016020015160f81c901b9190911790600101612050565b5063ffffffff8116156120ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612123576120e581601f615b68565b6120f0906008615962565b866120fc83600661592d565b8151811061210c5761210c615658565b016020015160f81c901b91909117906001016120d1565b50949350505050565b60605f80833560208501356014612148878701604089016155f8565b6121556060890189615613565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121db6060850185615613565b9050811015611f9857816121f26060860186615613565b8381811061220257612202615658565b9050602002810190612214919061566c565b61221e9080615b7b565b905061222d6060870187615613565b8481811061223d5761223d615658565b905060200281019061224f919061566c565b6122599080615b7b565b6122666060890189615613565b8681811061227657612276615658565b9050602002810190612288919061566c565b612296906020810190615b7b565b6122a360608b018b615613565b888181106122b3576122b3615658565b90506020028101906122c5919061566c565b6122d690606081019060400161539e565b6040516020016122ec9796959493929190615bbd565b60408051601f1981840301815291905291506001016121ce565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561238c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123b39190810190615a96565b91509150806123d557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612418573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243c91906155e1565b825114612462578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b03161561249e576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f806124ad8460400151613980565b915091508187146124d45760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615f46833981519152906001600160401b039081169083161115612591575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125b0565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615f46833981519152816125d486613b71565b90506125df86612306565b6125ee57600192505050611e33565b5f8681526005830160205260409020546001600160a01b03163314612613573361114b565b5f86815260058301602052604090205460a082015161264291600160b01b90046001600160401b031690615a4b565b6001600160401b03168160c001516001600160401b031610156126895760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f85156126a15761269a8786612341565b90506126bf565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906126e490611065565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa15801561274d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061277191906155e1565b905080846008015f8a81526020019081526020015f205f828254612795919061592d565b90915550501515979650505050505050565b5f80516020615fa68339815191528054600119016127d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e7615196565b5f80516020615f668339815191525f806128036113c687611e89565b91509150801561282a57604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285b5761285b6153d7565b600581111561286c5761286c6153d7565b815260200160018201805461288090615589565b80601f01602080910402602001604051908101604052809291908181526020018280546128ac90615589565b80156128f75780601f106128ce576101008083540402835291602001916128f7565b820191905f5260205f20905b8154815290600101906020018083116128da57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612962576129626153d7565b141580156129835750600181516005811115612980576129806153d7565b14155b156129a457805160405163170cc93360e21b81526104da91906004016155c1565b6003815160058111156129b9576129b96153d7565b036129c757600481526129cc565b600581525b8360080181602001516040516129e29190615809565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2657612a266153d7565b021790555060208201516001820190612a3f908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae557612ae56153d7565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615f2683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b77575f80fd5b505af1158015612b89573d5f803e3d5ffd5b50505050505050565b5f80516020615f268339815191525461137a906001600160a01b03168383613e55565b60015f80516020615fa683398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615f4683398151915290600160401b900461ffff9081169086161080612c1c575061271061ffff8616115b15612c4057604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612c7c576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612c8e5750806001015483115b15612caf5760405163222d164360e21b8152600481018490526024016104da565b5f612cb984613eb4565b90505f612cc582610c9f565b90505f612cd28983613ed7565b90506040518060800160405280612ce63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615f868339815191526020526040808220815160e0810190925280545f80516020615f4683398151915293929190829060ff166003811115612dee57612dee6153d7565b6003811115612dff57612dff6153d7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612f2d575f84815260058701602052604090205461271090612edf90600160a01b900461ffff1685615962565b612ee99190615979565b915081866008015f8681526020019081526020015f205f828254612f0d919061592d565b90915550612f1d90508284615b68565b9050612f2d856020015182612b1c565b612f428560200151610da28760600151611065565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612fbf57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b600281101561300e57612fd6816001615b68565b612fe1906008615962565b61ffff16868281518110612ff757612ff7615658565b016020015160f81c901b9190911790600101612fc2565b5061ffff8116156130385760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156130935761304f816003615b68565b61305a906008615962565b63ffffffff168761306c83600261592d565b8151811061307c5761307c615658565b016020015160f81c901b919091179060010161303b565b5063ffffffff81166003146130bb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613110576130d281601f615b68565b6130dd906008615962565b886130e983600661592d565b815181106130f9576130f9615658565b016020015160f81c901b91909117906001016130be565b505f805b600881101561316f57613128816007615b68565b613133906008615962565b6001600160401b03168961314883602661592d565b8151811061315857613158615658565b016020015160f81c901b9190911790600101613114565b505f805b60088110156131ce57613187816007615b68565b613192906008615962565b6001600160401b03168a6131a783602e61592d565b815181106131b7576131b7615658565b016020015160f81c901b9190911790600101613173565b5091989097509095509350505050565b5f5f80516020615f46833981519152816131fa61028f85613eb4565b90505f61320687611859565b905061321187612306565b613231576040516330efa98b60e01b8152600481018890526024016104da565b600281516005811115613246576132466153d7565b1461326757805160405163170cc93360e21b81526104da91906004016155c1565b5f8282608001516132789190615a4b565b905083600201600a9054906101000a90046001600160401b031682604001516132a19190615c26565b6001600160401b0316816001600160401b031611156132de57604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132ea8a8461368c565b915091505f8a8360405160200161331892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff191660018360038111156133ab576133ab6153d7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146134ec57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b600281101561353b57613503816001615b68565b61350e906008615962565b61ffff1685828151811061352457613524615658565b016020015160f81c901b91909117906001016134ef565b5061ffff8116156135655760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156135c05761357c816003615b68565b613587906008615962565b63ffffffff168661359983600261592d565b815181106135a9576135a9615658565b016020015160f81c901b9190911790600101613568565b5063ffffffff81166002146135e857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561363d576135ff81601f615b68565b61360a906008615962565b8761361683600661592d565b8151811061362657613626615658565b016020015160f81c901b91909117906001016135eb565b505f8660268151811061365257613652615658565b016020015191976001600160f81b03199092161515965090945050505050565b61367a61444f565b6136838261449a565b61137a8161450e565b5f8281525f80516020615fc6833981519152602052604081206002015481905f80516020615f6683398151915290600160801b90046001600160401b03166136d48582614576565b5f6136de87614799565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61372e8a858b611e3a565b6040518263ffffffff1660e01b815260040161374a91906155cf565b6020604051808303815f875af1158015613766573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061378a91906155e1565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615f4683398151915290505f6138038460400151611859565b90505f60038251600581111561381b5761381b6153d7565b14806138395750600482516005811115613837576138376153d7565b145b15613849575060c0810151613886565b60028251600581111561385e5761385e6153d7565b0361386a575042613886565b815160405163170cc93360e21b81526104da91906004016155c1565b84608001516001600160401b0316816001600160401b0316116138ad57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906138d290611065565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613953573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397791906155e1565b95945050505050565b5f808251602e146139b657825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b6002811015613a05576139cd816001615b68565b6139d8906008615962565b61ffff168582815181106139ee576139ee615658565b016020015160f81c901b91909117906001016139b9565b5061ffff811615613a2f5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613a8a57613a46816003615b68565b613a51906008615962565b63ffffffff1686613a6383600261592d565b81518110613a7357613a73615658565b016020015160f81c901b9190911790600101613a32565b5063ffffffff811615613ab057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b0557613ac781601f615b68565b613ad2906008615962565b87613ade83600661592d565b81518110613aee57613aee615658565b016020015160f81c901b9190911790600101613ab3565b505f805b6008811015613b6457613b1d816007615b68565b613b28906008615962565b6001600160401b031688613b3d83602661592d565b81518110613b4d57613b4d615658565b016020015160f81c901b9190911790600101613b09565b5090969095509350505050565b613b79615196565b5f8281525f80516020615fc68339815191526020526040808220815160e0810190925280545f80516020615f6683398151915293929190829060ff166005811115613bc657613bc66153d7565b6005811115613bd757613bd76153d7565b8152602001600182018054613beb90615589565b80601f0160208091040260200160405190810160405280929190818152602001828054613c1790615589565b8015613c625780601f10613c3957610100808354040283529160200191613c62565b820191905f5260205f20905b815481529060010190602001808311613c4557829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613cd057613cd06153d7565b14613d03575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff16906004016155c1565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d4757613d476153d7565b021790555060208201516001820190613d60908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613dfe858261368c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061480e565b5f610cf3825f80516020615f26833981519152546001600160a01b03169061486f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f1b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615f6683398151915242613f3a606086016040870161539e565b6001600160401b0316111580613f745750613f586202a3004261592d565b613f68606086016040870161539e565b6001600160401b031610155b15613fae57613f89606085016040860161539e565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613fc3613fbe6060860186615c51565b6149c8565b613fd3613fbe6080860186615c51565b6030613fe26020860186615b7b565b90501461401457613ff66020850185615b7b565b6040516326475b2f60e11b81526104da925060040190815260200190565b61401e8480615b7b565b90505f0361404b576140308480615b7b565b604051633e08a12560e11b81526004016104da929190615c65565b5f6008820161405a8680615b7b565b604051614068929190615a3c565b908152602001604051809103902054146140a1576140868480615b7b565b60405163a41f772f60e01b81526004016104da929190615c65565b6140ab835f614576565b6040805160e08101909152815481525f9081906141b790602081016140d08980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614118908a018a615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161416160608a0160408b0161539e565b6001600160401b0316815260200161417c60608a018a615c51565b61418590615c93565b815260200161419760808a018a615c51565b6141a090615c93565b8152602001876001600160401b0316815250614b31565b5f828152600686016020526040902091935091506141d5828261585e565b5081600884016141e58880615b7b565b6040516141f3929190615a3c565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061422f9085906004016155cf565b6020604051808303815f875af115801561424b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426f91906155e1565b6040805160e08101909152909150806001815260200161428f8980615b7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561431e5761431e6153d7565b021790555060208201516001820190614337908261585e565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806143d58880615b7b565b6040516143e3929190615a3c565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190614421919061539e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661449857604051631afcd79f60e31b815260040160405180910390fd5b565b6144a261444f565b6144ab81614d1e565b6144b3614d37565b610dc2606082013560808301356144d060c0850160a0860161539e565b6144e060e0860160c08701615d5a565b6144f1610100870160e08801615d73565b61010087013561450961014089016101208a016155f8565b614d47565b61451661444f565b5f80516020615f268339815191526001600160a01b03821661455657604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615f668339815191525f6001600160401b0380841690851611156145aa576145a38385615a6b565b90506145b7565b6145b48484615a6b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614619575060018401548151614615916001600160401b03169061592d565b8210155b1561463f576001600160401b03831660608201528181526040810151602082015261465e565b82816060018181516146519190615a4b565b6001600160401b03169052505b606081015161466e906064615c26565b602082015160018601546001600160401b0392909216916146999190600160401b900460ff16615962565b10156146c957606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b0316816040018181516146e4919061592d565b9052506040810180516001600160401b0387169190614704908390615b68565b9052506001840154604082015160649161472991600160401b90910460ff1690615962565b1015614750578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615fc68339815191526020526040812060020180545f80516020615f6683398151915291906008906147e390600160401b90046001600160401b0316615d93565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6148226001600160a01b03841683614f03565b905080515f141580156148465750808060200190518101906148449190615dae565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148d991906155e1565b90506148f06001600160a01b038516333086614f10565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614934573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061495891906155e1565b90508181116149be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6139778282615b68565b6149d560208201826152d1565b63ffffffff161580156149f557506149f06020820182615613565b151590505b15614a3c57614a0760208201826152d1565b614a146020830183615613565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b614a496020820182615613565b9050614a5860208301836152d1565b63ffffffff161115614a7157614a0760208201826152d1565b60015b614a816020830183615613565b905081101561137a57614a976020830183615613565b614aa2600184615b68565b818110614ab157614ab1615658565b9050602002016020810190614ac691906155f8565b6001600160a01b0316614adc6020840184615613565b83818110614aec57614aec615658565b9050602002016020810190614b0191906155f8565b6001600160a01b03161015614b2957604051630dbc8d5f60e31b815260040160405180910390fd5b600101614a74565b5f6060826040015151603014614b5a5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b9b988a986001989297929690959094909390929101615dc9565b60405160208183030381529060405290505f5b84608001516020015151811015614c0d57818560800151602001518281518110614bda57614bda615658565b6020026020010151604051602001614bf3929190615e83565b60408051601f198184030181529190529150600101614bae565b5060a0840151805160209182015151604051614c2d938593929101615eb9565b60405160208183030381529060405290505f5b8460a001516020015151811015614c9f57818560a00151602001518281518110614c6c57614c6c615658565b6020026020010151604051602001614c85929190615e83565b60408051601f198184030181529190529150600101614c40565b5060c0840151604051614cb6918391602001615ef4565b6040516020818303038152906040529050600281604051614cd79190615809565b602060405180830381855afa158015614cf2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d1591906155e1565b94909350915050565b614d2661444f565b614d2e614f49565b610dc281614f51565b614d3f61444f565b614498615039565b614d4f61444f565b5f80516020615f4683398151915261ffff85161580614d73575061271061ffff8616115b15614d9757604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614dbb5760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614dce5750600a60ff8516115b15614df15760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614e58576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614e785760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3383835f615041565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613e82565b61449861444f565b614f5961444f565b80355f80516020615f668339815191529081556014614f7e6060840160408501615d73565b60ff161180614f9d5750614f986060830160408401615d73565b60ff16155b15614fd157614fb26060830160408401615d73565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614fe16060830160408401615d73565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615012604083016020840161539e565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bb561444f565b6060814710156150665760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b031684866040516150819190615809565b5f6040518083038185875af1925050503d805f81146150bb576040519150601f19603f3d011682016040523d82523d5f602084013e6150c0565b606091505b50915091506150d08683836150da565b9695505050505050565b6060826150ef576150ea82615136565b611e33565b815115801561510657506001600160a01b0384163b155b1561512f57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e33565b8051156151465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461516b90615589565b5f825580601f1061517a575050565b601f0160209004905f5260205f2090810190610dc291906151d3565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156151e7575f81556001016151d4565b5090565b8015158114610dc2575f80fd5b803563ffffffff8116811461520b575f80fd5b919050565b5f805f60608486031215615222575f80fd5b833592506020840135615234816151eb565b9150615242604085016151f8565b90509250925092565b5f6020828403121561525b575f80fd5b5035919050565b5f8060408385031215615273575f80fd5b82356001600160401b03811115615288575f80fd5b830160808186031215615299575f80fd5b91506152a7602084016151f8565b90509250929050565b5f80604083850312156152c1575f80fd5b823591506152a7602084016151f8565b5f602082840312156152e1575f80fd5b611e33826151f8565b803561ffff8116811461520b575f80fd5b80356001600160401b038116811461520b575f80fd5b5f805f8060808587031215615324575f80fd5b84356001600160401b03811115615339575f80fd5b850160a0818803121561534a575f80fd5b9350615358602086016152ea565b9250615366604086016152fb565b9396929550929360600135925050565b5f8060408385031215615387575f80fd5b615390836151f8565b946020939093013593505050565b5f602082840312156153ae575f80fd5b611e33826152fb565b5f80604083850312156153c8575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106153fb576153fb6153d7565b9052565b5f5b83811015615419578181015183820152602001615401565b50505f910152565b5f81518084526154388160208601602086016153ff565b601f01601f19169290920160200192915050565b6020815261545e6020820183516153eb565b5f602083015160e06040840152615479610100840182615421565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dc2575f80fd5b5f808284036101608112156154f3575f80fd5b61014080821215615502575f80fd5b8493508301359050615513816154cc565b809150509250929050565b5f806020838503121561552f575f80fd5b82356001600160401b0380821115615545575f80fd5b818501915085601f830112615558575f80fd5b813581811115615566575f80fd5b866020828501011115615577575f80fd5b60209290920196919550909350505050565b600181811c9082168061559d57607f821691505b6020821081036155bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cf382846153eb565b602081525f611e336020830184615421565b5f602082840312156155f1575f80fd5b5051919050565b5f60208284031215615608575f80fd5b8135611e33816154cc565b5f808335601e19843603018112615628575f80fd5b8301803591506001600160401b03821115615641575f80fd5b6020019150600581901b36038213156137dc575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615680575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156156c0576156c061568a565b60405290565b604080519081016001600160401b03811182821017156156c0576156c061568a565b604051601f8201601f191681016001600160401b03811182821017156157105761571061568a565b604052919050565b5f6001600160401b038211156157305761573061568a565b50601f01601f191660200190565b5f82601f83011261574d575f80fd5b813561576061575b82615718565b6156e8565b818152846020838601011115615774575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156157a0575f80fd5b6157a861569e565b82356001600160401b03808211156157be575f80fd5b6157ca3683870161573e565b835260208501359150808211156157df575f80fd5b506157ec3682860161573e565b6020830152506157fe604084016152fb565b604082015292915050565b5f82516156808184602087016153ff565b601f8211156104e357805f5260205f20601f840160051c8101602085101561583f5750805b601f840160051c820191505b81811015611715575f815560010161584b565b81516001600160401b038111156158775761587761568a565b61588b816158858454615589565b8461581a565b602080601f8311600181146158be575f84156158a75750858301515b5f19600386901b1c1916600185901b178555610f29565b5f85815260208120601f198616915b828110156158ec578886015182559484019460019091019084016158cd565b508582101561590957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cf357610cf3615919565b5f63ffffffff80831681810361595857615958615919565b6001019392505050565b8082028115828204841417610cf357610cf3615919565b5f8261599357634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106159ac576159ac6153d7565b91905290565b5f60208083525f84546159c481615589565b806020870152604060018084165f81146159e55760018114615a0157615a2e565b60ff19851660408a0152604084151560051b8a01019550615a2e565b895f5260205f205f5b85811015615a255781548b8201860152908301908801615a0a565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611f9857611f98615919565b6001600160401b03828116828216039080821115611f9857611f98615919565b805161520b816151eb565b5f8060408385031215615aa7575f80fd5b82516001600160401b0380821115615abd575f80fd5b9084019060608287031215615ad0575f80fd5b615ad861569e565b82518152602080840151615aeb816154cc565b82820152604084015183811115615b00575f80fd5b80850194505087601f850112615b14575f80fd5b83519250615b2461575b84615718565b8381528882858701011115615b37575f80fd5b615b46848383018488016153ff565b80604084015250819550615b5b818801615a8b565b9450505050509250929050565b81810381811115610cf357610cf3615919565b5f808335601e19843603018112615b90575f80fd5b8301803591506001600160401b03821115615ba9575f80fd5b6020019150368190038213156137dc575f80fd5b5f8851615bce818460208d016153ff565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615c4957615c49615919565b505092915050565b5f8235603e19833603018112615680575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615ca3575f80fd5b615cab6156c6565b615cb4836151f8565b81526020808401356001600160401b0380821115615cd0575f80fd5b9085019036601f830112615ce2575f80fd5b813581811115615cf457615cf461568a565b8060051b9150615d058483016156e8565b8181529183018401918481019036841115615d1e575f80fd5b938501935b83851015615d485784359250615d38836154cc565b8282529385019390850190615d23565b94860194909452509295945050505050565b5f60208284031215615d6a575f80fd5b611e33826152ea565b5f60208284031215615d83575f80fd5b813560ff81168114611e33575f80fd5b5f6001600160401b0380831681810361595857615958615919565b5f60208284031215615dbe575f80fd5b8151611e33816151eb565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e0f81602a850160208b016153ff565b865190830190615e2681602a840160208b016153ff565b60c087901b6001600160c01b031916602a9290910191820152615e58603282018660e01b6001600160e01b0319169052565b615e71603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615e948184602088016153ff565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615eca8184602089016153ff565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f058184602088016153ff565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516161ca3803806161ca83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61607d8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101fd575f3560e01c80638280a25a11610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff61461044f578063df93d8de1461046f578063e4a63c4014610479578063f74c607b1461048d578063fd7ac5e7146104a0575f80fd5b8063ba3a4b971461040d578063bc5fbfec14610420578063bee0a03f14610434578063c974d1b614610447575f80fd5b8063a3a65e48116100e4578063a3a65e48146103c0578063a9778a7a146102ac578063afb98096146103d3578063b771b3bc146103e7575f80fd5b80638280a25a1461037f57806393e245981461038757806398f3e2b41461039a5780639e1bc4ef146103ad575f80fd5b80633a1cfff61161019557806360305d621161016557806360305d6214610322578063620658561461033f57806366435abf14610352578063732214f81461036557806376f786211461036c575f80fd5b80633a1cfff6146102c8578063467ef06f146102db5780634bee0040146102ee5780635297fae61461030f575f80fd5b806320d91b7a116101d057806320d91b7a1461025b57806325e1c7761461026e5780632e2194d81461028157806335455ded146102ac575f80fd5b80630118acc4146102015780630322ed9814610216578063151d30d1146102295780631ec4472414610248575b5f80fd5b61021461020f366004615179565b6104b3565b005b6102146102243660046151b4565b6104e8565b610231600a81565b60405160ff90911681526020015b60405180910390f35b610214610256366004615179565b6106f6565b6102146102693660046151cb565b610701565b61021461027c366004615219565b610c33565b61029461028f3660046151b4565b610ca7565b6040516001600160401b03909116815260200161023f565b6102b561271081565b60405161ffff909116815260200161023f565b6102146102d6366004615179565b610d01565b6102146102e936600461523a565b610d0c565b6103016102fc36600461527a565b610dcd565b60405190815260200161023f565b61021461031d3660046152df565b610e02565b61032a601481565b60405163ffffffff909116815260200161023f565b61030161034d366004615307565b61106d565b6102946103603660046151b4565b6110a4565b6103015f81565b61021461037a366004615179565b6110b8565b610231603081565b6102146103953660046151b4565b6110e3565b6102146103a83660046152df565b6111ae565b6103016103bb366004615320565b611386565b6102146103ce36600461523a565b6113b2565b6103015f80516020615fd183398151915281565b6103f56005600160991b0181565b6040516001600160a01b03909116815260200161023f565b61021461041b3660046151b4565b61153b565b6103015f80516020615ff183398151915281565b6102146104423660046151b4565b611724565b610231601481565b61046261045d3660046151b4565b611861565b60405161023f91906153b5565b6102946202a30081565b6103015f80516020615fb183398151915281565b61021461049b366004615449565b6119b0565b6103016104ae366004615487565b611a8f565b6104be838383611aea565b6104e357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206160518339815191526020526040808220815160e0810190925280545f80516020615ff183398151915293929190829060ff16600581111561053557610535615340565b600581111561054657610546615340565b815260200160018201805461055a906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054610586906154f2565b80156105d15780601f106105a8576101008083540402835291602001916105d1565b820191905f5260205f20905b8154815290600101906020018083116105b457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063c5761063c615340565b1461066f575f8381526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b6005600160991b016001600160a01b031663ee5b48eb6106948584606001515f611e42565b6040518263ffffffff1660e01b81526004016106b09190615538565b6020604051808303815f875af11580156106cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061554a565b50505050565b6106f0838383611aea565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615ff18339815191529060ff161561075357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba919061554a565b8360200135146107e3576040516372b0a7e760e11b8152602084013560048201526024016104da565b306107f46060850160408601615561565b6001600160a01b031614610837576108126060840160408501615561565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104da565b5f610845606085018561557c565b905090505f805b828163ffffffff161015610b2d575f610868606088018861557c565b8363ffffffff1681811061087e5761087e6155c1565b905060200281019061089091906155d5565b61089990615796565b80516040519192505f9160088801916108b1916157a1565b908152602001604051809103902054146108e157805160405163a41f772f60e01b81526104da9190600401615538565b5f6002885f01358460405160200161091092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261092a916157a1565b602060405180830381855afa158015610945573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610968919061554a565b90508086600801835f015160405161098091906157a1565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610a0257610a02615340565b021790555060208201516001820190610a1b90826157f6565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ac09116856158c5565b8251604051919550610ad1916157a1565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b26906158d8565b905061084c565b50600483018190556001830154606490610b5190600160401b900460ff16836158fa565b1015610b7357604051635943317f60e01b8152600481018290526024016104da565b5f610b89610b8086611e91565b60400151611fa7565b90505f610b9d610b9888615933565b612134565b90505f600282604051610bb091906157a1565b602060405180830381855afa158015610bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610bee919061554a565b9050828114610c1a57604051631872fc8d60e01b815260048101829052602481018490526044016104da565b5050506009909201805460ff1916600117905550505050565b610c3c8261226f565b610c5c576040516330efa98b60e01b8152600481018390526024016104da565b5f610c6683611861565b5190506002816005811115610c7d57610c7d615340565b14610c9d578060405163170cc93360e21b81526004016104da919061552a565b6106f083836122aa565b5f805f80516020615fd183398151915260030154610cc59084615a0b565b9050801580610cda57506001600160401b0381115b15610cfb5760405163222d164360e21b8152600481018490526024016104da565b92915050565b6106f0838383612524565b610d14612710565b5f80516020615fd18339815191525f80610d2d84612747565b91509150610d3a8261226f565b610d4657505050610db4565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d7457610d74615340565b03610d99575f83815260088501602052604081208054919055610d978282612a85565b505b610daf81610daa846040015161106d565b612afb565b505050505b610dca60015f8051602061603183398151915255565b50565b5f610dd6612710565b610de285858585612b31565b9050610dfa60015f8051602061603183398151915255565b949350505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff166003811115610e4f57610e4f615340565b6003811115610e6057610e60615340565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ed682611861565b9050600183516003811115610eed57610eed615340565b14610f0e578251604051633b0d540d60e21b81526104da9190600401615a2a565b600481516005811115610f2357610f23615340565b03610f3957610f3185612d0a565b505050505050565b5f80610f50610f4789611e91565b60400151612ef1565b5091509150818414610f7d57846040015160405163089938b360e11b81526004016104da91815260200190565b806001600160401b031683606001516001600160401b03161080610fb65750806001600160401b03168560a001516001600160401b0316115b15610fdf57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610cfb906001600160401b0384166158fa565b5f6110ae82611861565b6080015192915050565b6110c3838383612524565b6104e357604051635bff683f60e11b8152600481018490526024016104da565b5f80516020615fd18339815191525f6110fb83611861565b519050600481600581111561111257611112615340565b14611132578060405163170cc93360e21b81526004016104da919061552a565b5f8381526005830160205260409020546001600160a01b0316331461117857335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104da565b5f838152600883016020908152604080832080549084905560058601909252909120546106f0906001600160a01b031682612a85565b6111b6612710565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff16600381111561120357611203615340565b600381111561121457611214615340565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561128d5761128d615340565b146112ae578051604051633b0d540d60e21b81526104da9190600401615a2a565b60046112bd8260400151611861565b5160058111156112cf576112cf615340565b14611361575f6112de85611e91565b90505f806112ef8360400151612ef1565b50915091508184604001511461131b5760405163089938b360e11b8152600481018390526024016104da565b806001600160401b03168460c001516001600160401b0316111561135d57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104da565b5050505b61136a83612d0a565b505061138260015f8051602061603183398151915255565b5050565b5f61138f612710565b61139a833384613147565b9050610cfb60015f8051602061603183398151915255565b5f80516020615ff18339815191525f806113d76113ce85611e91565b6040015161341f565b91509150806113fd57604051632d07135360e01b815281151560048201526024016104da565b5f82815260068401602052604090208054611417906154f2565b90505f0361143b5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078501602052604090205460ff16600581111561146157611461615340565b14611494575f8281526007840160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b5f82815260068401602052604081206114ac916150c8565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff16600381111561158857611588615340565b600381111561159957611599615340565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561161257611612615340565b14158015611633575060038151600381111561163057611630615340565b14155b15611654578051604051633b0d540d60e21b81526104da9190600401615a2a565b5f6116628260400151611861565b905080606001516001600160401b03165f03611694576040516339b894f960e21b8152600481018590526024016104da565b6005600160991b016001600160a01b031663ee5b48eb6116c1846040015184606001518560800151611e42565b6040518263ffffffff1660e01b81526004016116dd9190615538565b6020604051808303815f875af11580156116f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171d919061554a565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615ff1833981519152919061176b906154f2565b90505f0361178f5760405163089938b360e11b8152600481018390526024016104da565b60015f83815260078301602052604090205460ff1660058111156117b5576117b5615340565b146117e8575f8281526007820160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118219190600401615a44565b6020604051808303815f875af115801561183d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e3919061554a565b6118696150ff565b5f8281525f80516020616051833981519152602052604090819020815160e0810190925280545f80516020615ff1833981519152929190829060ff1660058111156118b6576118b6615340565b60058111156118c7576118c7615340565b81526020016001820180546118db906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054611907906154f2565b80156119525780601f1061192957610100808354040283529160200191611952565b820191905f5260205f20905b81548152906001019060200180831161193557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119f9575080546001600160401b03808416911610155b15611a175760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a4284846135db565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615ff1833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611ad29086908690615ace565b90815260200160405180910390205491505092915050565b5f8381525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd18339815191529284929091829060ff166003811115611b3857611b38615340565b6003811115611b4957611b49615340565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611bbf82611861565b9050600283516003811115611bd657611bd6615340565b14611bf7578251604051633b0d540d60e21b81526104da9190600401615a2a565b60208301516001600160a01b03163314611c93575f8281526005850160205260409020546001600160a01b03163314611c305733611153565b5f82815260058501602052604090205460a0820151611c5f91600160b01b90046001600160401b031690615add565b6001600160401b0316421015611c935760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b600281516005811115611ca857611ca8615340565b03611dd65760028401546080840151611cca916001600160401b031690615add565b6001600160401b0316421015611cfe5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104da565b8615611d1057611d0e82876122aa565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611d49918491611d449190615afd565b6135f5565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d8a8461374c565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611e3b9350505050565b600481516005811115611deb57611deb615340565b03611e1f57611df98361374c565b5f898152600786016020526040902055611e1288612d0a565b6001945050505050611e3b565b805160405163170cc93360e21b81526104da919060040161552a565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ef5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1c9190810190615b28565b9150915080611f3e57604051636b2f19e960e01b815260040160405180910390fd5b815115611f64578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615611fa0576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5092915050565b5f8151602614611fdc57815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104da565b5f805b600281101561202b57611ff3816001615bfa565b611ffe9060086158fa565b61ffff16848281518110612014576120146155c1565b016020015160f81c901b9190911790600101611fdf565b5061ffff8116156120555760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156120b05761206c816003615bfa565b6120779060086158fa565b63ffffffff16856120898360026158c5565b81518110612099576120996155c1565b016020015160f81c901b9190911790600101612058565b5063ffffffff8116156120d657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561212b576120ed81601f615bfa565b6120f89060086158fa565b866121048360066158c5565b81518110612114576121146155c1565b016020015160f81c901b91909117906001016120d9565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015611fa05781846060015182815181106121d0576121d06155c1565b60200260200101515f015151856060015183815181106121f2576121f26155c1565b60200260200101515f015186606001518481518110612213576122136155c1565b60200260200101516020015187606001518581518110612235576122356155c1565b602002602001015160400151604051602001612255959493929190615c0d565b60408051601f1981840301815291905291506001016121ac565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261231c9190810190615b28565b915091508061233e57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612381573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a5919061554a565b8251146123cb578151604051636ba589a560e01b815260048101919091526024016104da565b60208201516001600160a01b031615612407576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104da565b5f8061241684604001516138e9565b9150915081871461243d5760405163089938b360e11b8152600481018890526024016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615fd1833981519152906001600160401b0390811690831611156124fa575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612519565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615fd18339815191528161253d86613ada565b90506125488661226f565b61255757600192505050611e3b565b5f8681526005830160205260409020546001600160a01b0316331461257c5733611153565b5f86815260058301602052604090205460a08201516125ab91600160b01b90046001600160401b031690615add565b6001600160401b03168160c001516001600160401b031610156125f25760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104da565b5f851561260a5761260387866122aa565b9050612628565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061264d9061106d565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156126b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126da919061554a565b905080846008015f8a81526020019081526020015f205f8282546126fe91906158c5565b90915550501515979650505050505050565b5f8051602061603183398151915280546001190161274157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127506150ff565b5f80516020615ff18339815191525f8061276c6113ce87611e91565b91509150801561279357604051632d07135360e01b815281151560048201526024016104da565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127c4576127c4615340565b60058111156127d5576127d5615340565b81526020016001820180546127e9906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054612815906154f2565b80156128605780601f1061283757610100808354040283529160200191612860565b820191905f5260205f20905b81548152906001019060200180831161284357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128cb576128cb615340565b141580156128ec57506001815160058111156128e9576128e9615340565b14155b1561290d57805160405163170cc93360e21b81526104da919060040161552a565b60038151600581111561292257612922615340565b036129305760048152612935565b600581525b83600801816020015160405161294b91906157a1565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561298f5761298f615340565b0217905550602082015160018201906129a890826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a4e57612a4e615340565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615fb183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ae0575f80fd5b505af1158015612af2573d5f803e3d5ffd5b50505050505050565b5f80516020615fb183398151915254611382906001600160a01b03168383613dbe565b60015f8051602061603183398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615fd183398151915290600160401b900461ffff9081169086161080612b85575061271061ffff8616115b15612ba957604051635f12e6c360e11b815261ffff861660048201526024016104da565b60028101546001600160401b039081169085161015612be5576040516202a06d60e11b81526001600160401b03851660048201526024016104da565b8054831080612bf75750806001015483115b15612c185760405163222d164360e21b8152600481018490526024016104da565b5f612c2284613e1d565b90505f612c2e82610ca7565b90505f612c3b8983613e40565b90506040518060800160405280612c4f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f805160206160118339815191526020526040808220815160e0810190925280545f80516020615fd183398151915293929190829060ff166003811115612d5757612d57615340565b6003811115612d6857612d68615340565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e96575f84815260058701602052604090205461271090612e4890600160a01b900461ffff16856158fa565b612e529190615a0b565b915081866008015f8681526020019081526020015f205f828254612e7691906158c5565b90915550612e8690508284615bfa565b9050612e96856020015182612a85565b612eab8560200151610daa876060015161106d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f2857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104da565b5f805b6002811015612f7757612f3f816001615bfa565b612f4a9060086158fa565b61ffff16868281518110612f6057612f606155c1565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612fa15760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015612ffc57612fb8816003615bfa565b612fc39060086158fa565b63ffffffff1687612fd58360026158c5565b81518110612fe557612fe56155c1565b016020015160f81c901b9190911790600101612fa4565b5063ffffffff811660031461302457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130795761303b81601f615bfa565b6130469060086158fa565b886130528360066158c5565b81518110613062576130626155c1565b016020015160f81c901b9190911790600101613027565b505f805b60088110156130d857613091816007615bfa565b61309c9060086158fa565b6001600160401b0316896130b18360266158c5565b815181106130c1576130c16155c1565b016020015160f81c901b919091179060010161307d565b505f805b6008811015613137576130f0816007615bfa565b6130fb9060086158fa565b6001600160401b03168a61311083602e6158c5565b81518110613120576131206155c1565b016020015160f81c901b91909117906001016130dc565b5091989097509095509350505050565b5f5f80516020615fd18339815191528161316361028f85613e1d565b90505f61316f87611861565b905061317a8761226f565b61319a576040516330efa98b60e01b8152600481018890526024016104da565b6002815160058111156131af576131af615340565b146131d057805160405163170cc93360e21b81526104da919060040161552a565b5f8282608001516131e19190615add565b905083600201600a9054906101000a90046001600160401b0316826040015161320a9190615c86565b6001600160401b0316816001600160401b0316111561324757604051636d51fe0560e11b81526001600160401b03821660048201526024016104da565b5f806132538a846135f5565b915091505f8a8360405160200161328192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561331457613314615340565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461345557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104da565b5f805b60028110156134a45761346c816001615bfa565b6134779060086158fa565b61ffff1685828151811061348d5761348d6155c1565b016020015160f81c901b9190911790600101613458565b5061ffff8116156134ce5760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b6004811015613529576134e5816003615bfa565b6134f09060086158fa565b63ffffffff16866135028360026158c5565b81518110613512576135126155c1565b016020015160f81c901b91909117906001016134d1565b5063ffffffff811660021461355157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a65761356881601f615bfa565b6135739060086158fa565b8761357f8360066158c5565b8151811061358f5761358f6155c1565b016020015160f81c901b9190911790600101613554565b505f866026815181106135bb576135bb6155c1565b016020015191976001600160f81b03199092161515965090945050505050565b6135e36143b8565b6135ec82614403565b61138281614477565b5f8281525f80516020616051833981519152602052604081206002015481905f80516020615ff183398151915290600160801b90046001600160401b031661363d85826144df565b5f61364787614702565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136978a858b611e42565b6040518263ffffffff1660e01b81526004016136b39190615538565b6020604051808303815f875af11580156136cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136f3919061554a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615fd183398151915290505f61376c8460400151611861565b90505f60038251600581111561378457613784615340565b14806137a257506004825160058111156137a0576137a0615340565b145b156137b2575060c08101516137ef565b6002825160058111156137c7576137c7615340565b036137d35750426137ef565b815160405163170cc93360e21b81526104da919060040161552a565b84608001516001600160401b0316816001600160401b03161161381657505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f9061383b9061106d565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156138bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138e0919061554a565b95945050505050565b5f808251602e1461391f57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104da565b5f805b600281101561396e57613936816001615bfa565b6139419060086158fa565b61ffff16858281518110613957576139576155c1565b016020015160f81c901b9190911790600101613922565b5061ffff8116156139985760405163407b587360e01b815261ffff821660048201526024016104da565b5f805b60048110156139f3576139af816003615bfa565b6139ba9060086158fa565b63ffffffff16866139cc8360026158c5565b815181106139dc576139dc6155c1565b016020015160f81c901b919091179060010161399b565b5063ffffffff811615613a1957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a6e57613a3081601f615bfa565b613a3b9060086158fa565b87613a478360066158c5565b81518110613a5757613a576155c1565b016020015160f81c901b9190911790600101613a1c565b505f805b6008811015613acd57613a86816007615bfa565b613a919060086158fa565b6001600160401b031688613aa68360266158c5565b81518110613ab657613ab66155c1565b016020015160f81c901b9190911790600101613a72565b5090969095509350505050565b613ae26150ff565b5f8281525f805160206160518339815191526020526040808220815160e0810190925280545f80516020615ff183398151915293929190829060ff166005811115613b2f57613b2f615340565b6005811115613b4057613b40615340565b8152602001600182018054613b54906154f2565b80601f0160208091040260200160405190810160405280929190818152602001828054613b80906154f2565b8015613bcb5780601f10613ba257610100808354040283529160200191613bcb565b820191905f5260205f20905b815481529060010190602001808311613bae57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613c3957613c39615340565b14613c6c575f8481526007830160205260409081902054905163170cc93360e21b81526104da9160ff169060040161552a565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613cb057613cb0615340565b021790555060208201516001820190613cc990826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d6785826135f5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614777565b5f610cfb825f80516020615fb1833981519152546001600160a01b0316906147d8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e8457604051637fab81e560e01b815260040160405180910390fd5b5f80516020615ff183398151915242613ea36060860160408701615307565b6001600160401b0316111580613edd5750613ec16202a300426158c5565b613ed16060860160408701615307565b6001600160401b031610155b15613f1757613ef26060850160408601615307565b604051635879da1360e11b81526001600160401b0390911660048201526024016104da565b613f2c613f276060860186615cb1565b614931565b613f3c613f276080860186615cb1565b6030613f4b6020860186615cc5565b905014613f7d57613f5f6020850185615cc5565b6040516326475b2f60e11b81526104da925060040190815260200190565b613f878480615cc5565b90505f03613fb457613f998480615cc5565b604051633e08a12560e11b81526004016104da929190615d07565b5f60088201613fc38680615cc5565b604051613fd1929190615ace565b9081526020016040518091039020541461400a57613fef8480615cc5565b60405163a41f772f60e01b81526004016104da929190615d07565b614014835f6144df565b6040805160e08101909152815481525f90819061412090602081016140398980615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614081908a018a615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016140ca60608a0160408b01615307565b6001600160401b031681526020016140e560608a018a615cb1565b6140ee90615d35565b815260200161410060808a018a615cb1565b61410990615d35565b8152602001876001600160401b0316815250614a9a565b5f8281526006860160205260409020919350915061413e82826157f6565b50816008840161414e8880615cc5565b60405161415c929190615ace565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614198908590600401615538565b6020604051808303815f875af11580156141b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d8919061554a565b6040805160e0810190915290915080600181526020016141f88980615cc5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561428757614287615340565b0217905550602082015160018201906142a090826157f6565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061433e8880615cc5565b60405161434c929190615ace565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061438a9190615307565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661440157604051631afcd79f60e31b815260040160405180910390fd5b565b61440b6143b8565b61441481614c87565b61441c614ca0565b610dca6060820135608083013561443960c0850160a08601615307565b61444960e0860160c08701615de5565b61445a610100870160e08801615dfe565b61010087013561447261014089016101208a01615561565b614cb0565b61447f6143b8565b5f80516020615fb18339815191526001600160a01b0382166144bf57604051637330680360e01b81526001600160a01b03831660048201526024016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615ff18339815191525f6001600160401b0380841690851611156145135761450c8385615afd565b9050614520565b61451d8484615afd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061458257506001840154815161457e916001600160401b0316906158c5565b8210155b156145a8576001600160401b0383166060820152818152604081015160208201526145c7565b82816060018181516145ba9190615add565b6001600160401b03169052505b60608101516145d7906064615c86565b602082015160018601546001600160401b0392909216916146029190600160401b900460ff166158fa565b101561463257606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104da565b856001600160401b03168160400181815161464d91906158c5565b9052506040810180516001600160401b038716919061466d908390615bfa565b9052506001840154604082015160649161469291600160401b90910460ff16906158fa565b10156146b9578060400151604051635943317f60e01b81526004016104da91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160518339815191526020526040812060020180545f80516020615ff1833981519152919060089061474c90600160401b90046001600160401b0316615e1e565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61478b6001600160a01b03841683614e6c565b905080515f141580156147af5750808060200190518101906147ad9190615e39565b155b156104e357604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614842919061554a565b90506148596001600160a01b038516333086614e79565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c1919061554a565b90508181116149275760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b6138e08282615bfa565b61493e602082018261523a565b63ffffffff1615801561495e5750614959602082018261557c565b151590505b156149a557614970602082018261523a565b61497d602083018361557c565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104da565b6149b2602082018261557c565b90506149c1602083018361523a565b63ffffffff1611156149da57614970602082018261523a565b60015b6149ea602083018361557c565b905081101561138257614a00602083018361557c565b614a0b600184615bfa565b818110614a1a57614a1a6155c1565b9050602002016020810190614a2f9190615561565b6001600160a01b0316614a45602084018461557c565b83818110614a5557614a556155c1565b9050602002016020810190614a6a9190615561565b6001600160a01b03161015614a9257604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149dd565b5f6060826040015151603014614ac35760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614b04988a986001989297929690959094909390929101615e54565b60405160208183030381529060405290505f5b84608001516020015151811015614b7657818560800151602001518281518110614b4357614b436155c1565b6020026020010151604051602001614b5c929190615f0e565b60408051601f198184030181529190529150600101614b17565b5060a0840151805160209182015151604051614b96938593929101615f44565b60405160208183030381529060405290505f5b8460a001516020015151811015614c0857818560a00151602001518281518110614bd557614bd56155c1565b6020026020010151604051602001614bee929190615f0e565b60408051601f198184030181529190529150600101614ba9565b5060c0840151604051614c1f918391602001615f7f565b6040516020818303038152906040529050600281604051614c4091906157a1565b602060405180830381855afa158015614c5b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c7e919061554a565b94909350915050565b614c8f6143b8565b614c97614eb2565b610dca81614eba565b614ca86143b8565b614401614fa2565b614cb86143b8565b5f80516020615fd183398151915261ffff85161580614cdc575061271061ffff8616115b15614d0057604051635f12e6c360e11b815261ffff861660048201526024016104da565b86881115614d245760405163222d164360e21b8152600481018990526024016104da565b60ff84161580614d375750600a60ff8516115b15614d5a5760405163170db35960e31b815260ff851660048201526024016104da565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614dc1576040516202a06d60e11b81526001600160401b03871660048201526024016104da565b825f03614de15760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611e3b83835f614faa565b6040516001600160a01b0384811660248301528381166044830152606482018390526106f09186918216906323b872dd90608401613deb565b6144016143b8565b614ec26143b8565b80355f80516020615ff18339815191529081556014614ee76060840160408501615dfe565b60ff161180614f065750614f016060830160408401615dfe565b60ff16155b15614f3a57614f1b6060830160408401615dfe565b604051634a59bbff60e11b815260ff90911660048201526024016104da565b614f4a6060830160408401615dfe565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f7b6040830160208401615307565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b1e6143b8565b606081471015614fcf5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614fea91906157a1565b5f6040518083038185875af1925050503d805f8114615024576040519150601f19603f3d011682016040523d82523d5f602084013e615029565b606091505b5091509150615039868383615043565b9695505050505050565b606082615058576150538261509f565b611e3b565b815115801561506f57506001600160a01b0384163b155b1561509857604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b5080611e3b565b8051156150af5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546150d4906154f2565b5f825580601f106150e3575050565b601f0160209004905f5260205f2090810190610dca919061513c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615150575f815560010161513d565b5090565b8015158114610dca575f80fd5b803563ffffffff81168114615174575f80fd5b919050565b5f805f6060848603121561518b575f80fd5b83359250602084013561519d81615154565b91506151ab60408501615161565b90509250925092565b5f602082840312156151c4575f80fd5b5035919050565b5f80604083850312156151dc575f80fd5b82356001600160401b038111156151f1575f80fd5b830160808186031215615202575f80fd5b915061521060208401615161565b90509250929050565b5f806040838503121561522a575f80fd5b8235915061521060208401615161565b5f6020828403121561524a575f80fd5b611e3b82615161565b803561ffff81168114615174575f80fd5b80356001600160401b0381168114615174575f80fd5b5f805f806080858703121561528d575f80fd5b84356001600160401b038111156152a2575f80fd5b850160a081880312156152b3575f80fd5b93506152c160208601615253565b92506152cf60408601615264565b9396929550929360600135925050565b5f80604083850312156152f0575f80fd5b6152f983615161565b946020939093013593505050565b5f60208284031215615317575f80fd5b611e3b82615264565b5f8060408385031215615331575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061536457615364615340565b9052565b5f5b8381101561538257818101518382015260200161536a565b50505f910152565b5f81518084526153a1816020860160208601615368565b601f01601f19169290920160200192915050565b602081526153c7602082018351615354565b5f602083015160e060408401526153e261010084018261538a565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610dca575f80fd5b5f8082840361016081121561545c575f80fd5b6101408082121561546b575f80fd5b849350830135905061547c81615435565b809150509250929050565b5f8060208385031215615498575f80fd5b82356001600160401b03808211156154ae575f80fd5b818501915085601f8301126154c1575f80fd5b8135818111156154cf575f80fd5b8660208285010111156154e0575f80fd5b60209290920196919550909350505050565b600181811c9082168061550657607f821691505b60208210810361552457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610cfb8284615354565b602081525f611e3b602083018461538a565b5f6020828403121561555a575f80fd5b5051919050565b5f60208284031215615571575f80fd5b8135611e3b81615435565b5f808335601e19843603018112615591575f80fd5b8301803591506001600160401b038211156155aa575f80fd5b6020019150600581901b3603821315613745575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155e9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615629576156296155f3565b60405290565b604051608081016001600160401b0381118282101715615629576156296155f3565b604080519081016001600160401b0381118282101715615629576156296155f3565b604051601f8201601f191681016001600160401b038111828210171561569b5761569b6155f3565b604052919050565b5f6001600160401b038211156156bb576156bb6155f3565b50601f01601f191660200190565b5f82601f8301126156d8575f80fd5b81356156eb6156e6826156a3565b615673565b8181528460208386010111156156ff575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060828403121561572b575f80fd5b615733615607565b905081356001600160401b038082111561574b575f80fd5b615757858386016156c9565b8352602084013591508082111561576c575f80fd5b50615779848285016156c9565b60208301525061578b60408301615264565b604082015292915050565b5f610cfb368361571b565b5f82516155e9818460208701615368565b601f8211156104e357805f5260205f20601f840160051c810160208510156157d75750805b601f840160051c820191505b8181101561171d575f81556001016157e3565b81516001600160401b0381111561580f5761580f6155f3565b6158238161581d84546154f2565b846157b2565b602080601f831160018114615856575f841561583f5750858301515b5f19600386901b1c1916600185901b178555610f31565b5f85815260208120601f198616915b8281101561588457888601518255948401946001909101908401615865565b50858210156158a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610cfb57610cfb6158b1565b5f63ffffffff8083168181036158f0576158f06158b1565b6001019392505050565b8082028115828204841417610cfb57610cfb6158b1565b5f6001600160401b03821115615929576159296155f3565b5060051b60200190565b5f60808236031215615943575f80fd5b61594b61562f565b8235815260208084013581830152604084013561596781615435565b604083015260608401356001600160401b0380821115615985575f80fd5b9085019036601f830112615997575f80fd5b81356159a56156e682615911565b81815260059190911b830184019084810190368311156159c3575f80fd5b8585015b838110156159f9578035858111156159dd575f80fd5b6159eb3689838a010161571b565b8452509186019186016159c7565b50606087015250939695505050505050565b5f82615a2557634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615a3e57615a3e615340565b91905290565b5f60208083525f8454615a56816154f2565b806020870152604060018084165f8114615a775760018114615a9357615ac0565b60ff19851660408a0152604084151560051b8a01019550615ac0565b895f5260205f205f5b85811015615ab75781548b8201860152908301908801615a9c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611fa057611fa06158b1565b6001600160401b03828116828216039080821115611fa057611fa06158b1565b805161517481615154565b5f8060408385031215615b39575f80fd5b82516001600160401b0380821115615b4f575f80fd5b9084019060608287031215615b62575f80fd5b615b6a615607565b82518152602080840151615b7d81615435565b82820152604084015183811115615b92575f80fd5b80850194505087601f850112615ba6575f80fd5b83519250615bb66156e6846156a3565b8381528882858701011115615bc9575f80fd5b615bd884838301848801615368565b80604084015250819550615bed818801615b1d565b9450505050509250929050565b81810381811115610cfb57610cfb6158b1565b5f8651615c1e818460208b01615368565b60e087901b6001600160e01b0319169083019081528551615c46816004840160208a01615368565b8551910190615c5c816004840160208901615368565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b6001600160401b03818116838216028082169190828114615ca957615ca96158b1565b505092915050565b5f8235603e198336030181126155e9575f80fd5b5f808335601e19843603018112615cda575f80fd5b8301803591506001600160401b03821115615cf3575f80fd5b602001915036819003821315613745575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615d45575f80fd5b615d4d615651565b615d5683615161565b81526020808401356001600160401b03811115615d71575f80fd5b840136601f820112615d81575f80fd5b8035615d8f6156e682615911565b81815260059190911b82018301908381019036831115615dad575f80fd5b928401925b82841015615dd4578335615dc581615435565b82529284019290840190615db2565b938501939093525091949350505050565b5f60208284031215615df5575f80fd5b611e3b82615253565b5f60208284031215615e0e575f80fd5b813560ff81168114611e3b575f80fd5b5f6001600160401b038083168181036158f0576158f06158b1565b5f60208284031215615e49575f80fd5b8151611e3b81615154565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615e9a81602a850160208b01615368565b865190830190615eb181602a840160208b01615368565b60c087901b6001600160c01b031916602a9290910191820152615ee3603282018660e01b6001600160e01b0319169052565b615efc603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615f1f818460208801615368565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615f55818460208901615368565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615f90818460208801615368565b60c09390931b6001600160c01b031916919092019081526008019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 131a01b91..68b7aa6ed 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -92,7 +92,7 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BIPS_CONVERSION_FACTOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"NATIVE_MINTER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractINativeMinter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"POS_VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelegationFees\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceInitializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"weightToValueFactor\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitUptimeProof\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewards\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"fees\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"DelegatorIneligibleForRewards\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[{\"name\":\"newValidatorWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MinStakeDurationNotPassed\",\"inputs\":[{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ZeroWeightToValueFactor\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615e4a380380615e4a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615cfd8061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614fb4565b610615565b005b348015610221575f80fd5b50610214610230366004614fef565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614fb4565b610858565b34801561028a575f80fd5b50610214610299366004615006565b610863565b3480156102a9575f80fd5b506102146102b8366004615054565b610d8d565b3480156102c8575f80fd5b506102dc6102d7366004614fef565b610e01565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614fb4565b610e5b565b348015610378575f80fd5b50610214610387366004615075565b610e66565b348015610397575f80fd5b506102146103a636600461508e565b610f27565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee3660046150cc565b611192565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614fef565b6111c9565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614fb4565b6111dd565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614fef565b611208565b348015610490575f80fd5b5061021461049f36600461508e565b6112d3565b3480156104af575f80fd5b506102146104be366004615075565b6114ab565b6103f36104d13660046150f6565b611634565b3480156104e1575f80fd5b506103f35f80516020615c5183398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614fef565b611668565b34801561053a575f80fd5b506103f35f80516020615c7183398151915281565b34801561055a575f80fd5b50610214610569366004614fef565b611851565b348015610579575f80fd5b5061021461058836600461514a565b61198e565b6103f361059b366004614fef565b611a6b565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614fef565b611a9c565b60405161025791906151d6565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f3610610366004615256565b611beb565b610620838383611c46565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff16600581111561069757610697615161565b60058111156106a8576106a8615161565b81526020016001820180546106bc906152c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106e8906152c1565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e615161565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f97565b6040518263ffffffff1660e01b81526004016108129190615301565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108529190615313565b50505050565b610852838383611c46565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c718339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c9190615313565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b30610956606085016040860161533e565b6001600160a01b03161461099957610974606084016040850161533e565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a76060850185615359565b905090505f805b828163ffffffff161015610c8f575f6109ca6060880188615359565b8363ffffffff168181106109e0576109e061539e565b90506020028101906109f291906153b2565b6109fb906154d6565b80516040519192505f916008880191610a139161554f565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c9190600401615301565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c9161554f565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca9190615313565b90508086600801835f0151604051610ae2919061554f565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b64615161565b021790555060208201516001820190610b7d90826155a4565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c22911685615673565b8251604051919550610c339161554f565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c8890615686565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff16836156a8565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fe6565b604001516120fc565b90505f610cf787612289565b90505f600282604051610d0a919061554f565b602060405180830381855afa158015610d25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d489190615313565b9050828114610d7457604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9682612463565b610db6576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc083611a9c565b5190506002816005811115610dd757610dd7615161565b14610df7578060405163170cc93360e21b815260040161063c91906152f3565b610852838361249e565b5f805f80516020615c5183398151915260030154610e1f90846156bf565b9050801580610e3457506001600160401b0381115b15610e555760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612718565b610e6e612904565b5f80516020615c518339815191525f80610e878461293b565b91509150610e9482612463565b610ea057505050610f0e565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ece57610ece615161565b03610ef3575f83815260088501602052604081208054919055610ef18282612c79565b505b610f0981610f048460400151611192565b612cd7565b505050505b610f2460015f80516020615cb183398151915255565b50565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115610f7457610f74615161565b6003811115610f8557610f85615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ffb82611a9c565b905060018351600381111561101257611012615161565b14611033578251604051633b0d540d60e21b815261063c91906004016156de565b60048151600581111561104857611048615161565b0361105e5761105685612cfd565b505050505050565b5f8061107561106c89611fe6565b60400151612ee4565b50915091508184146110a257846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110db5750806001600160401b03168560a001516001600160401b0316115b1561110457604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e55906001600160401b0384166156a8565b5f6111d382611a9c565b6080015192915050565b6111e8838383612718565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615c518339815191525f61122083611a9c565b519050600481600581111561123757611237615161565b14611257578060405163170cc93360e21b815260040161063c91906152f3565b5f8381526005830160205260409020546001600160a01b0316331461129d57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612c79565b6112db612904565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff16600381111561132857611328615161565b600381111561133957611339615161565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113b2576113b2615161565b146113d3578051604051633b0d540d60e21b815261063c91906004016156de565b60046113e28260400151611a9c565b5160058111156113f4576113f4615161565b14611486575f61140385611fe6565b90505f806114148360400151612ee4565b5091509150818460400151146114405760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148257604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61148f83612cfd565b50506114a760015f80516020615cb183398151915255565b5050565b5f80516020615c718339815191525f806114d06114c785611fe6565b6040015161313a565b91509150806114f657604051632d07135360e01b8152811515600482015260240161063c565b5f82815260068401602052604090208054611510906152c1565b90505f036115345760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff16600581111561155a5761155a615161565b1461158d575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068401602052604081206115a591614f08565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61163d612904565b611649848484346132f6565b905061166160015f80516020615cb183398151915255565b9392505050565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff1660038111156116b5576116b5615161565b60038111156116c6576116c6615161565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561173f5761173f615161565b14158015611760575060038151600381111561175d5761175d615161565b14155b15611781578051604051633b0d540d60e21b815261063c91906004016156de565b5f61178f8260400151611a9c565b905080606001516001600160401b03165f036117c1576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611f97565b6040518263ffffffff1660e01b815260040161180a9190615301565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184a9190615313565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615c718339815191529190611898906152c1565b90505f036118bc5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118e2576118e2615161565b14611915575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161194e91906004016156f8565b6020604051808303815f875af115801561196a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106459190615313565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119d7575080546001600160401b03808416911610155b156119f55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a1f836134c4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a74612904565b611a7f8233346134d5565b9050611a9760015f80516020615cb183398151915255565b919050565b611aa4614f3f565b5f8281525f80516020615cd1833981519152602052604090819020815160e0810190925280545f80516020615c71833981519152929190829060ff166005811115611af157611af1615161565b6005811115611b0257611b02615161565b8152602001600182018054611b16906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611b42906152c1565b8015611b8d5780601f10611b6457610100808354040283529160200191611b8d565b820191905f5260205f20905b815481529060010190602001808311611b7057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615c71833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c2e9086908690615782565b90815260200160405180910390205491505092915050565b5f8381525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c518339815191529284929091829060ff166003811115611c9457611c94615161565b6003811115611ca557611ca5615161565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d1b82611a9c565b9050600283516003811115611d3257611d32615161565b14611d53578251604051633b0d540d60e21b815261063c91906004016156de565b60208301516001600160a01b03163314611def575f8281526005850160205260409020546001600160a01b03163314611d8c5733611278565b5f82815260058501602052604090205460a0820151611dbb91600160b01b90046001600160401b031690615791565b6001600160401b0316421015611def5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0457611e04615161565b03611f325760028401546080840151611e26916001600160401b031690615791565b6001600160401b0316421015611e5a5760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e6c57611e6a828761249e565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ea5918491611ea091906157b1565b6137aa565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611ee684613901565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116619350505050565b600481516005811115611f4757611f47615161565b03611f7b57611f5583613901565b5f898152600786016020526040902055611f6e88612cfd565b6001945050505050611661565b805160405163170cc93360e21b815261063c91906004016152f3565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561204a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207191908101906157dc565b915091508061209357604051636b2f19e960e01b815260040160405180910390fd5b8151156120b9578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120f5576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213157815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b6002811015612180576121488160016158ae565b6121539060086156a8565b61ffff168482815181106121695761216961539e565b016020015160f81c901b9190911790600101612134565b5061ffff8116156121aa5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612205576121c18160036158ae565b6121cc9060086156a8565b63ffffffff16856121de836002615673565b815181106121ee576121ee61539e565b016020015160f81c901b91909117906001016121ad565b5063ffffffff81161561222b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122805761224281601f6158ae565b61224d9060086156a8565b86612259836006615673565b815181106122695761226961539e565b016020015160f81c901b919091179060010161222e565b50949350505050565b60605f808335602085013560146122a58787016040890161533e565b6122b26060890189615359565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6123386060850185615359565b90508110156120f5578161234f6060860186615359565b8381811061235f5761235f61539e565b905060200281019061237191906153b2565b61237b90806158c1565b905061238a6060870187615359565b8481811061239a5761239a61539e565b90506020028101906123ac91906153b2565b6123b690806158c1565b6123c36060890189615359565b868181106123d3576123d361539e565b90506020028101906123e591906153b2565b6123f39060208101906158c1565b61240060608b018b615359565b888181106124105761241061539e565b905060200281019061242291906153b2565b6124339060608101906040016150cc565b6040516020016124499796959493929190615903565b60408051601f19818403018152919052915060010161232b565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261251091908101906157dc565b915091508061253257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612575573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125999190615313565b8251146125bf578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156125fb576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f8061260a8460400151613a9e565b915091508187146126315760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615c51833981519152906001600160401b0390811690831611156126ee575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261270d565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615c518339815191528161273186613c8f565b905061273c86612463565b61274b57600192505050611661565b5f8681526005830160205260409020546001600160a01b031633146127705733611278565b5f86815260058301602052604090205460a082015161279f91600160b01b90046001600160401b031690615791565b6001600160401b03168160c001516001600160401b031610156127e65760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f85156127fe576127f7878661249e565b905061281c565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f9061284190611192565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156128aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ce9190615313565b905080846008015f8a81526020019081526020015f205f8282546128f29190615673565b90915550501515979650505050505050565b5f80516020615cb183398151915280546001190161293557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612944614f3f565b5f80516020615c718339815191525f806129606114c787611fe6565b91509150801561298757604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156129b8576129b8615161565b60058111156129c9576129c9615161565b81526020016001820180546129dd906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612a09906152c1565b8015612a545780601f10612a2b57610100808354040283529160200191612a54565b820191905f5260205f20905b815481529060010190602001808311612a3757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612abf57612abf615161565b14158015612ae05750600181516005811115612add57612add615161565b14155b15612b0157805160405163170cc93360e21b815261063c91906004016152f3565b600381516005811115612b1657612b16615161565b03612b245760048152612b29565b600581525b836008018160200151604051612b3f919061554f565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612b8357612b83615161565b021790555060208201516001820190612b9c90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612c4257612c42615161565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612cc5575f80fd5b505af1158015611056573d5f803e3d5ffd5b6114a76001600160a01b03831682613f73565b60015f80516020615cb183398151915255565b5f8181525f80516020615c918339815191526020526040808220815160e0810190925280545f80516020615c5183398151915293929190829060ff166003811115612d4a57612d4a615161565b6003811115612d5b57612d5b615161565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612e89575f84815260058701602052604090205461271090612e3b90600160a01b900461ffff16856156a8565b612e4591906156bf565b915081866008015f8681526020019081526020015f205f828254612e699190615673565b90915550612e79905082846158ae565b9050612e89856020015182612c79565b612e9e8560200151610f048760600151611192565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612f1b57835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612f6a57612f328160016158ae565b612f3d9060086156a8565b61ffff16868281518110612f5357612f5361539e565b016020015160f81c901b9190911790600101612f1e565b5061ffff811615612f945760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612fef57612fab8160036158ae565b612fb69060086156a8565b63ffffffff1687612fc8836002615673565b81518110612fd857612fd861539e565b016020015160f81c901b9190911790600101612f97565b5063ffffffff811660031461301757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561306c5761302e81601f6158ae565b6130399060086156a8565b88613045836006615673565b815181106130555761305561539e565b016020015160f81c901b919091179060010161301a565b505f805b60088110156130cb576130848160076158ae565b61308f9060086156a8565b6001600160401b0316896130a4836026615673565b815181106130b4576130b461539e565b016020015160f81c901b9190911790600101613070565b505f805b600881101561312a576130e38160076158ae565b6130ee9060086156a8565b6001600160401b03168a61310383602e615673565b815181106131135761311361539e565b016020015160f81c901b91909117906001016130cf565b5091989097509095509350505050565b5f80825160271461317057825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b60028110156131bf576131878160016158ae565b6131929060086156a8565b61ffff168582815181106131a8576131a861539e565b016020015160f81c901b9190911790600101613173565b5061ffff8116156131e95760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613244576132008160036158ae565b61320b9060086156a8565b63ffffffff168661321d836002615673565b8151811061322d5761322d61539e565b016020015160f81c901b91909117906001016131ec565b5063ffffffff811660021461326c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132c15761328381601f6158ae565b61328e9060086156a8565b8761329a836006615673565b815181106132aa576132aa61539e565b016020015160f81c901b919091179060010161326f565b505f866026815181106132d6576132d661539e565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615c5183398151915290600160401b900461ffff908116908616108061334a575061271061ffff8616115b1561336e57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b0390811690851610156133aa576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133bc5750806001015483115b156133dd5760405163222d164360e21b81526004810184905260240161063c565b825f6133e882610e01565b90505f6133f58983614006565b905060405180608001604052806134093390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6134cc61457e565b610f24816145c9565b5f5f80516020615c51833981519152816134ee84610e01565b90505f6134fa87611a9c565b905061350587612463565b613525576040516330efa98b60e01b81526004810188905260240161063c565b60028151600581111561353a5761353a615161565b1461355b57805160405163170cc93360e21b815261063c91906004016152f3565b5f82826080015161356c9190615791565b905083600201600a9054906101000a90046001600160401b03168260400151613595919061596c565b6001600160401b0316816001600160401b031611156135d257604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135de8a846137aa565b915091505f8a8360405160200161360c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff1916600183600381111561369f5761369f615161565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615cd1833981519152602052604081206002015481905f80516020615c7183398151915290600160801b90046001600160401b03166137f2858261463d565b5f6137fc87614860565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61384c8a858b611f97565b6040518263ffffffff1660e01b81526004016138689190615301565b6020604051808303815f875af1158015613884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138a89190615313565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615c5183398151915290505f6139218460400151611a9c565b90505f60038251600581111561393957613939615161565b1480613957575060048251600581111561395557613955615161565b145b15613967575060c08101516139a4565b60028251600581111561397c5761397c615161565b036139885750426139a4565b815160405163170cc93360e21b815261063c91906004016152f3565b84608001516001600160401b0316816001600160401b0316116139cb57505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139f090611192565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa158015613a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a959190615313565b95945050505050565b5f808251602e14613ad457825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613b2357613aeb8160016158ae565b613af69060086156a8565b61ffff16858281518110613b0c57613b0c61539e565b016020015160f81c901b9190911790600101613ad7565b5061ffff811615613b4d5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613ba857613b648160036158ae565b613b6f9060086156a8565b63ffffffff1686613b81836002615673565b81518110613b9157613b9161539e565b016020015160f81c901b9190911790600101613b50565b5063ffffffff811615613bce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c2357613be581601f6158ae565b613bf09060086156a8565b87613bfc836006615673565b81518110613c0c57613c0c61539e565b016020015160f81c901b9190911790600101613bd1565b505f805b6008811015613c8257613c3b8160076158ae565b613c469060086156a8565b6001600160401b031688613c5b836026615673565b81518110613c6b57613c6b61539e565b016020015160f81c901b9190911790600101613c27565b5090969095509350505050565b613c97614f3f565b5f8281525f80516020615cd18339815191526020526040808220815160e0810190925280545f80516020615c7183398151915293929190829060ff166005811115613ce457613ce4615161565b6005811115613cf557613cf5615161565b8152602001600182018054613d09906152c1565b80601f0160208091040260200160405190810160405280929190818152602001828054613d35906152c1565b8015613d805780601f10613d5757610100808354040283529160200191613d80565b820191905f5260205f20905b815481529060010190602001808311613d6357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dee57613dee615161565b14613e21575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff16906004016152f3565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e6557613e65615161565b021790555060208201516001820190613e7e90826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f1c85826137aa565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f965760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fdf576040519150601f19603f3d011682016040523d82523d5f602084013e613fe4565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661404a57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615c718339815191524261406960608601604087016150cc565b6001600160401b03161115806140a357506140876202a30042615673565b61409760608601604087016150cc565b6001600160401b031610155b156140dd576140b860608501604086016150cc565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b6140f26140ed6060860186615997565b6148d5565b6141026140ed6080860186615997565b603061411160208601866158c1565b9050146141435761412560208501856158c1565b6040516326475b2f60e11b815261063c925060040190815260200190565b61414d84806158c1565b90505f0361417a5761415f84806158c1565b604051633e08a12560e11b815260040161063c9291906159ab565b5f6008820161418986806158c1565b604051614197929190615782565b908152602001604051809103902054146141d0576141b584806158c1565b60405163a41f772f60e01b815260040161063c9291906159ab565b6141da835f61463d565b6040805160e08101909152815481525f9081906142e690602081016141ff89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614247908a018a6158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161429060608a0160408b016150cc565b6001600160401b031681526020016142ab60608a018a615997565b6142b4906159d9565b81526020016142c660808a018a615997565b6142cf906159d9565b8152602001876001600160401b0316815250614a3e565b5f8281526006860160205260409020919350915061430482826155a4565b50816008840161431488806158c1565b604051614322929190615782565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061435e908590600401615301565b6020604051808303815f875af115801561437a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061439e9190615313565b6040805160e0810190915290915080600181526020016143be89806158c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561444d5761444d615161565b02179055506020820151600182019061446690826155a4565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061450488806158c1565b604051614512929190615782565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061455091906150cc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166145c757604051631afcd79f60e31b815260040160405180910390fd5b565b6145d161457e565b6145da81614c2b565b6145e2614c44565b610f24606082013560808301356145ff60c0850160a086016150cc565b61460f60e0860160c08701615aa0565b614620610100870160e08801615ab9565b61010087013561463861014089016101208a0161533e565b614c54565b5f80516020615c718339815191525f6001600160401b0380841690851611156146715761466a83856157b1565b905061467e565b61467b84846157b1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146e05750600184015481516146dc916001600160401b031690615673565b8210155b15614706576001600160401b038316606082015281815260408101516020820152614725565b82816060018181516147189190615791565b6001600160401b03169052505b606081015161473590606461596c565b602082015160018601546001600160401b0392909216916147609190600160401b900460ff166156a8565b101561479057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b0316816040018181516147ab9190615673565b9052506040810180516001600160401b03871691906147cb9083906158ae565b905250600184015460408201516064916147f091600160401b90910460ff16906156a8565b1015614817578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615cd18339815191526020526040812060020180545f80516020615c7183398151915291906008906148aa90600160401b90046001600160401b0316615ad9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6148e26020820182615075565b63ffffffff1615801561490257506148fd6020820182615359565b151590505b15614949576149146020820182615075565b6149216020830183615359565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6149566020820182615359565b90506149656020830183615075565b63ffffffff16111561497e576149146020820182615075565b60015b61498e6020830183615359565b90508110156114a7576149a46020830183615359565b6149af6001846158ae565b8181106149be576149be61539e565b90506020020160208101906149d3919061533e565b6001600160a01b03166149e96020840184615359565b838181106149f9576149f961539e565b9050602002016020810190614a0e919061533e565b6001600160a01b03161015614a3657604051630dbc8d5f60e31b815260040160405180910390fd5b600101614981565b5f6060826040015151603014614a675760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614aa8988a986001989297929690959094909390929101615af4565b60405160208183030381529060405290505f5b84608001516020015151811015614b1a57818560800151602001518281518110614ae757614ae761539e565b6020026020010151604051602001614b00929190615bae565b60408051601f198184030181529190529150600101614abb565b5060a0840151805160209182015151604051614b3a938593929101615be4565b60405160208183030381529060405290505f5b8460a001516020015151811015614bac57818560a00151602001518281518110614b7957614b7961539e565b6020026020010151604051602001614b92929190615bae565b60408051601f198184030181529190529150600101614b4d565b5060c0840151604051614bc3918391602001615c1f565b6040516020818303038152906040529050600281604051614be4919061554f565b602060405180830381855afa158015614bff573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c229190615313565b94909350915050565b614c3361457e565b614c3b614e10565b610f2481614e18565b614c4c61457e565b6145c7614f00565b614c5c61457e565b5f80516020615c5183398151915261ffff85161580614c80575061271061ffff8616115b15614ca457604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614cc85760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614cdb5750600a60ff8516115b15614cfe5760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614d65576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614d855760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6145c761457e565b614e2061457e565b80355f80516020615c718339815191529081556014614e456060840160408501615ab9565b60ff161180614e645750614e5f6060830160408401615ab9565b60ff16155b15614e9857614e796060830160408401615ab9565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614ea86060830160408401615ab9565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ed960408301602084016150cc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612cea61457e565b508054614f14906152c1565b5f825580601f10614f23575050565b601f0160209004905f5260205f2090810190610f249190614f7c565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614f90575f8155600101614f7d565b5090565b8015158114610f24575f80fd5b803563ffffffff81168114611a97575f80fd5b5f805f60608486031215614fc6575f80fd5b833592506020840135614fd881614f94565b9150614fe660408501614fa1565b90509250925092565b5f60208284031215614fff575f80fd5b5035919050565b5f8060408385031215615017575f80fd5b82356001600160401b0381111561502c575f80fd5b83016080818603121561503d575f80fd5b915061504b60208401614fa1565b90509250929050565b5f8060408385031215615065575f80fd5b8235915061504b60208401614fa1565b5f60208284031215615085575f80fd5b61166182614fa1565b5f806040838503121561509f575f80fd5b6150a883614fa1565b946020939093013593505050565b80356001600160401b0381168114611a97575f80fd5b5f602082840312156150dc575f80fd5b611661826150b6565b803561ffff81168114611a97575f80fd5b5f805f60608486031215615108575f80fd5b83356001600160401b0381111561511d575f80fd5b840160a0818703121561512e575f80fd5b925061513c602085016150e5565b9150614fe6604085016150b6565b5f610140828403121561515b575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b6006811061518557615185615161565b9052565b5f5b838110156151a357818101518382015260200161518b565b50505f910152565b5f81518084526151c2816020860160208601615189565b601f01601f19169290920160200192915050565b602081526151e8602082018351615175565b5f602083015160e060408401526152036101008401826151ab565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215615267575f80fd5b82356001600160401b038082111561527d575f80fd5b818501915085601f830112615290575f80fd5b81358181111561529e575f80fd5b8660208285010111156152af575f80fd5b60209290920196919550909350505050565b600181811c908216806152d557607f821691505b60208210810361515b57634e487b7160e01b5f52602260045260245ffd5b60208101610e558284615175565b602081525f61166160208301846151ab565b5f60208284031215615323575f80fd5b5051919050565b6001600160a01b0381168114610f24575f80fd5b5f6020828403121561534e575f80fd5b81356116618161532a565b5f808335601e1984360301811261536e575f80fd5b8301803591506001600160401b03821115615387575f80fd5b6020019150600581901b36038213156138fa575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153c6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615406576154066153d0565b60405290565b604080519081016001600160401b0381118282101715615406576154066153d0565b604051601f8201601f191681016001600160401b0381118282101715615456576154566153d0565b604052919050565b5f6001600160401b03821115615476576154766153d0565b50601f01601f191660200190565b5f82601f830112615493575f80fd5b81356154a66154a18261545e565b61542e565b8181528460208386010111156154ba575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156154e6575f80fd5b6154ee6153e4565b82356001600160401b0380821115615504575f80fd5b61551036838701615484565b83526020850135915080821115615525575f80fd5b5061553236828601615484565b602083015250615544604084016150b6565b604082015292915050565b5f82516153c6818460208701615189565b601f82111561064557805f5260205f20601f840160051c810160208510156155855750805b601f840160051c820191505b8181101561184a575f8155600101615591565b81516001600160401b038111156155bd576155bd6153d0565b6155d1816155cb84546152c1565b84615560565b602080601f831160018114615604575f84156155ed5750858301515b5f19600386901b1c1916600185901b178555611056565b5f85815260208120601f198616915b8281101561563257888601518255948401946001909101908401615613565b508582101561564f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5557610e5561565f565b5f63ffffffff80831681810361569e5761569e61565f565b6001019392505050565b8082028115828204841417610e5557610e5561565f565b5f826156d957634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106156f2576156f2615161565b91905290565b5f60208083525f845461570a816152c1565b806020870152604060018084165f811461572b576001811461574757615774565b60ff19851660408a0152604084151560051b8a01019550615774565b895f5260205f205f5b8581101561576b5781548b8201860152908301908801615750565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120f5576120f561565f565b6001600160401b038281168282160390808211156120f5576120f561565f565b8051611a9781614f94565b5f80604083850312156157ed575f80fd5b82516001600160401b0380821115615803575f80fd5b9084019060608287031215615816575f80fd5b61581e6153e4565b825181526020808401516158318161532a565b82820152604084015183811115615846575f80fd5b80850194505087601f85011261585a575f80fd5b8351925061586a6154a18461545e565b838152888285870101111561587d575f80fd5b61588c84838301848801615189565b806040840152508195506158a18188016157d1565b9450505050509250929050565b81810381811115610e5557610e5561565f565b5f808335601e198436030181126158d6575f80fd5b8301803591506001600160401b038211156158ef575f80fd5b6020019150368190038213156138fa575f80fd5b5f8851615914818460208d01615189565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b0381811683821602808216919082811461598f5761598f61565f565b505092915050565b5f8235603e198336030181126153c6575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156159e9575f80fd5b6159f161540c565b6159fa83614fa1565b81526020808401356001600160401b0380821115615a16575f80fd5b9085019036601f830112615a28575f80fd5b813581811115615a3a57615a3a6153d0565b8060051b9150615a4b84830161542e565b8181529183018401918481019036841115615a64575f80fd5b938501935b83851015615a8e5784359250615a7e8361532a565b8282529385019390850190615a69565b94860194909452509295945050505050565b5f60208284031215615ab0575f80fd5b611661826150e5565b5f60208284031215615ac9575f80fd5b813560ff81168114611661575f80fd5b5f6001600160401b0380831681810361569e5761569e61565f565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615b3a81602a850160208b01615189565b865190830190615b5181602a840160208b01615189565b60c087901b6001600160c01b031916602a9290910191820152615b83603282018660e01b6001600160e01b0319169052565b615b9c603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615bbf818460208801615189565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615bf5818460208901615189565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615c30818460208801615189565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615ed5380380615ed583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d888061014d5f395ff3fe6080604052600436106101f1575f3560e01c80638280a25a11610108578063ba3a4b971161009d578063c599e24f1161006d578063c599e24f1461058d578063c974d1b6146105a0578063d5f20ff6146105b4578063df93d8de146105e0578063fd7ac5e7146105f6575f80fd5b8063ba3a4b9714610510578063bc5fbfec1461052f578063bee0a03f1461054f578063c257a0f51461056e575f80fd5b8063a9778a7a116100d8578063a9778a7a14610326578063af2f5feb146104c3578063afb98096146104d6578063b771b3bc146104f6575f80fd5b80638280a25a1461045257806393e245981461046657806398f3e2b414610485578063a3a65e48146104a4575f80fd5b806335455ded1161018957806360305d621161015957806360305d62146103ab57806362065856146103d457806366435abf14610401578063732214f81461042057806376f7862114610433575f80fd5b806335455ded146103265780633a1cfff61461034e578063467ef06f1461036d5780635297fae61461038c575f80fd5b806320d91b7a116101c457806320d91b7a1461027f57806325e1c7761461029e5780632e2194d8146102bd578063329c3e12146102f4575f80fd5b80630118acc4146101f55780630322ed9814610216578063151d30d1146102355780631ec4472414610260575b5f80fd5b348015610200575f80fd5b5061021461020f366004614f1d565b610615565b005b348015610221575f80fd5b50610214610230366004614f58565b61064a565b348015610240575f80fd5b50610249600a81565b60405160ff90911681526020015b60405180910390f35b34801561026b575f80fd5b5061021461027a366004614f1d565b610858565b34801561028a575f80fd5b50610214610299366004614f6f565b610863565b3480156102a9575f80fd5b506102146102b8366004614fbd565b610d95565b3480156102c8575f80fd5b506102dc6102d7366004614f58565b610e09565b6040516001600160401b039091168152602001610257565b3480156102ff575f80fd5b5061030e6001600160991b0181565b6040516001600160a01b039091168152602001610257565b348015610331575f80fd5b5061033b61271081565b60405161ffff9091168152602001610257565b348015610359575f80fd5b50610214610368366004614f1d565b610e63565b348015610378575f80fd5b50610214610387366004614fde565b610e6e565b348015610397575f80fd5b506102146103a6366004614ff7565b610f2f565b3480156103b6575f80fd5b506103bf601481565b60405163ffffffff9091168152602001610257565b3480156103df575f80fd5b506103f36103ee366004615035565b61119a565b604051908152602001610257565b34801561040c575f80fd5b506102dc61041b366004614f58565b6111d1565b34801561042b575f80fd5b506103f35f81565b34801561043e575f80fd5b5061021461044d366004614f1d565b6111e5565b34801561045d575f80fd5b50610249603081565b348015610471575f80fd5b50610214610480366004614f58565b611210565b348015610490575f80fd5b5061021461049f366004614ff7565b6112db565b3480156104af575f80fd5b506102146104be366004614fde565b6114b3565b6103f36104d136600461505f565b61163c565b3480156104e1575f80fd5b506103f35f80516020615cdc83398151915281565b348015610501575f80fd5b5061030e6005600160991b0181565b34801561051b575f80fd5b5061021461052a366004614f58565b611670565b34801561053a575f80fd5b506103f35f80516020615cfc83398151915281565b34801561055a575f80fd5b50610214610569366004614f58565b611859565b348015610579575f80fd5b506102146105883660046150b3565b611996565b6103f361059b366004614f58565b611a73565b3480156105ab575f80fd5b50610249601481565b3480156105bf575f80fd5b506105d36105ce366004614f58565b611aa4565b604051610257919061513f565b3480156105eb575f80fd5b506102dc6202a30081565b348015610601575f80fd5b506103f36106103660046151bf565b611bf3565b610620838383611c4e565b61064557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d5c8339815191526020526040808220815160e0810190925280545f80516020615cfc83398151915293929190829060ff166005811115610697576106976150ca565b60058111156106a8576106a86150ca565b81526020016001820180546106bc9061522a565b80601f01602080910402602001604051908101604052809291908181526020018280546106e89061522a565b80156107335780601f1061070a57610100808354040283529160200191610733565b820191905f5260205f20905b81548152906001019060200180831161071657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079e5761079e6150ca565b146107d1575f8381526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b6005600160991b016001600160a01b031663ee5b48eb6107f68584606001515f611f9f565b6040518263ffffffff1660e01b8152600401610812919061526a565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061527c565b50505050565b610852838383611c4e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615cfc8339815191529060ff16156108b557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091c919061527c565b836020013514610945576040516372b0a7e760e11b81526020840135600482015260240161063c565b3061095660608501604086016152a7565b6001600160a01b0316146109995761097460608401604085016152a7565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161063c565b5f6109a760608501856152c2565b905090505f805b828163ffffffff161015610c8f575f6109ca60608801886152c2565b8363ffffffff168181106109e0576109e0615307565b90506020028101906109f2919061531b565b6109fb906154dc565b80516040519192505f916008880191610a13916154e7565b90815260200160405180910390205414610a4357805160405163a41f772f60e01b815261063c919060040161526a565b5f6002885f013584604051602001610a7292919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8c916154e7565b602060405180830381855afa158015610aa7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aca919061527c565b90508086600801835f0151604051610ae291906154e7565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b6457610b646150ca565b021790555060208201516001820190610b7d908261553c565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c2291168561560b565b8251604051919550610c33916154e7565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c889061561e565b90506109ae565b50600483018190556001830154606490610cb390600160401b900460ff1683615640565b1015610cd557604051635943317f60e01b81526004810182905260240161063c565b5f610ceb610ce286611fee565b60400151612104565b90505f610cff610cfa88615679565b612291565b90505f600282604051610d1291906154e7565b602060405180830381855afa158015610d2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d50919061527c565b9050828114610d7c57604051631872fc8d60e01b8152600481018290526024810184905260440161063c565b5050506009909201805460ff1916600117905550505050565b610d9e826123cc565b610dbe576040516330efa98b60e01b81526004810183905260240161063c565b5f610dc883611aa4565b5190506002816005811115610ddf57610ddf6150ca565b14610dff578060405163170cc93360e21b815260040161063c919061525c565b6108528383612407565b5f805f80516020615cdc83398151915260030154610e279084615751565b9050801580610e3c57506001600160401b0381115b15610e5d5760405163222d164360e21b81526004810184905260240161063c565b92915050565b610852838383612681565b610e7661286d565b5f80516020615cdc8339815191525f80610e8f846128a4565b91509150610e9c826123cc565b610ea857505050610f16565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ed657610ed66150ca565b03610efb575f83815260088501602052604081208054919055610ef98282612be2565b505b610f1181610f0c846040015161119a565b612c40565b505050505b610f2c60015f80516020615d3c83398151915255565b50565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115610f7c57610f7c6150ca565b6003811115610f8d57610f8d6150ca565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61100382611aa4565b905060018351600381111561101a5761101a6150ca565b1461103b578251604051633b0d540d60e21b815261063c9190600401615770565b600481516005811115611050576110506150ca565b036110665761105e85612c66565b505050505050565b5f8061107d61107489611fee565b60400151612e4d565b50915091508184146110aa57846040015160405163089938b360e11b815260040161063c91815260200190565b806001600160401b031683606001516001600160401b031610806110e35750806001600160401b03168560a001516001600160401b0316115b1561110c57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f90610e5d906001600160401b038416615640565b5f6111db82611aa4565b6080015192915050565b6111f0838383612681565b61064557604051635bff683f60e11b81526004810184905260240161063c565b5f80516020615cdc8339815191525f61122883611aa4565b519050600481600581111561123f5761123f6150ca565b1461125f578060405163170cc93360e21b815260040161063c919061525c565b5f8381526005830160205260409020546001600160a01b031633146112a557335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161063c565b5f83815260088301602090815260408083208054908490556005860190925290912054610852906001600160a01b031682612be2565b6112e361286d565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115611330576113306150ca565b6003811115611341576113416150ca565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113ba576113ba6150ca565b146113db578051604051633b0d540d60e21b815261063c9190600401615770565b60046113ea8260400151611aa4565b5160058111156113fc576113fc6150ca565b1461148e575f61140b85611fee565b90505f8061141c8360400151612e4d565b5091509150818460400151146114485760405163089938b360e11b81526004810183905260240161063c565b806001600160401b03168460c001516001600160401b0316111561148a57604051632e19bc2d60e11b81526001600160401b038216600482015260240161063c565b5050505b61149783612c66565b50506114af60015f80516020615d3c83398151915255565b5050565b5f80516020615cfc8339815191525f806114d86114cf85611fee565b604001516130a3565b91509150806114fe57604051632d07135360e01b8152811515600482015260240161063c565b5f828152600684016020526040902080546115189061522a565b90505f0361153c5760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078501602052604090205460ff166005811115611562576115626150ca565b14611595575f8281526007840160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b5f82815260068401602052604081206115ad91614e71565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61164561286d565b6116518484843461325f565b905061166960015f80516020615d3c83398151915255565b9392505050565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff1660038111156116bd576116bd6150ca565b60038111156116ce576116ce6150ca565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611747576117476150ca565b141580156117685750600381516003811115611765576117656150ca565b14155b15611789578051604051633b0d540d60e21b815261063c9190600401615770565b5f6117978260400151611aa4565b905080606001516001600160401b03165f036117c9576040516339b894f960e21b81526004810185905260240161063c565b6005600160991b016001600160a01b031663ee5b48eb6117f6846040015184606001518560800151611f9f565b6040518263ffffffff1660e01b8152600401611812919061526a565b6020604051808303815f875af115801561182e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611852919061527c565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615cfc83398151915291906118a09061522a565b90505f036118c45760405163089938b360e11b81526004810183905260240161063c565b60015f83815260078301602052604090205460ff1660058111156118ea576118ea6150ca565b1461191d575f8281526007820160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611956919060040161578a565b6020604051808303815f875af1158015611972573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610645919061527c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806119df575080546001600160401b03808416911610155b156119fd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a278361342d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611a7c61286d565b611a8782333461343e565b9050611a9f60015f80516020615d3c83398151915255565b919050565b611aac614ea8565b5f8281525f80516020615d5c833981519152602052604090819020815160e0810190925280545f80516020615cfc833981519152929190829060ff166005811115611af957611af96150ca565b6005811115611b0a57611b0a6150ca565b8152602001600182018054611b1e9061522a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4a9061522a565b8015611b955780601f10611b6c57610100808354040283529160200191611b95565b820191905f5260205f20905b815481529060010190602001808311611b7857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615cfc833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611c369086908690615814565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc8339815191529284929091829060ff166003811115611c9c57611c9c6150ca565b6003811115611cad57611cad6150ca565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d2382611aa4565b9050600283516003811115611d3a57611d3a6150ca565b14611d5b578251604051633b0d540d60e21b815261063c9190600401615770565b60208301516001600160a01b03163314611df7575f8281526005850160205260409020546001600160a01b03163314611d945733611280565b5f82815260058501602052604090205460a0820151611dc391600160b01b90046001600160401b031690615823565b6001600160401b0316421015611df75760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b600281516005811115611e0c57611e0c6150ca565b03611f3a5760028401546080840151611e2e916001600160401b031690615823565b6001600160401b0316421015611e625760405163fb6ce63f60e01b81526001600160401b034216600482015260240161063c565b8615611e7457611e728287612407565b505b5f8881526006850160205260409020805460ff1916600317905560608301516080820151611ead918491611ea89190615843565b613713565b505f898152600686016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611eee8461386a565b5f8a81526007870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116699350505050565b600481516005811115611f4f57611f4f6150ca565b03611f8357611f5d8361386a565b5f898152600786016020526040902055611f7688612c66565b6001945050505050611669565b805160405163170cc93360e21b815261063c919060040161525c565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612052573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612079919081019061586e565b915091508061209b57604051636b2f19e960e01b815260040160405180910390fd5b8151156120c1578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b0316156120fd576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5092915050565b5f815160261461213957815160405163cc92daa160e01b815263ffffffff90911660048201526026602482015260440161063c565b5f805b600281101561218857612150816001615940565b61215b906008615640565b61ffff1684828151811061217157612171615307565b016020015160f81c901b919091179060010161213c565b5061ffff8116156121b25760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b600481101561220d576121c9816003615940565b6121d4906008615640565b63ffffffff16856121e683600261560b565b815181106121f6576121f6615307565b016020015160f81c901b91909117906001016121b5565b5063ffffffff81161561223357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122885761224a81601f615940565b612255906008615640565b8661226183600661560b565b8151811061227157612271615307565b016020015160f81c901b9190911790600101612236565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b8360600151518110156120fd57818460600151828151811061232d5761232d615307565b60200260200101515f0151518560600151838151811061234f5761234f615307565b60200260200101515f01518660600151848151811061237057612370615307565b6020026020010151602001518760600151858151811061239257612392615307565b6020026020010151604001516040516020016123b2959493929190615953565b60408051601f198184030181529190529150600101612309565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612452573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612479919081019061586e565b915091508061249b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612502919061527c565b825114612528578151604051636ba589a560e01b8152600481019190915260240161063c565b60208201516001600160a01b031615612564576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161063c565b5f806125738460400151613a07565b9150915081871461259a5760405163089938b360e11b81526004810188905260240161063c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020600101545f80516020615cdc833981519152906001600160401b039081169083161115612657575f888152600582016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612676565b5f8881526005820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615cdc8339815191528161269a86613bf8565b90506126a5866123cc565b6126b457600192505050611669565b5f8681526005830160205260409020546001600160a01b031633146126d95733611280565b5f86815260058301602052604090205460a082015161270891600160b01b90046001600160401b031690615823565b6001600160401b03168160c001516001600160401b0316101561274f5760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161063c565b5f8515612767576127608786612407565b9050612785565b505f8681526005830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f906127aa9061119a565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa158015612813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612837919061527c565b905080846008015f8a81526020019081526020015f205f82825461285b919061560b565b90915550501515979650505050505050565b5f80516020615d3c83398151915280546001190161289e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6128ad614ea8565b5f80516020615cfc8339815191525f806128c96114cf87611fee565b9150915080156128f057604051632d07135360e01b8152811515600482015260240161063c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612921576129216150ca565b6005811115612932576129326150ca565b81526020016001820180546129469061522a565b80601f01602080910402602001604051908101604052809291908181526020018280546129729061522a565b80156129bd5780601f10612994576101008083540402835291602001916129bd565b820191905f5260205f20905b8154815290600101906020018083116129a057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612a2857612a286150ca565b14158015612a495750600181516005811115612a4657612a466150ca565b14155b15612a6a57805160405163170cc93360e21b815261063c919060040161525c565b600381516005811115612a7f57612a7f6150ca565b03612a8d5760048152612a92565b600581525b836008018160200151604051612aa891906154e7565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aec57612aec6150ca565b021790555060208201516001820190612b05908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bab57612bab6150ca565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c2e575f80fd5b505af115801561105e573d5f803e3d5ffd5b6114af6001600160a01b03831682613edc565b60015f80516020615d3c83398151915255565b5f8181525f80516020615d1c8339815191526020526040808220815160e0810190925280545f80516020615cdc83398151915293929190829060ff166003811115612cb357612cb36150ca565b6003811115612cc457612cc46150ca565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701909152908120805490829055929350909190808215612df2575f84815260058701602052604090205461271090612da490600160a01b900461ffff1685615640565b612dae9190615751565b915081866008015f8681526020019081526020015f205f828254612dd2919061560b565b90915550612de290508284615940565b9050612df2856020015182612be2565b612e078560200151610f0c876060015161119a565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e8457835160405163cc92daa160e01b815263ffffffff90911660048201526036602482015260440161063c565b5f805b6002811015612ed357612e9b816001615940565b612ea6906008615640565b61ffff16868281518110612ebc57612ebc615307565b016020015160f81c901b9190911790600101612e87565b5061ffff811615612efd5760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015612f5857612f14816003615940565b612f1f906008615640565b63ffffffff1687612f3183600261560b565b81518110612f4157612f41615307565b016020015160f81c901b9190911790600101612f00565b5063ffffffff8116600314612f8057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fd557612f9781601f615940565b612fa2906008615640565b88612fae83600661560b565b81518110612fbe57612fbe615307565b016020015160f81c901b9190911790600101612f83565b505f805b600881101561303457612fed816007615940565b612ff8906008615640565b6001600160401b03168961300d83602661560b565b8151811061301d5761301d615307565b016020015160f81c901b9190911790600101612fd9565b505f805b60088110156130935761304c816007615940565b613057906008615640565b6001600160401b03168a61306c83602e61560b565b8151811061307c5761307c615307565b016020015160f81c901b9190911790600101613038565b5091989097509095509350505050565b5f8082516027146130d957825160405163cc92daa160e01b815263ffffffff90911660048201526027602482015260440161063c565b5f805b6002811015613128576130f0816001615940565b6130fb906008615640565b61ffff1685828151811061311157613111615307565b016020015160f81c901b91909117906001016130dc565b5061ffff8116156131525760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b60048110156131ad57613169816003615940565b613174906008615640565b63ffffffff168661318683600261560b565b8151811061319657613196615307565b016020015160f81c901b9190911790600101613155565b5063ffffffff81166002146131d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561322a576131ec81601f615940565b6131f7906008615640565b8761320383600661560b565b8151811061321357613213615307565b016020015160f81c901b91909117906001016131d8565b505f8660268151811061323f5761323f615307565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615cdc83398151915290600160401b900461ffff90811690861610806132b3575061271061ffff8616115b156132d757604051635f12e6c360e11b815261ffff8616600482015260240161063c565b60028101546001600160401b039081169085161015613313576040516202a06d60e11b81526001600160401b038516600482015260240161063c565b80548310806133255750806001015483115b156133465760405163222d164360e21b81526004810184905260240161063c565b825f61335182610e09565b90505f61335e8983613f6f565b905060405180608001604052806133723390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526005909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b6134356144e7565b610f2c81614532565b5f5f80516020615cdc8339815191528161345784610e09565b90505f61346387611aa4565b905061346e876123cc565b61348e576040516330efa98b60e01b81526004810188905260240161063c565b6002815160058111156134a3576134a36150ca565b146134c457805160405163170cc93360e21b815261063c919060040161525c565b5f8282608001516134d59190615823565b905083600201600a9054906101000a90046001600160401b031682604001516134fe91906159cc565b6001600160401b0316816001600160401b0316111561353b57604051636d51fe0560e11b81526001600160401b038216600482015260240161063c565b5f806135478a84613713565b915091505f8a8360405160200161357592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff19166001836003811115613608576136086150ca565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615d5c833981519152602052604081206002015481905f80516020615cfc83398151915290600160801b90046001600160401b031661375b85826145a6565b5f613765876147c9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137b58a858b611f9f565b6040518263ffffffff1660e01b81526004016137d1919061526a565b6020604051808303815f875af11580156137ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613811919061527c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615cdc83398151915290505f61388a8460400151611aa4565b90505f6003825160058111156138a2576138a26150ca565b14806138c057506004825160058111156138be576138be6150ca565b145b156138d0575060c081015161390d565b6002825160058111156138e5576138e56150ca565b036138f157504261390d565b815160405163170cc93360e21b815261063c919060040161525c565b84608001516001600160401b0316816001600160401b03161161393457505f949350505050565b600483015460608601516001600160a01b0390911690634f22429f906139599061119a565b60a085015160808901516040808b01515f90815260058a0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818616606484015216608482015260a401602060405180830381865afa1580156139da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fe919061527c565b95945050505050565b5f808251602e14613a3d57825160405163cc92daa160e01b815263ffffffff9091166004820152602e602482015260440161063c565b5f805b6002811015613a8c57613a54816001615940565b613a5f906008615640565b61ffff16858281518110613a7557613a75615307565b016020015160f81c901b9190911790600101613a40565b5061ffff811615613ab65760405163407b587360e01b815261ffff8216600482015260240161063c565b5f805b6004811015613b1157613acd816003615940565b613ad8906008615640565b63ffffffff1686613aea83600261560b565b81518110613afa57613afa615307565b016020015160f81c901b9190911790600101613ab9565b5063ffffffff811615613b3757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b8c57613b4e81601f615940565b613b59906008615640565b87613b6583600661560b565b81518110613b7557613b75615307565b016020015160f81c901b9190911790600101613b3a565b505f805b6008811015613beb57613ba4816007615940565b613baf906008615640565b6001600160401b031688613bc483602661560b565b81518110613bd457613bd4615307565b016020015160f81c901b9190911790600101613b90565b5090969095509350505050565b613c00614ea8565b5f8281525f80516020615d5c8339815191526020526040808220815160e0810190925280545f80516020615cfc83398151915293929190829060ff166005811115613c4d57613c4d6150ca565b6005811115613c5e57613c5e6150ca565b8152602001600182018054613c729061522a565b80601f0160208091040260200160405190810160405280929190818152602001828054613c9e9061522a565b8015613ce95780601f10613cc057610100808354040283529160200191613ce9565b820191905f5260205f20905b815481529060010190602001808311613ccc57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d5757613d576150ca565b14613d8a575f8481526007830160205260409081902054905163170cc93360e21b815261063c9160ff169060040161525c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dce57613dce6150ca565b021790555060208201516001820190613de7908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e858582613713565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eff5760405163cd78605960e01b815230600482015260240161063c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f48576040519150601f19603f3d011682016040523d82523d5f602084013e613f4d565b606091505b505090508061064557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fb357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615cfc83398151915242613fd26060860160408701615035565b6001600160401b031611158061400c5750613ff06202a3004261560b565b6140006060860160408701615035565b6001600160401b031610155b15614046576140216060850160408601615035565b604051635879da1360e11b81526001600160401b03909116600482015260240161063c565b61405b61405660608601866159f7565b61483e565b61406b61405660808601866159f7565b603061407a6020860186615a0b565b9050146140ac5761408e6020850185615a0b565b6040516326475b2f60e11b815261063c925060040190815260200190565b6140b68480615a0b565b90505f036140e3576140c88480615a0b565b604051633e08a12560e11b815260040161063c929190615a4d565b5f600882016140f28680615a0b565b604051614100929190615814565b908152602001604051809103902054146141395761411e8480615a0b565b60405163a41f772f60e01b815260040161063c929190615a4d565b614143835f6145a6565b6040805160e08101909152815481525f90819061424f90602081016141688980615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141b0908a018a615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141f960608a0160408b01615035565b6001600160401b0316815260200161421460608a018a6159f7565b61421d90615a7b565b815260200161422f60808a018a6159f7565b61423890615a7b565b8152602001876001600160401b03168152506149a7565b5f8281526006860160205260409020919350915061426d828261553c565b50816008840161427d8880615a0b565b60405161428b929190615814565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142c790859060040161526a565b6020604051808303815f875af11580156142e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614307919061527c565b6040805160e0810190915290915080600181526020016143278980615a0b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143b6576143b66150ca565b0217905550602082015160018201906143cf908261553c565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061446d8880615a0b565b60405161447b929190615814565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144b99190615035565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661453057604051631afcd79f60e31b815260040160405180910390fd5b565b61453a6144e7565b61454381614b94565b61454b614bad565b610f2c6060820135608083013561456860c0850160a08601615035565b61457860e0860160c08701615b2b565b614589610100870160e08801615b44565b6101008701356145a161014089016101208a016152a7565b614bbd565b5f80516020615cfc8339815191525f6001600160401b0380841690851611156145da576145d38385615843565b90506145e7565b6145e48484615843565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614649575060018401548151614645916001600160401b03169061560b565b8210155b1561466f576001600160401b03831660608201528181526040810151602082015261468e565b82816060018181516146819190615823565b6001600160401b03169052505b606081015161469e9060646159cc565b602082015160018601546001600160401b0392909216916146c99190600160401b900460ff16615640565b10156146f957606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161063c565b856001600160401b031681604001818151614714919061560b565b9052506040810180516001600160401b0387169190614734908390615940565b9052506001840154604082015160649161475991600160401b90910460ff1690615640565b1015614780578060400151604051635943317f60e01b815260040161063c91815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d5c8339815191526020526040812060020180545f80516020615cfc833981519152919060089061481390600160401b90046001600160401b0316615b64565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61484b6020820182614fde565b63ffffffff1615801561486b575061486660208201826152c2565b151590505b156148b25761487d6020820182614fde565b61488a60208301836152c2565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161063c565b6148bf60208201826152c2565b90506148ce6020830183614fde565b63ffffffff1611156148e75761487d6020820182614fde565b60015b6148f760208301836152c2565b90508110156114af5761490d60208301836152c2565b614918600184615940565b81811061492757614927615307565b905060200201602081019061493c91906152a7565b6001600160a01b031661495260208401846152c2565b8381811061496257614962615307565b905060200201602081019061497791906152a7565b6001600160a01b0316101561499f57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148ea565b5f60608260400151516030146149d05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a11988a986001989297929690959094909390929101615b7f565b60405160208183030381529060405290505f5b84608001516020015151811015614a8357818560800151602001518281518110614a5057614a50615307565b6020026020010151604051602001614a69929190615c39565b60408051601f198184030181529190529150600101614a24565b5060a0840151805160209182015151604051614aa3938593929101615c6f565b60405160208183030381529060405290505f5b8460a001516020015151811015614b1557818560a00151602001518281518110614ae257614ae2615307565b6020026020010151604051602001614afb929190615c39565b60408051601f198184030181529190529150600101614ab6565b5060c0840151604051614b2c918391602001615caa565b6040516020818303038152906040529050600281604051614b4d91906154e7565b602060405180830381855afa158015614b68573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8b919061527c565b94909350915050565b614b9c6144e7565b614ba4614d79565b610f2c81614d81565b614bb56144e7565b614530614e69565b614bc56144e7565b5f80516020615cdc83398151915261ffff85161580614be9575061271061ffff8616115b15614c0d57604051635f12e6c360e11b815261ffff8616600482015260240161063c565b86881115614c315760405163222d164360e21b81526004810189905260240161063c565b60ff84161580614c445750600a60ff8516115b15614c675760405163170db35960e31b815260ff8516600482015260240161063c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316866001600160401b03161015614cce576040516202a06d60e11b81526001600160401b038716600482015260240161063c565b825f03614cee5760405163a733007160e01b815260040160405180910390fd5b96875560018701959095556002860180546001600160401b039590951669ffffffffffffffffffff1990951694909417600160401b61ffff94909416939093029290921767ffffffffffffffff60501b191660ff91909116600160501b02179091556003830155600490910180546001600160a01b0319166001600160a01b03909216919091179055565b6145306144e7565b614d896144e7565b80355f80516020615cfc8339815191529081556014614dae6060840160408501615b44565b60ff161180614dcd5750614dc86060830160408401615b44565b60ff16155b15614e0157614de26060830160408401615b44565b604051634a59bbff60e11b815260ff909116600482015260240161063c565b614e116060830160408401615b44565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e426040830160208401615035565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c536144e7565b508054614e7d9061522a565b5f825580601f10614e8c575050565b601f0160209004905f5260205f2090810190610f2c9190614ee5565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ef9575f8155600101614ee6565b5090565b8015158114610f2c575f80fd5b803563ffffffff81168114611a9f575f80fd5b5f805f60608486031215614f2f575f80fd5b833592506020840135614f4181614efd565b9150614f4f60408501614f0a565b90509250925092565b5f60208284031215614f68575f80fd5b5035919050565b5f8060408385031215614f80575f80fd5b82356001600160401b03811115614f95575f80fd5b830160808186031215614fa6575f80fd5b9150614fb460208401614f0a565b90509250929050565b5f8060408385031215614fce575f80fd5b82359150614fb460208401614f0a565b5f60208284031215614fee575f80fd5b61166982614f0a565b5f8060408385031215615008575f80fd5b61501183614f0a565b946020939093013593505050565b80356001600160401b0381168114611a9f575f80fd5b5f60208284031215615045575f80fd5b6116698261501f565b803561ffff81168114611a9f575f80fd5b5f805f60608486031215615071575f80fd5b83356001600160401b03811115615086575f80fd5b840160a08187031215615097575f80fd5b92506150a56020850161504e565b9150614f4f6040850161501f565b5f61014082840312156150c4575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b600681106150ee576150ee6150ca565b9052565b5f5b8381101561510c5781810151838201526020016150f4565b50505f910152565b5f815180845261512b8160208601602086016150f2565b601f01601f19169290920160200192915050565b602081526151516020820183516150de565b5f602083015160e0604084015261516c610100840182615114565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156151d0575f80fd5b82356001600160401b03808211156151e6575f80fd5b818501915085601f8301126151f9575f80fd5b813581811115615207575f80fd5b866020828501011115615218575f80fd5b60209290920196919550909350505050565b600181811c9082168061523e57607f821691505b6020821081036150c457634e487b7160e01b5f52602260045260245ffd5b60208101610e5d82846150de565b602081525f6116696020830184615114565b5f6020828403121561528c575f80fd5b5051919050565b6001600160a01b0381168114610f2c575f80fd5b5f602082840312156152b7575f80fd5b813561166981615293565b5f808335601e198436030181126152d7575f80fd5b8301803591506001600160401b038211156152f0575f80fd5b6020019150600581901b3603821315613863575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261532f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561536f5761536f615339565b60405290565b604051608081016001600160401b038111828210171561536f5761536f615339565b604080519081016001600160401b038111828210171561536f5761536f615339565b604051601f8201601f191681016001600160401b03811182821017156153e1576153e1615339565b604052919050565b5f6001600160401b0382111561540157615401615339565b50601f01601f191660200190565b5f82601f83011261541e575f80fd5b813561543161542c826153e9565b6153b9565b818152846020838601011115615445575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215615471575f80fd5b61547961534d565b905081356001600160401b0380821115615491575f80fd5b61549d8583860161540f565b835260208401359150808211156154b2575f80fd5b506154bf8482850161540f565b6020830152506154d16040830161501f565b604082015292915050565b5f610e5d3683615461565b5f825161532f8184602087016150f2565b601f82111561064557805f5260205f20601f840160051c8101602085101561551d5750805b601f840160051c820191505b81811015611852575f8155600101615529565b81516001600160401b0381111561555557615555615339565b61556981615563845461522a565b846154f8565b602080601f83116001811461559c575f84156155855750858301515b5f19600386901b1c1916600185901b17855561105e565b5f85815260208120601f198616915b828110156155ca578886015182559484019460019091019084016155ab565b50858210156155e757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e5d57610e5d6155f7565b5f63ffffffff808316818103615636576156366155f7565b6001019392505050565b8082028115828204841417610e5d57610e5d6155f7565b5f6001600160401b0382111561566f5761566f615339565b5060051b60200190565b5f60808236031215615689575f80fd5b615691615375565b823581526020808401358183015260408401356156ad81615293565b604083015260608401356001600160401b03808211156156cb575f80fd5b9085019036601f8301126156dd575f80fd5b81356156eb61542c82615657565b81815260059190911b83018401908481019036831115615709575f80fd5b8585015b8381101561573f57803585811115615723575f80fd5b6157313689838a0101615461565b84525091860191860161570d565b50606087015250939695505050505050565b5f8261576b57634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310615784576157846150ca565b91905290565b5f60208083525f845461579c8161522a565b806020870152604060018084165f81146157bd57600181146157d957615806565b60ff19851660408a0152604084151560051b8a01019550615806565b895f5260205f205f5b858110156157fd5781548b82018601529083019088016157e2565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b038181168382160190808211156120fd576120fd6155f7565b6001600160401b038281168282160390808211156120fd576120fd6155f7565b8051611a9f81614efd565b5f806040838503121561587f575f80fd5b82516001600160401b0380821115615895575f80fd5b90840190606082870312156158a8575f80fd5b6158b061534d565b825181526020808401516158c381615293565b828201526040840151838111156158d8575f80fd5b80850194505087601f8501126158ec575f80fd5b835192506158fc61542c846153e9565b838152888285870101111561590f575f80fd5b61591e848383018488016150f2565b80604084015250819550615933818801615863565b9450505050509250929050565b81810381811115610e5d57610e5d6155f7565b5f8651615964818460208b016150f2565b60e087901b6001600160e01b031916908301908152855161598c816004840160208a016150f2565b85519101906159a28160048401602089016150f2565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b6001600160401b038181168382160280821691908281146159ef576159ef6155f7565b505092915050565b5f8235603e1983360301811261532f575f80fd5b5f808335601e19843603018112615a20575f80fd5b8301803591506001600160401b03821115615a39575f80fd5b602001915036819003821315613863575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a8b575f80fd5b615a93615397565b615a9c83614f0a565b81526020808401356001600160401b03811115615ab7575f80fd5b840136601f820112615ac7575f80fd5b8035615ad561542c82615657565b81815260059190911b82018301908381019036831115615af3575f80fd5b928401925b82841015615b1a578335615b0b81615293565b82529284019290840190615af8565b938501939093525091949350505050565b5f60208284031215615b3b575f80fd5b6116698261504e565b5f60208284031215615b54575f80fd5b813560ff81168114611669575f80fd5b5f6001600160401b03808316818103615636576156366155f7565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bc581602a850160208b016150f2565b865190830190615bdc81602a840160208b016150f2565b60c087901b6001600160c01b031916602a9290910191820152615c0e603282018660e01b6001600160e01b0319169052565b615c27603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c4a8184602088016150f2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c808184602089016150f2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cbb8184602088016150f2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index a072d6ff7..5f7f58817 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -80,7 +80,7 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ADDRESS_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"startingWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"startedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"registrationInput\",\"type\":\"tuple\",\"internalType\":\"structValidatorRegistrationInput\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]},{\"name\":\"disableOwner\",\"type\":\"tuple\",\"internalType\":\"structPChainOwner\",\"components\":[{\"name\":\"threshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"addresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorSet\",\"inputs\":[{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWeightUpdate\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidBLSKeyLength\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMaximumChurnPercentage\",\"inputs\":[{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[{\"name\":\"actual\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidPChainOwnerThreshold\",\"inputs\":[{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"addressesLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidRegistrationExpiry\",\"inputs\":[{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"encodedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expectedSubnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidTotalWeight\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerAddress\",\"inputs\":[{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorManagerBlockchainID\",\"inputs\":[{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpOriginSenderAddress\",\"inputs\":[{\"name\":\"senderAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpSourceChainID\",\"inputs\":[{\"name\":\"sourceChainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"PChainOwnerAddressesNotSorted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613a5c380380613a5c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61390f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612cb7565b610312565b005b610149610159366004612ce6565b610529565b61014961016c366004612d34565b610a53565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612cb7565b610a61565b6040516001600160401b03909116815260200161018a565b610149610a75565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612cb7565b610a88565b6101cd61025a366004612d63565b610a9d565b61014961026d366004612d34565b610ab9565b6102216005600160991b0181565b6101cd5f805160206138c383398151915281565b6101496102a2366004612cb7565b610c42565b6101e3601481565b6101496102bd366004612dbc565b610d7f565b6102d56102d0366004612cb7565b610e8d565b60405161018a9190612e79565b6101a66202a30081565b6101496102fa366004612ef9565b610fdc565b6101cd61030d366004612f1b565b611019565b5f8181525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561035f5761035f612df8565b600581111561037057610370612df8565b815260200160018201805461038490612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612f86565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612df8565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611074565b6040518263ffffffff1660e01b81526004016104e39190612fcc565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612fde565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206138c38339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612fde565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612ef9565b6001600160a01b03161461065f5761063a6060840160408501612ef9565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612ff5565b905090505f805b828163ffffffff161015610955575f6106906060880188612ff5565b8363ffffffff168181106106a6576106a661303a565b90506020028101906106b8919061304e565b6106c190613172565b80516040519192505f9160088801916106d9916131eb565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612fcc565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610752916131eb565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612fde565b90508086600801835f01516040516107a891906131eb565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612df8565b0217905550602082015160018201906108439082613247565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e891168561331a565b82516040519195506108f9916131eb565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e9061332d565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff168361334f565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110c3565b604001516111d9565b90505f6109bd87611366565b90505f6002826040516109d091906131eb565b602060405180830381855afa1580156109eb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a0e9190612fde565b9050828114610a3a57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a5c81611540565b505050565b5f610a6b82610e8d565b6080015192915050565b610a7d61187e565b610a865f6118d9565b565b610a9061187e565b610a9981611949565b5050565b5f610aa661187e565b610ab08383611c2d565b90505b92915050565b5f805160206138c38339815191525f80610ade610ad5856110c3565b604001516121a5565b9150915080610b0457604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b1e90612f86565b90505f03610b425760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b6857610b68612df8565b14610b9b575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f8281526006840160205260408120610bb391612c2b565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206138c38339815191529190610c8990612f86565b90505f03610cad5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cd357610cd3612df8565b14610d06575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d3f9190600401613366565b6020604051808303815f875af1158015610d5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190612fde565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dc35750825b90505f826001600160401b03166001148015610dde5750303b155b905081158015610dec575080155b15610e0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3457845460ff60401b1916600160401b1785555b610e3e8787612361565b8315610e8457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e95612c62565b5f8281525f805160206138e3833981519152602052604090819020815160e0810190925280545f805160206138c3833981519152929190829060ff166005811115610ee257610ee2612df8565b6005811115610ef357610ef3612df8565b8152602001600182018054610f0790612f86565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3390612f86565b8015610f7e5780601f10610f5557610100808354040283529160200191610f7e565b820191905f5260205f20905b815481529060010190602001808311610f6157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fe461187e565b6001600160a01b03811661100d57604051631e4fbdf760e01b81525f6004820152602401610499565b611016816118d9565b50565b6040515f905f805160206138c3833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061105c90869086906133f0565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611127573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261114e919081019061340e565b915091508061117057604051636b2f19e960e01b815260040160405180910390fd5b815115611196578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111d2576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461120e57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561125d576112258160016134e0565b61123090600861334f565b61ffff168482815181106112465761124661303a565b016020015160f81c901b9190911790600101611211565b5061ffff8116156112875760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112e25761129e8160036134e0565b6112a990600861334f565b63ffffffff16856112bb83600261331a565b815181106112cb576112cb61303a565b016020015160f81c901b919091179060010161128a565b5063ffffffff81161561130857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561135d5761131f81601f6134e0565b61132a90600861334f565b8661133683600661331a565b815181106113465761134661303a565b016020015160f81c901b919091179060010161130b565b50949350505050565b60605f8083356020850135601461138287870160408901612ef9565b61138f6060890189612ff5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6114156060850185612ff5565b90508110156111d2578161142c6060860186612ff5565b8381811061143c5761143c61303a565b905060200281019061144e919061304e565b61145890806134f3565b90506114676060870187612ff5565b848181106114775761147761303a565b9050602002810190611489919061304e565b61149390806134f3565b6114a06060890189612ff5565b868181106114b0576114b061303a565b90506020028101906114c2919061304e565b6114d09060208101906134f3565b6114dd60608b018b612ff5565b888181106114ed576114ed61303a565b90506020028101906114ff919061304e565b611510906060810190604001613535565b604051602001611526979695949392919061354e565b60408051601f198184030181529190529150600101611408565b5f611549612c62565b5f805160206138c38339815191525f80611565610ad5876110c3565b91509150801561158c57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156115bd576115bd612df8565b60058111156115ce576115ce612df8565b81526020016001820180546115e290612f86565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90612f86565b80156116595780601f1061163057610100808354040283529160200191611659565b820191905f5260205f20905b81548152906001019060200180831161163c57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156116c4576116c4612df8565b141580156116e557506001815160058111156116e2576116e2612df8565b14155b1561170657805160405163170cc93360e21b81526104999190600401612fbe565b60038151600581111561171b5761171b612df8565b03611729576004815261172e565b600581525b83600801816020015160405161174491906131eb565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561178857611788612df8565b0217905550602082015160018201906117a19082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561184757611847612df8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118b07f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a865760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611951612c62565b5f8281525f805160206138e38339815191526020526040808220815160e0810190925280545f805160206138c383398151915293929190829060ff16600581111561199e5761199e612df8565b60058111156119af576119af612df8565b81526020016001820180546119c390612f86565b80601f01602080910402602001604051908101604052809291908181526020018280546119ef90612f86565b8015611a3a5780601f10611a1157610100808354040283529160200191611a3a565b820191905f5260205f20905b815481529060010190602001808311611a1d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611aa857611aa8612df8565b14611adb575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612fbe565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b1f57611b1f612df8565b021790555060208201516001820190611b389082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bd6858261237b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c7157604051637fab81e560e01b815260040160405180910390fd5b5f805160206138c383398151915242611c906060860160408701613535565b6001600160401b0316111580611cca5750611cae6202a3004261331a565b611cbe6060860160408701613535565b6001600160401b031610155b15611d0457611cdf6060850160408601613535565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611d19611d1460608601866135b7565b6124d2565b611d29611d1460808601866135b7565b6030611d3860208601866134f3565b905014611d6a57611d4c60208501856134f3565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d7484806134f3565b90505f03611da157611d8684806134f3565b604051633e08a12560e11b81526004016104999291906135cb565b5f60088201611db086806134f3565b604051611dbe9291906133f0565b90815260200160405180910390205414611df757611ddc84806134f3565b60405163a41f772f60e01b81526004016104999291906135cb565b611e01835f61263b565b6040805160e08101909152815481525f908190611f0d9060208101611e2689806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e6e908a018a6134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611eb760608a0160408b01613535565b6001600160401b03168152602001611ed260608a018a6135b7565b611edb906135f9565b8152602001611eed60808a018a6135b7565b611ef6906135f9565b8152602001876001600160401b031681525061285e565b5f82815260068601602052604090209193509150611f2b8282613247565b508160088401611f3b88806134f3565b604051611f499291906133f0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f85908590600401612fcc565b6020604051808303815f875af1158015611fa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc59190612fde565b6040805160e081019091529091508060018152602001611fe589806134f3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561207457612074612df8565b02179055506020820151600182019061208d9082613247565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061212b88806134f3565b6040516121399291906133f0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906121779190613535565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8082516027146121db57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b600281101561222a576121f28160016134e0565b6121fd90600861334f565b61ffff168582815181106122135761221361303a565b016020015160f81c901b91909117906001016121de565b5061ffff8116156122545760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122af5761226b8160036134e0565b61227690600861334f565b63ffffffff168661228883600261331a565b815181106122985761229861303a565b016020015160f81c901b9190911790600101612257565b5063ffffffff81166002146122d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561232c576122ee81601f6134e0565b6122f990600861334f565b8761230583600661331a565b815181106123155761231561303a565b016020015160f81c901b91909117906001016122da565b505f866026815181106123415761234161303a565b016020015191976001600160f81b03199092161515965090945050505050565b612369612a4b565b61237282612a94565b610a9981612aad565b5f8281525f805160206138e3833981519152602052604081206002015481905f805160206138c383398151915290600160801b90046001600160401b03166123c3858261263b565b5f6123cd87612abe565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241d8a858b611074565b6040518263ffffffff1660e01b81526004016124399190612fcc565b6020604051808303815f875af1158015612455573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124799190612fde565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124df6020820182612d34565b63ffffffff161580156124ff57506124fa6020820182612ff5565b151590505b15612546576125116020820182612d34565b61251e6020830183612ff5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6125536020820182612ff5565b90506125626020830183612d34565b63ffffffff16111561257b576125116020820182612d34565b60015b61258b6020830183612ff5565b9050811015610a99576125a16020830183612ff5565b6125ac6001846134e0565b8181106125bb576125bb61303a565b90506020020160208101906125d09190612ef9565b6001600160a01b03166125e66020840184612ff5565b838181106125f6576125f661303a565b905060200201602081019061260b9190612ef9565b6001600160a01b0316101561263357604051630dbc8d5f60e31b815260040160405180910390fd5b60010161257e565b5f805160206138c38339815191525f6001600160401b03808416908516111561266f5761266883856136c0565b905061267c565b61267984846136c0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806126de5750600184015481516126da916001600160401b03169061331a565b8210155b15612704576001600160401b038316606082015281815260408101516020820152612723565b828160600181815161271691906136e0565b6001600160401b03169052505b6060810151612733906064613700565b602082015160018601546001600160401b03929092169161275e9190600160401b900460ff1661334f565b101561278e57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516127a9919061331a565b9052506040810180516001600160401b03871691906127c99083906134e0565b905250600184015460408201516064916127ee91600160401b90910460ff169061334f565b1015612815578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146128875760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986128c8988a98600198929792969095909490939092910161372b565b60405160208183030381529060405290505f5b8460800151602001515181101561293a578185608001516020015182815181106129075761290761303a565b60200260200101516040516020016129209291906137e5565b60408051601f1981840301815291905291506001016128db565b5060a084015180516020918201515160405161295a93859392910161381b565b60405160208183030381529060405290505f5b8460a0015160200151518110156129cc57818560a001516020015182815181106129995761299961303a565b60200260200101516040516020016129b29291906137e5565b60408051601f19818403018152919052915060010161296d565b5060c08401516040516129e3918391602001613856565b6040516020818303038152906040529050600281604051612a0491906131eb565b602060405180830381855afa158015612a1f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612a429190612fde565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8657604051631afcd79f60e31b815260040160405180910390fd5b612a9c612a4b565b612aa4612b33565b61101681612b3b565b612ab5612a4b565b61101681612c23565b5f8181525f805160206138e38339815191526020526040812060020180545f805160206138c38339815191529190600890612b0890600160401b90046001600160401b0316613887565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a86612a4b565b612b43612a4b565b80355f805160206138c38339815191529081556014612b6860608401604085016138a2565b60ff161180612b875750612b8260608301604084016138a2565b60ff16155b15612bbb57612b9c60608301604084016138a2565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612bcb60608301604084016138a2565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612bfc6040830160208401613535565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fe4612a4b565b508054612c3790612f86565b5f825580601f10612c46575050565b601f0160209004905f5260205f20908101906110169190612c9f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612cb3575f8155600101612ca0565b5090565b5f60208284031215612cc7575f80fd5b5035919050565b803563ffffffff81168114612ce1575f80fd5b919050565b5f8060408385031215612cf7575f80fd5b82356001600160401b03811115612d0c575f80fd5b830160808186031215612d1d575f80fd5b9150612d2b60208401612cce565b90509250929050565b5f60208284031215612d44575f80fd5b610ab082612cce565b80356001600160401b0381168114612ce1575f80fd5b5f8060408385031215612d74575f80fd5b82356001600160401b03811115612d89575f80fd5b830160a08186031215612d9a575f80fd5b9150612d2b60208401612d4d565b6001600160a01b0381168114611016575f80fd5b5f808284036080811215612dce575f80fd5b6060811215612ddb575f80fd5b508291506060830135612ded81612da8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612e2857634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612e46578181015183820152602001612e2e565b50505f910152565b5f8151808452612e65816020860160208601612e2c565b601f01601f19169290920160200192915050565b60208152612e8b602082018351612e0c565b5f602083015160e06040840152612ea6610100840182612e4e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612f09575f80fd5b8135612f1481612da8565b9392505050565b5f8060208385031215612f2c575f80fd5b82356001600160401b0380821115612f42575f80fd5b818501915085601f830112612f55575f80fd5b813581811115612f63575f80fd5b866020828501011115612f74575f80fd5b60209290920196919550909350505050565b600181811c90821680612f9a57607f821691505b602082108103612fb857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ab38284612e0c565b602081525f610ab06020830184612e4e565b5f60208284031215612fee575f80fd5b5051919050565b5f808335601e1984360301811261300a575f80fd5b8301803591506001600160401b03821115613023575f80fd5b6020019150600581901b36038213156124cb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613062575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130a2576130a261306c565b60405290565b604080519081016001600160401b03811182821017156130a2576130a261306c565b604051601f8201601f191681016001600160401b03811182821017156130f2576130f261306c565b604052919050565b5f6001600160401b038211156131125761311261306c565b50601f01601f191660200190565b5f82601f83011261312f575f80fd5b813561314261313d826130fa565b6130ca565b818152846020838601011115613156575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215613182575f80fd5b61318a613080565b82356001600160401b03808211156131a0575f80fd5b6131ac36838701613120565b835260208501359150808211156131c1575f80fd5b506131ce36828601613120565b6020830152506131e060408401612d4d565b604082015292915050565b5f8251613062818460208701612e2c565b601f821115610a5c57805f5260205f20601f840160051c810160208510156132215750805b601f840160051c820191505b81811015613240575f815560010161322d565b5050505050565b81516001600160401b038111156132605761326061306c565b6132748161326e8454612f86565b846131fc565b602080601f8311600181146132a7575f84156132905750858301515b5f19600386901b1c1916600185901b1785556132fe565b5f85815260208120601f198616915b828110156132d5578886015182559484019460019091019084016132b6565b50858210156132f257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ab357610ab3613306565b5f63ffffffff80831681810361334557613345613306565b6001019392505050565b8082028115828204841417610ab357610ab3613306565b5f60208083525f845461337881612f86565b806020870152604060018084165f811461339957600181146133b5576133e2565b60ff19851660408a0152604084151560051b8a010195506133e2565b895f5260205f205f5b858110156133d95781548b82018601529083019088016133be565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612ce1575f80fd5b5f806040838503121561341f575f80fd5b82516001600160401b0380821115613435575f80fd5b9084019060608287031215613448575f80fd5b613450613080565b8251815260208084015161346381612da8565b82820152604084015183811115613478575f80fd5b80850194505087601f85011261348c575f80fd5b8351925061349c61313d846130fa565b83815288828587010111156134af575f80fd5b6134be84838301848801612e2c565b806040840152508195506134d38188016133ff565b9450505050509250929050565b81810381811115610ab357610ab3613306565b5f808335601e19843603018112613508575f80fd5b8301803591506001600160401b03821115613521575f80fd5b6020019150368190038213156124cb575f80fd5b5f60208284031215613545575f80fd5b610ab082612d4d565b5f885161355f818460208d01612e2c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b5f8235603e19833603018112613062575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215613609575f80fd5b6136116130a8565b61361a83612cce565b81526020808401356001600160401b0380821115613636575f80fd5b9085019036601f830112613648575f80fd5b81358181111561365a5761365a61306c565b8060051b915061366b8483016130ca565b8181529183018401918481019036841115613684575f80fd5b938501935b838510156136ae578435925061369e83612da8565b8282529385019390850190613689565b94860194909452509295945050505050565b6001600160401b038281168282160390808211156111d2576111d2613306565b6001600160401b038181168382160190808211156111d2576111d2613306565b6001600160401b0381811683821602808216919082811461372357613723613306565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161377181602a850160208b01612e2c565b86519083019061378881602a840160208b01612e2c565b60c087901b6001600160c01b031916602a92909101918201526137ba603282018660e01b6001600160e01b0319169052565b6137d3603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516137f6818460208801612e2c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161382c818460208901612e2c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351613867818460208801612e2c565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361334557613345613306565b5f602082840312156138b2575f80fd5b813560ff81168114612f14575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051613ae7380380613ae783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61399a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612c20565b610312565b005b610149610159366004612c4f565b610529565b61014961016c366004612c9d565b610a5b565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612c20565b610a69565b6040516001600160401b03909116815260200161018a565b610149610a7d565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612c20565b610a90565b6101cd61025a366004612ccc565b610aa5565b61014961026d366004612c9d565b610ac1565b6102216005600160991b0181565b6101cd5f8051602061394e83398151915281565b6101496102a2366004612c20565b610c4a565b6101e3601481565b6101496102bd366004612d25565b610d87565b6102d56102d0366004612c20565b610e95565b60405161018a9190612de2565b6101a66202a30081565b6101496102fa366004612e62565b610fe4565b6101cd61030d366004612e84565b611021565b5f8181525f8051602061396e8339815191526020526040808220815160e0810190925280545f8051602061394e83398151915293929190829060ff16600581111561035f5761035f612d61565b600581111561037057610370612d61565b815260200160018201805461038490612eef565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612eef565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612d61565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f61107c565b6040518263ffffffff1660e01b81526004016104e39190612f35565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612f47565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061394e8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612f47565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612e62565b6001600160a01b03161461065f5761063a6060840160408501612e62565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612f5e565b905090505f805b828163ffffffff161015610955575f6106906060880188612f5e565b8363ffffffff168181106106a6576106a6612fa3565b90506020028101906106b89190612fb7565b6106c190613178565b80516040519192505f9160088801916106d991613183565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612f35565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291613183565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612f47565b90508086600801835f01516040516107a89190613183565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612d61565b02179055506020820151600182019061084390826131df565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e89116856132b2565b82516040519195506108f991613183565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e906132c5565b9050610674565b5060048301819055600183015460649061097990600160401b900460ff16836132e7565b101561099b57604051635943317f60e01b815260048101829052602401610499565b5f6109b16109a8866110cb565b604001516111e1565b90505f6109c56109c088613320565b61136e565b90505f6002826040516109d89190613183565b602060405180830381855afa1580156109f3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a169190612f47565b9050828114610a4257604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a64816114a9565b505050565b5f610a7382610e95565b6080015192915050565b610a856117e7565b610a8e5f611842565b565b610a986117e7565b610aa1816118b2565b5050565b5f610aae6117e7565b610ab88383611b96565b90505b92915050565b5f8051602061394e8339815191525f80610ae6610add856110cb565b6040015161210e565b9150915080610b0c57604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610b2690612eef565b90505f03610b4a5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b7057610b70612d61565b14610ba3575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b5f8281526006840160205260408120610bbb91612b94565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061394e8339815191529190610c9190612eef565b90505f03610cb55760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610cdb57610cdb612d61565b14610d0e575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d4791906004016133f8565b6020604051808303815f875af1158015610d63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a649190612f47565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610dcb5750825b90505f826001600160401b03166001148015610de65750303b155b905081158015610df4575080155b15610e125760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e3c57845460ff60401b1916600160401b1785555b610e4687876122ca565b8315610e8c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e9d612bcb565b5f8281525f8051602061396e833981519152602052604090819020815160e0810190925280545f8051602061394e833981519152929190829060ff166005811115610eea57610eea612d61565b6005811115610efb57610efb612d61565b8152602001600182018054610f0f90612eef565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3b90612eef565b8015610f865780601f10610f5d57610100808354040283529160200191610f86565b820191905f5260205f20905b815481529060010190602001808311610f6957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fec6117e7565b6001600160a01b03811661101557604051631e4fbdf760e01b81525f6004820152602401610499565b61101e81611842565b50565b6040515f905f8051602061394e833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08906110649086908690613482565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561112f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261115691908101906134a0565b915091508061117857604051636b2f19e960e01b815260040160405180910390fd5b81511561119e578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b0316156111da576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f815160261461121657815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b60028110156112655761122d816001613572565b6112389060086132e7565b61ffff1684828151811061124e5761124e612fa3565b016020015160f81c901b9190911790600101611219565b5061ffff81161561128f5760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112ea576112a6816003613572565b6112b19060086132e7565b63ffffffff16856112c38360026132b2565b815181106112d3576112d3612fa3565b016020015160f81c901b9190911790600101611292565b5063ffffffff81161561131057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113655761132781601f613572565b6113329060086132e7565b8661133e8360066132b2565b8151811061134e5761134e612fa3565b016020015160f81c901b9190911790600101611313565b50949350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b8360600151518110156111da57818460600151828151811061140a5761140a612fa3565b60200260200101515f0151518560600151838151811061142c5761142c612fa3565b60200260200101515f01518660600151848151811061144d5761144d612fa3565b6020026020010151602001518760600151858151811061146f5761146f612fa3565b60200260200101516040015160405160200161148f959493929190613585565b60408051601f1981840301815291905291506001016113e6565b5f6114b2612bcb565b5f8051602061394e8339815191525f806114ce610add876110cb565b9150915080156114f557604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561152657611526612d61565b600581111561153757611537612d61565b815260200160018201805461154b90612eef565b80601f016020809104026020016040519081016040528092919081815260200182805461157790612eef565b80156115c25780601f10611599576101008083540402835291602001916115c2565b820191905f5260205f20905b8154815290600101906020018083116115a557829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561162d5761162d612d61565b1415801561164e575060018151600581111561164b5761164b612d61565b14155b1561166f57805160405163170cc93360e21b81526104999190600401612f27565b60038151600581111561168457611684612d61565b036116925760048152611697565b600581525b8360080181602001516040516116ad9190613183565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156116f1576116f1612d61565b02179055506020820151600182019061170a90826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156117b0576117b0612d61565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118197f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a8e5760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6118ba612bcb565b5f8281525f8051602061396e8339815191526020526040808220815160e0810190925280545f8051602061394e83398151915293929190829060ff16600581111561190757611907612d61565b600581111561191857611918612d61565b815260200160018201805461192c90612eef565b80601f016020809104026020016040519081016040528092919081815260200182805461195890612eef565b80156119a35780601f1061197a576101008083540402835291602001916119a3565b820191905f5260205f20905b81548152906001019060200180831161198657829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611a1157611a11612d61565b14611a44575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612f27565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611a8857611a88612d61565b021790555060208201516001820190611aa190826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611b3f85826122e4565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611bda57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061394e83398151915242611bf960608601604087016135fe565b6001600160401b0316111580611c335750611c176202a300426132b2565b611c2760608601604087016135fe565b6001600160401b031610155b15611c6d57611c4860608501604086016135fe565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b611c82611c7d6060860186613617565b61243b565b611c92611c7d6080860186613617565b6030611ca1602086018661362b565b905014611cd357611cb5602085018561362b565b6040516326475b2f60e11b8152610499925060040190815260200190565b611cdd848061362b565b90505f03611d0a57611cef848061362b565b604051633e08a12560e11b815260040161049992919061366d565b5f60088201611d19868061362b565b604051611d27929190613482565b90815260200160405180910390205414611d6057611d45848061362b565b60405163a41f772f60e01b815260040161049992919061366d565b611d6a835f6125a4565b6040805160e08101909152815481525f908190611e769060208101611d8f898061362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611dd7908a018a61362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611e2060608a0160408b016135fe565b6001600160401b03168152602001611e3b60608a018a613617565b611e449061369b565b8152602001611e5660808a018a613617565b611e5f9061369b565b8152602001876001600160401b03168152506127c7565b5f82815260068601602052604090209193509150611e9482826131df565b508160088401611ea4888061362b565b604051611eb2929190613482565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611eee908590600401612f35565b6020604051808303815f875af1158015611f0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2e9190612f47565b6040805160e081019091529091508060018152602001611f4e898061362b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff19166001836005811115611fdd57611fdd612d61565b021790555060208201516001820190611ff690826131df565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580612094888061362b565b6040516120a2929190613482565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906120e091906135fe565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80825160271461214457825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b60028110156121935761215b816001613572565b6121669060086132e7565b61ffff1685828151811061217c5761217c612fa3565b016020015160f81c901b9190911790600101612147565b5061ffff8116156121bd5760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b6004811015612218576121d4816003613572565b6121df9060086132e7565b63ffffffff16866121f18360026132b2565b8151811061220157612201612fa3565b016020015160f81c901b91909117906001016121c0565b5063ffffffff811660021461224057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122955761225781601f613572565b6122629060086132e7565b8761226e8360066132b2565b8151811061227e5761227e612fa3565b016020015160f81c901b9190911790600101612243565b505f866026815181106122aa576122aa612fa3565b016020015191976001600160f81b03199092161515965090945050505050565b6122d26129b4565b6122db826129fd565b610aa181612a16565b5f8281525f8051602061396e833981519152602052604081206002015481905f8051602061394e83398151915290600160801b90046001600160401b031661232c85826125a4565b5f61233687612a27565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123868a858b61107c565b6040518263ffffffff1660e01b81526004016123a29190612f35565b6020604051808303815f875af11580156123be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e29190612f47565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6124486020820182612c9d565b63ffffffff1615801561246857506124636020820182612f5e565b151590505b156124af5761247a6020820182612c9d565b6124876020830183612f5e565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610499565b6124bc6020820182612f5e565b90506124cb6020830183612c9d565b63ffffffff1611156124e45761247a6020820182612c9d565b60015b6124f46020830183612f5e565b9050811015610aa15761250a6020830183612f5e565b612515600184613572565b81811061252457612524612fa3565b90506020020160208101906125399190612e62565b6001600160a01b031661254f6020840184612f5e565b8381811061255f5761255f612fa3565b90506020020160208101906125749190612e62565b6001600160a01b0316101561259c57604051630dbc8d5f60e31b815260040160405180910390fd5b6001016124e7565b5f8051602061394e8339815191525f6001600160401b0380841690851611156125d8576125d1838561374b565b90506125e5565b6125e2848461374b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580612647575060018401548151612643916001600160401b0316906132b2565b8210155b1561266d576001600160401b03831660608201528181526040810151602082015261268c565b828160600181815161267f919061376b565b6001600160401b03169052505b606081015161269c90606461378b565b602082015160018601546001600160401b0392909216916126c79190600160401b900460ff166132e7565b10156126f757606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b03168160400181815161271291906132b2565b9052506040810180516001600160401b0387169190612732908390613572565b9052506001840154604082015160649161275791600160401b90910460ff16906132e7565b101561277e578060400151604051635943317f60e01b815260040161049991815260200190565b805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146127f05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98612831988a9860019892979296909590949093909291016137b6565b60405160208183030381529060405290505f5b846080015160200151518110156128a35781856080015160200151828151811061287057612870612fa3565b6020026020010151604051602001612889929190613870565b60408051601f198184030181529190529150600101612844565b5060a08401518051602091820151516040516128c39385939291016138a6565b60405160208183030381529060405290505f5b8460a00151602001515181101561293557818560a0015160200151828151811061290257612902612fa3565b602002602001015160405160200161291b929190613870565b60408051601f1981840301815291905291506001016128d6565b5060c084015160405161294c9183916020016138e1565b604051602081830303815290604052905060028160405161296d9190613183565b602060405180830381855afa158015612988573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129ab9190612f47565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a8e57604051631afcd79f60e31b815260040160405180910390fd5b612a056129b4565b612a0d612a9c565b61101e81612aa4565b612a1e6129b4565b61101e81612b8c565b5f8181525f8051602061396e8339815191526020526040812060020180545f8051602061394e8339815191529190600890612a7190600160401b90046001600160401b0316613912565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a8e6129b4565b612aac6129b4565b80355f8051602061394e8339815191529081556014612ad1606084016040850161392d565b60ff161180612af05750612aeb606083016040840161392d565b60ff16155b15612b2457612b05606083016040840161392d565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612b34606083016040840161392d565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612b6560408301602084016135fe565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fec6129b4565b508054612ba090612eef565b5f825580601f10612baf575050565b601f0160209004905f5260205f209081019061101e9190612c08565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612c1c575f8155600101612c09565b5090565b5f60208284031215612c30575f80fd5b5035919050565b803563ffffffff81168114612c4a575f80fd5b919050565b5f8060408385031215612c60575f80fd5b82356001600160401b03811115612c75575f80fd5b830160808186031215612c86575f80fd5b9150612c9460208401612c37565b90509250929050565b5f60208284031215612cad575f80fd5b610ab882612c37565b80356001600160401b0381168114612c4a575f80fd5b5f8060408385031215612cdd575f80fd5b82356001600160401b03811115612cf2575f80fd5b830160a08186031215612d03575f80fd5b9150612c9460208401612cb6565b6001600160a01b038116811461101e575f80fd5b5f808284036080811215612d37575f80fd5b6060811215612d44575f80fd5b508291506060830135612d5681612d11565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612d9157634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612daf578181015183820152602001612d97565b50505f910152565b5f8151808452612dce816020860160208601612d95565b601f01601f19169290920160200192915050565b60208152612df4602082018351612d75565b5f602083015160e06040840152612e0f610100840182612db7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612e72575f80fd5b8135612e7d81612d11565b9392505050565b5f8060208385031215612e95575f80fd5b82356001600160401b0380821115612eab575f80fd5b818501915085601f830112612ebe575f80fd5b813581811115612ecc575f80fd5b866020828501011115612edd575f80fd5b60209290920196919550909350505050565b600181811c90821680612f0357607f821691505b602082108103612f2157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610abb8284612d75565b602081525f610ab86020830184612db7565b5f60208284031215612f57575f80fd5b5051919050565b5f808335601e19843603018112612f73575f80fd5b8301803591506001600160401b03821115612f8c575f80fd5b6020019150600581901b3603821315612434575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612fcb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561300b5761300b612fd5565b60405290565b604051608081016001600160401b038111828210171561300b5761300b612fd5565b604080519081016001600160401b038111828210171561300b5761300b612fd5565b604051601f8201601f191681016001600160401b038111828210171561307d5761307d612fd5565b604052919050565b5f6001600160401b0382111561309d5761309d612fd5565b50601f01601f191660200190565b5f82601f8301126130ba575f80fd5b81356130cd6130c882613085565b613055565b8181528460208386010111156130e1575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060828403121561310d575f80fd5b613115612fe9565b905081356001600160401b038082111561312d575f80fd5b613139858386016130ab565b8352602084013591508082111561314e575f80fd5b5061315b848285016130ab565b60208301525061316d60408301612cb6565b604082015292915050565b5f610abb36836130fd565b5f8251612fcb818460208701612d95565b601f821115610a6457805f5260205f20601f840160051c810160208510156131b95750805b601f840160051c820191505b818110156131d8575f81556001016131c5565b5050505050565b81516001600160401b038111156131f8576131f8612fd5565b61320c816132068454612eef565b84613194565b602080601f83116001811461323f575f84156132285750858301515b5f19600386901b1c1916600185901b178555613296565b5f85815260208120601f198616915b8281101561326d5788860151825594840194600190910190840161324e565b508582101561328a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610abb57610abb61329e565b5f63ffffffff8083168181036132dd576132dd61329e565b6001019392505050565b8082028115828204841417610abb57610abb61329e565b5f6001600160401b0382111561331657613316612fd5565b5060051b60200190565b5f60808236031215613330575f80fd5b613338613011565b8235815260208084013581830152604084013561335481612d11565b604083015260608401356001600160401b0380821115613372575f80fd5b9085019036601f830112613384575f80fd5b81356133926130c8826132fe565b81815260059190911b830184019084810190368311156133b0575f80fd5b8585015b838110156133e6578035858111156133ca575f80fd5b6133d83689838a01016130fd565b8452509186019186016133b4565b50606087015250939695505050505050565b5f60208083525f845461340a81612eef565b806020870152604060018084165f811461342b576001811461344757613474565b60ff19851660408a0152604084151560051b8a01019550613474565b895f5260205f205f5b8581101561346b5781548b8201860152908301908801613450565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612c4a575f80fd5b5f80604083850312156134b1575f80fd5b82516001600160401b03808211156134c7575f80fd5b90840190606082870312156134da575f80fd5b6134e2612fe9565b825181526020808401516134f581612d11565b8282015260408401518381111561350a575f80fd5b80850194505087601f85011261351e575f80fd5b8351925061352e6130c884613085565b8381528882858701011115613541575f80fd5b61355084838301848801612d95565b80604084015250819550613565818801613491565b9450505050509250929050565b81810381811115610abb57610abb61329e565b5f8651613596818460208b01612d95565b60e087901b6001600160e01b03191690830190815285516135be816004840160208a01612d95565b85519101906135d4816004840160208901612d95565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b5f6020828403121561360e575f80fd5b610ab882612cb6565b5f8235603e19833603018112612fcb575f80fd5b5f808335601e19843603018112613640575f80fd5b8301803591506001600160401b03821115613659575f80fd5b602001915036819003821315612434575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156136ab575f80fd5b6136b3613033565b6136bc83612c37565b81526020808401356001600160401b038111156136d7575f80fd5b840136601f8201126136e7575f80fd5b80356136f56130c8826132fe565b81815260059190911b82018301908381019036831115613713575f80fd5b928401925b8284101561373a57833561372b81612d11565b82529284019290840190613718565b938501939093525091949350505050565b6001600160401b038281168282160390808211156111da576111da61329e565b6001600160401b038181168382160190808211156111da576111da61329e565b6001600160401b038181168382160280821691908281146137ae576137ae61329e565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516137fc81602a850160208b01612d95565b86519083019061381381602a840160208b01612d95565b60c087901b6001600160c01b031916602a9290910191820152613845603282018660e01b6001600160e01b0319169052565b61385e603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351613881818460208801612d95565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516138b7818460208901612d95565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516138f2818460208801612d95565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b038083168181036132dd576132dd61329e565b5f6020828403121561393d575f80fd5b813560ff81168114612e7d575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index ca836eb5a..4c13db388 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -148,7 +148,7 @@ library ValidatorMessages { * @param subnetConversionData The struct representing data to pack into the message. * @return The packed message. */ - function packSubnetConversionData(SubnetConversionData calldata subnetConversionData) + function packSubnetConversionData(SubnetConversionData memory subnetConversionData) internal pure returns (bytes memory) From 2b205111c53bd23321b48b5e7396bc6a3d33f886 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 24 Oct 2024 18:00:27 -0400 Subject: [PATCH 06/10] Fix test --- contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index a173e1ed1..fe7048e43 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -1361,6 +1361,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorWeight: DEFAULT_WEIGHT }); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP + 1 + DEFAULT_MINIMUM_STAKE_DURATION); _expectStakeUnlock(DEFAULT_DELEGATOR_ADDRESS, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); posValidatorManager.initializeEndDelegation(delegationID, true, 0); } From 9b2b1394f57caddd8fad50e9d39f12ead0912630 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 20 Nov 2024 07:37:54 -0500 Subject: [PATCH 07/10] Tests running --- .../tests/PoSValidatorManagerTests.t.sol | 61 +++++++++-------- .../tests/ValidatorMessagesTests.t.sol | 66 +++++++++---------- 2 files changed, 67 insertions(+), 60 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 967ef3b2e..65bfaf345 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -665,9 +665,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _initializeEndValidation({ validationID: validationID, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: setWeightMessage, - expectedNonce: 1, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + setWeightMessage: setWeightMessage, includeUptime: true, uptimeMessage: uptimeMessage, force: false @@ -733,9 +732,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _initializeEndValidation({ validationID: validationID, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: setWeightMessage, - expectedNonce: 1, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + setWeightMessage: setWeightMessage, includeUptime: true, uptimeMessage: uptimeMessage, force: false @@ -1142,7 +1140,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); // Submit an uptime proof via submitUptime @@ -1207,12 +1205,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testSubmitUptimeProofInactiveValidator() public { bytes32 validationID = _registerDefaultValidator(); + bytes memory setWeightMessage = + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); + bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( + validationID, 1 + ); + _initializeEndValidation({ validationID: validationID, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - expectedNonce: 1, + setWeightMessage: setWeightMessage, includeUptime: true, + uptimeMessage: uptimeMessage, force: false }); @@ -1244,7 +1248,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 balanceBefore = _getStakeAssetBalance(address(this)); bytes memory subnetValidatorRegistrationMessage = - ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + ValidatorMessages.packL1ValidatorRegistrationMessage(validationID, false); _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); posValidatorManager.completeEndValidation(0); @@ -1294,14 +1298,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) ); - posValidatorManager.completeDelegatorRegistration(0, delegationID); + posValidatorManager.completeDelegatorRegistration(delegationID, 0); } function testCompleteDelegatorRegistrationWrongValidationID() public { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); - bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( + bytes memory setValidatorWeightPayload = ValidatorMessages.packL1ValidatorWeightMessage( delegationID, 2, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); @@ -1311,7 +1315,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); - posValidatorManager.completeDelegatorRegistration(0, delegationID); + posValidatorManager.completeDelegatorRegistration(delegationID, 0); } function testCompleteEndDelegationWrongValidationID() public { @@ -1331,14 +1335,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSubnetValidatorWeightMessage(delegationID, 2, DEFAULT_WEIGHT); + ValidatorMessages.packL1ValidatorWeightMessage(delegationID, 2, DEFAULT_WEIGHT); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.expectRevert( abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, delegationID) ); - posValidatorManager.completeEndDelegation(0, delegationID); + posValidatorManager.completeEndDelegation(delegationID, 0); } function testInitializeEndDelegationNotRegistered() public { @@ -1372,12 +1376,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + bytes memory setWeightMessage = + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); + bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + ); _initializeEndValidation({ validationID: validationID, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - expectedNonce: 2, + setWeightMessage: setWeightMessage, includeUptime: true, + uptimeMessage: uptimeMessage, force: false }); @@ -1415,19 +1424,24 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) ); - posValidatorManager.completeEndDelegation(0, delegationID); + posValidatorManager.completeEndDelegation(delegationID, 0); } function testCompleteDelegatorRegistrationValidatorPendingRemoved() public { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + bytes memory setWeightMessage = + ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); + bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP + ); _initializeEndValidation({ validationID: validationID, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - expectedNonce: 2, + setWeightMessage: setWeightMessage, includeUptime: true, + uptimeMessage: uptimeMessage, force: false }); @@ -1881,8 +1895,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); _expectRewardIssuance(validatorOwner, expectedReward); - bytes memory subnetValidatorRegistrationMessage = - ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); _completeEndValidation(subnetValidatorRegistrationMessage); assertEq( @@ -1895,11 +1907,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); posValidatorManager.completeEndValidation(0); - - assertEq( - _getStakeAssetBalance(validatorOwner), - balanceBefore + _weightToValue(validatorWeight) + expectedReward - ); } function _completeEndDelegationWithChecks( diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index c7e7d16fa..729053e82 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -9,7 +9,7 @@ import {Test} from "@forge-std/Test.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; import { PChainOwner, - SubnetConversionData, + ConversionData, InitialValidator } from "../interfaces/IValidatorManager.sol"; @@ -39,7 +39,7 @@ contract ValidatorMessagesTest is Test { function testSubnetConversionMessageInvalidInputLength() public { bytes memory packed = - ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); // Invalid length bytes memory invalidPacked = new bytes(packed.length - 1); for (uint256 i = 0; i < packed.length - 1; i++) { @@ -48,12 +48,12 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 37, 38) ); - ValidatorMessages.unpackSubnetConversionMessage(invalidPacked); + ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked); } function testSubnetConversionMessageInvalidCodecID() public { bytes memory packed = - ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); // Invalid codec ID bytes memory invalidPacked2 = packed; @@ -61,17 +61,17 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) ); - ValidatorMessages.unpackSubnetConversionMessage(invalidPacked2); + ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked2); } function testSubnetConversionMessageInvalidTypeID() public { bytes memory packed = - ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); // Invalid message type bytes memory invalidPacked3 = packed; invalidPacked3[5] = 0x01; vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); - ValidatorMessages.unpackSubnetConversionMessage(invalidPacked3); + ValidatorMessages.unpackSubnetToL1ConversionMessage(invalidPacked3); } function testRegisterSubnetValidatorMessageInvalidBLSKey() public { @@ -80,7 +80,7 @@ contract ValidatorMessagesTest is Test { bytes memory invalidBLSKey = bytes( hex"3456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); - ValidatorMessages.packRegisterSubnetValidatorMessage( + ValidatorMessages.packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, @@ -94,7 +94,7 @@ contract ValidatorMessagesTest is Test { } function testRegisterSubnetValidatorMessageInvalidInputLength() public { - (, bytes memory packed) = ValidatorMessages.packRegisterSubnetValidatorMessage( + (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, @@ -115,7 +115,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.InvalidMessageLength.selector, uint32(193), uint32(194) ) ); - ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked); // Invalid codec ID bytes memory invalidPacked2 = packed; @@ -123,17 +123,17 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) ); - ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked2); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked2); // Invalid message type bytes memory invalidPacked3 = packed; invalidPacked3[5] = 0x00; vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); - ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked3); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked3); } function testRegisterSubnetValidatorMessageInvalidCodecID() public { - (, bytes memory packed) = ValidatorMessages.packRegisterSubnetValidatorMessage( + (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, @@ -151,11 +151,11 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) ); - ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked2); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked2); } function testRegisterSubnetValidatorMessageInvalidTypeID() public { - (, bytes memory packed) = ValidatorMessages.packRegisterSubnetValidatorMessage( + (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, @@ -171,12 +171,12 @@ contract ValidatorMessagesTest is Test { bytes memory invalidPacked3 = packed; invalidPacked3[5] = 0x00; vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); - ValidatorMessages.unpackRegisterSubnetValidatorMessage(invalidPacked3); + ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked3); } function testSubnetValidatorRegistrationMessageInvalidInputLength() public { bytes memory packed = - ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); // Invalid length bytes memory invalidPacked = new bytes(packed.length - 1); @@ -186,12 +186,12 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 38, 39) ); - ValidatorMessages.unpackSubnetValidatorRegistrationMessage(invalidPacked); + ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked); } function testSubnetValidatorRegistrationMessageInvalidCodecID() public { bytes memory packed = - ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); // Invalid codec ID bytes memory invalidPacked2 = packed; @@ -199,18 +199,18 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) ); - ValidatorMessages.unpackSubnetValidatorRegistrationMessage(invalidPacked2); + ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked2); } function testSubnetValidatorRegistrationMessageInvalidTypeID() public { bytes memory packed = - ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + ValidatorMessages.packL1ValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); // Invalid message type bytes memory invalidPacked3 = packed; invalidPacked3[5] = 0x01; vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); - ValidatorMessages.unpackSubnetValidatorRegistrationMessage(invalidPacked3); + ValidatorMessages.unpackL1ValidatorRegistrationMessage(invalidPacked3); } function testValidationUptimeMessageInvalidInputLength() public { @@ -253,7 +253,7 @@ contract ValidatorMessagesTest is Test { } function testSetSubnetValidatorWeightMessageInvalidInputLength() public { - bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( + bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -265,11 +265,11 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidMessageLength.selector, 53, 54) ); - ValidatorMessages.unpackSubnetValidatorWeightMessage(invalidPacked); + ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked); } function testSetSubnetValidatorWeightMessageInvalidCodecID() public { - bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( + bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -279,11 +279,11 @@ contract ValidatorMessagesTest is Test { vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) ); - ValidatorMessages.unpackSubnetValidatorWeightMessage(invalidPacked2); + ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked2); } function testSetSubnetValidatorWeightMessageInvalidTypeID() public { - bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( + bytes memory packed = ValidatorMessages.packL1ValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); @@ -291,7 +291,7 @@ contract ValidatorMessagesTest is Test { bytes memory invalidPacked3 = packed; invalidPacked3[5] = 0x01; vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); - ValidatorMessages.unpackSubnetValidatorWeightMessage(invalidPacked3); + ValidatorMessages.unpackL1ValidatorWeightMessage(invalidPacked3); } function testRegisterSubnetValidatorMessage() public view { @@ -322,20 +322,20 @@ contract ValidatorMessagesTest is Test { function testSubnetConversionMessage() public pure { bytes memory packed = - ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); - bytes32 conversionID = ValidatorMessages.unpackSubnetConversionMessage(packed); + ValidatorMessages.packSubnetToL1ConversionMessage(DEFAULT_SUBNET_CONVERSION_ID); + bytes32 conversionID = ValidatorMessages.unpackSubnetToL1ConversionMessage(packed); assertEq(conversionID, DEFAULT_SUBNET_CONVERSION_ID); } - function testPackSubnetConversionData() public pure { + function testPackL1ConversionData() public pure { InitialValidator[] memory initialValidators = new InitialValidator[](1); initialValidators[0] = InitialValidator({ nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - bytes memory packed = ValidatorMessages.packSubnetConversionData( - SubnetConversionData({ + bytes memory packed = ValidatorMessages.packConversionData( + ConversionData({ subnetID: DEFAULT_SUBNET_ID, validatorManagerBlockchainID: DEFAULT_SUBNET_CONVERSION_ID, validatorManagerAddress: DEFAULT_OWNER, From a386d02100bda9ce18f89866c7e29fd9afdc9004 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 20 Nov 2024 08:22:30 -0500 Subject: [PATCH 08/10] Fix tests --- .../tests/PoSValidatorManagerTests.t.sol | 43 ++++++++----------- .../tests/ValidatorMessagesTests.t.sol | 37 ++++++++-------- 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 65bfaf345..6bb6ddb37 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -697,15 +697,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 1 }); - uint64 validatorEndTime = DEFAULT_REGISTRATION_TIMESTAMP; bytes memory setWeightMessage = ValidatorMessages.packL1ValidatorWeightMessage(validationID, 2, 0); bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( - validationID, validatorEndTime - DEFAULT_REGISTRATION_TIMESTAMP + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP ); _initializeEndValidation({ validationID: validationID, - completionTimestamp: validatorEndTime, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, setWeightMessage: setWeightMessage, includeUptime: true, uptimeMessage: uptimeMessage, @@ -715,7 +714,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpCompleteDelegatorRegistrationWithChecks( validationID, delegationID, - validatorEndTime + 1, + DEFAULT_COMPLETION_TIMESTAMP + 1, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); @@ -1208,7 +1207,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setWeightMessage = ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( - validationID, 1 + validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP ); _initializeEndValidation({ @@ -1376,19 +1375,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); - bytes memory setWeightMessage = - ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); + // bytes memory setWeightMessage = + // ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP ); - _initializeEndValidation({ - validationID: validationID, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - setWeightMessage: setWeightMessage, - includeUptime: true, - uptimeMessage: uptimeMessage, - force: false - }); + + _mockGetUptimeWarpMessage(uptimeMessage, true); + _mockGetBlockchainID(); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + _initializeEndValidation(validationID, true); _setUpCompleteDelegatorRegistrationWithChecks( validationID, delegationID, DEFAULT_COMPLETION_TIMESTAMP + 1, 0, 2 @@ -1431,19 +1427,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); - bytes memory setWeightMessage = - ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); + // bytes memory setWeightMessage = + // ValidatorMessages.packL1ValidatorWeightMessage(validationID, 1, 0); bytes memory uptimeMessage = ValidatorMessages.packValidationUptimeMessage( validationID, DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP ); - _initializeEndValidation({ - validationID: validationID, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - setWeightMessage: setWeightMessage, - includeUptime: true, - uptimeMessage: uptimeMessage, - force: false - }); + + _mockGetUptimeWarpMessage(uptimeMessage, true); + _mockGetBlockchainID(); + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + _initializeEndValidation(validationID, true); _setUpCompleteDelegatorRegistrationWithChecks( validationID, delegationID, DEFAULT_COMPLETION_TIMESTAMP + 1, 0, 2 diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index 729053e82..99c8ca38d 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -7,11 +7,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import { - PChainOwner, - ConversionData, - InitialValidator -} from "../interfaces/IValidatorManager.sol"; +import {PChainOwner, ConversionData, InitialValidator} from "../interfaces/IValidatorManager.sol"; contract ValidatorMessagesTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = @@ -94,17 +90,7 @@ contract ValidatorMessagesTest is Test { } function testRegisterSubnetValidatorMessageInvalidInputLength() public { - (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( - ValidatorMessages.ValidationPeriod({ - subnetID: DEFAULT_SUBNET_ID, - nodeID: DEFAULT_NODE_ID, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER, - weight: DEFAULT_WEIGHT - }) - ); + bytes memory packed = _getPackedRegisterL1ValidatorMessage(); // Invalid length bytes memory invalidPacked = new bytes(packed.length - 1); for (uint256 i = 0; i < packed.length - 1; i++) { @@ -118,7 +104,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked); // Invalid codec ID - bytes memory invalidPacked2 = packed; + bytes memory invalidPacked2 = _getPackedRegisterL1ValidatorMessage(); invalidPacked2[1] = 0x01; vm.expectRevert( abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) @@ -126,7 +112,7 @@ contract ValidatorMessagesTest is Test { ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked2); // Invalid message type - bytes memory invalidPacked3 = packed; + bytes memory invalidPacked3 = _getPackedRegisterL1ValidatorMessage(); invalidPacked3[5] = 0x00; vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked3); @@ -384,4 +370,19 @@ contract ValidatorMessagesTest is Test { assertEq(validationID, DEFAULT_VALIDATION_ID); assertEq(uptime, 100); } + + function _getPackedRegisterL1ValidatorMessage() internal returns (bytes memory) { + (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( + ValidatorMessages.ValidationPeriod({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT + }) + ); + return packed; + } } From 408c68c97f09beca838d64e056e898a7b3b4dc86 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 21 Nov 2024 10:47:35 -0500 Subject: [PATCH 09/10] Review fixes --- .../tests/ERC20TokenStakingManagerTests.t.sol | 14 ++++++-- .../NativeTokenStakingManagerTests.t.sol | 12 +++++-- .../tests/PoSValidatorManagerTests.t.sol | 34 ++++++++++--------- .../tests/ValidatorMessagesTests.t.sol | 1 + 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index fca08de92..013398a6c 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -7,7 +7,7 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; -import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import {PoSValidatorManager, PoSValidatorManagerSettings} from "../PoSValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ValidatorRegistrationInput, IValidatorManager} from "../interfaces/IValidatorManager.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; @@ -36,7 +36,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testDisableInitialization() public { app = new ERC20TokenStakingManager(ICMInitializable.Disallowed); vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); - app.initialize(defaultPoSSettings, token); + app.initialize(_defaultPoSSettings(), token); } function testZeroTokenAddress() public { @@ -46,7 +46,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ERC20TokenStakingManager.InvalidTokenAddress.selector, address(0) ) ); - app.initialize(defaultPoSSettings, IERC20Mintable(address(0))); + app.initialize(_defaultPoSSettings(), IERC20Mintable(address(0))); } function testZeroMinimumDelegationFee() public { @@ -55,6 +55,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumDelegationFeeBips = 0; app.initialize(defaultPoSSettings, token); } @@ -68,6 +69,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumDelegationFeeBips = minimumDelegationFeeBips; app.initialize(defaultPoSSettings, token); } @@ -80,6 +82,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumStakeAmount = DEFAULT_MAXIMUM_STAKE_AMOUNT; defaultPoSSettings.maximumStakeAmount = DEFAULT_MINIMUM_STAKE_AMOUNT; app.initialize(defaultPoSSettings, token); @@ -91,6 +94,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.maximumStakeMultiplier = 0; app.initialize(defaultPoSSettings, token); } @@ -104,6 +108,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumStakeDuration = minimumStakeDuration; app.initialize(defaultPoSSettings, token); } @@ -117,6 +122,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.maximumStakeMultiplier = maximumStakeMultiplier; app.initialize(defaultPoSSettings, token); } @@ -127,6 +133,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.weightToValueFactor = 0; app.initialize(defaultPoSSettings, token); } @@ -217,6 +224,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { token = new ExampleERC20(); rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.rewardCalculator = rewardCalculator; app.initialize(defaultPoSSettings, token); diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index a41c0dc0c..c1c80fcbb 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -8,7 +8,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; -import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import {PoSValidatorManager, PoSValidatorManagerSettings} from "../PoSValidatorManager.sol"; import {ValidatorRegistrationInput, IValidatorManager} from "../interfaces/IValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; @@ -33,7 +33,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app = new NativeTokenStakingManager(ICMInitializable.Disallowed); vm.expectRevert(abi.encodeWithSelector(Initializable.InvalidInitialization.selector)); - app.initialize(defaultPoSSettings); + app.initialize(_defaultPoSSettings()); } function testZeroMinimumDelegationFee() public { @@ -42,6 +42,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumDelegationFeeBips = 0; app.initialize(defaultPoSSettings); } @@ -55,6 +56,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumDelegationFeeBips = minimumDelegationFeeBips; app.initialize(defaultPoSSettings); } @@ -67,6 +69,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumStakeAmount = DEFAULT_MAXIMUM_STAKE_AMOUNT; defaultPoSSettings.maximumStakeAmount = DEFAULT_MINIMUM_STAKE_AMOUNT; app.initialize(defaultPoSSettings); @@ -78,6 +81,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.maximumStakeMultiplier = 0; app.initialize(defaultPoSSettings); } @@ -91,6 +95,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.maximumStakeMultiplier = maximumStakeMultiplier; app.initialize(defaultPoSSettings); } @@ -101,6 +106,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { abi.encodeWithSelector(PoSValidatorManager.ZeroWeightToValueFactor.selector) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.weightToValueFactor = 0; app.initialize(defaultPoSSettings); } @@ -114,6 +120,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ) ); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.minimumStakeDuration = minStakeDuration; app.initialize(defaultPoSSettings); } @@ -173,6 +180,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app = new TestableNativeTokenStakingManager(ICMInitializable.Allowed); rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); + PoSValidatorManagerSettings memory defaultPoSSettings = _defaultPoSSettings(); defaultPoSSettings.rewardCalculator = rewardCalculator; app.initialize(defaultPoSSettings); diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 5c54fe99c..8ca198cc9 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -47,22 +47,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; IRewardCalculator public rewardCalculator; - PoSValidatorManagerSettings public defaultPoSSettings = PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - subnetID: DEFAULT_SUBNET_ID, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, - rewardCalculator: IRewardCalculator(address(0)), - uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID - }); - ValidatorRegistrationInput public defaultRegistrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, @@ -1982,4 +1966,22 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP }); } + + function _defaultPoSSettings() internal pure returns (PoSValidatorManagerSettings memory) { + return PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + weightToValueFactor: DEFAULT_WEIGHT_TO_VALUE_FACTOR, + rewardCalculator: IRewardCalculator(address(0)), + uptimeBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID + }); + } } diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index 99c8ca38d..08a9b3203 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -328,6 +328,7 @@ contract ValidatorMessagesTest is Test { initialValidators: initialValidators }) ); + assertEq(packed.length, 186); } From 46c8b20b5f5269c00870e9d5dd54c30343ca2e96 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 22 Nov 2024 04:01:04 -0500 Subject: [PATCH 10/10] Fix tests --- .../tests/ValidatorMessagesTests.t.sol | 38 +------------------ 1 file changed, 2 insertions(+), 36 deletions(-) diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index 08a9b3203..6f7ffc4b2 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -102,34 +102,10 @@ contract ValidatorMessagesTest is Test { ) ); ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked); - - // Invalid codec ID - bytes memory invalidPacked2 = _getPackedRegisterL1ValidatorMessage(); - invalidPacked2[1] = 0x01; - vm.expectRevert( - abi.encodeWithSelector(ValidatorMessages.InvalidCodecID.selector, uint32(1)) - ); - ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked2); - - // Invalid message type - bytes memory invalidPacked3 = _getPackedRegisterL1ValidatorMessage(); - invalidPacked3[5] = 0x00; - vm.expectRevert(ValidatorMessages.InvalidMessageType.selector); - ValidatorMessages.unpackRegisterL1ValidatorMessage(invalidPacked3); } function testRegisterSubnetValidatorMessageInvalidCodecID() public { - (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( - ValidatorMessages.ValidationPeriod({ - subnetID: DEFAULT_SUBNET_ID, - nodeID: DEFAULT_NODE_ID, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER, - weight: DEFAULT_WEIGHT - }) - ); + bytes memory packed = _getPackedRegisterL1ValidatorMessage(); // Invalid codec ID bytes memory invalidPacked2 = packed; @@ -141,17 +117,7 @@ contract ValidatorMessagesTest is Test { } function testRegisterSubnetValidatorMessageInvalidTypeID() public { - (, bytes memory packed) = ValidatorMessages.packRegisterL1ValidatorMessage( - ValidatorMessages.ValidationPeriod({ - subnetID: DEFAULT_SUBNET_ID, - nodeID: DEFAULT_NODE_ID, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, - disableOwner: DEFAULT_P_CHAIN_OWNER, - weight: DEFAULT_WEIGHT - }) - ); + bytes memory packed = _getPackedRegisterL1ValidatorMessage(); // Invalid message type bytes memory invalidPacked3 = packed;