From c6c290d855ebb0ee4fc9219d80b7bd906c47967f Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 13:33:01 +0000 Subject: [PATCH 01/36] `IERC20Mintable`, not `IERC20` --- .../go/mocks/ExampleERC20/ExampleERC20.go | 43 ++++++++++++++----- .../ERC20TokenStakingManager.go | 2 +- contracts/mocks/ExampleERC20.sol | 7 ++- .../staking/ERC20TokenStakingManager.sol | 17 +++++--- .../staking/interfaces/IERC20Mintable.sol | 12 ++++++ .../tests/ERC20TokenStakingManagerTests.t.sol | 5 ++- 6 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 contracts/staking/interfaces/IERC20Mintable.sol diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index bc7f00d16..fe803b2d1 100644 --- a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go +++ b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go @@ -31,8 +31,8 @@ var ( // ExampleERC20MetaData contains all meta data concerning the ExampleERC20 contract. var ExampleERC20MetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC20InsufficientAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InsufficientBalance\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSpender\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108328061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c806370a082311161006e57806370a082311461013f57806379cc67901461016757806395d89b411461017a578063a0712d6814610182578063a9059cbb14610195578063dd62ed3e146101a8575f80fd5b806306fdde03146100b5578063095ea7b3146100d357806318160ddd146100f657806323b872dd14610108578063313ce5671461011b57806342966c681461012a575b5f80fd5b6100bd6101e0565b6040516100ca919061069e565b60405180910390f35b6100e66100e1366004610705565b610270565b60405190151581526020016100ca565b6002545b6040519081526020016100ca565b6100e661011636600461072d565b610289565b604051601281526020016100ca565b61013d610138366004610766565b6102ac565b005b6100fa61014d36600461077d565b6001600160a01b03165f9081526020819052604090205490565b61013d610175366004610705565b6102b9565b6100bd6102d2565b61013d610190366004610766565b6102e1565b6100e66101a3366004610705565b610347565b6100fa6101b636600461079d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101ef906107ce565b80601f016020809104026020016040519081016040528092919081815260200182805461021b906107ce565b80156102665780601f1061023d57610100808354040283529160200191610266565b820191905f5260205f20905b81548152906001019060200180831161024957829003601f168201915b5050505050905090565b5f3361027d818585610354565b60019150505b92915050565b5f33610296858285610366565b6102a18585856103e1565b506001949350505050565b6102b6338261043e565b50565b6102c4823383610366565b6102ce828261043e565b5050565b6060600480546101ef906107ce565b662386f26fc1000081111561033d5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b6102b63382610472565b5f3361027d8185856103e1565b61036183838360016104a6565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146103db57818110156103cd57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610334565b6103db84848484035f6104a6565b50505050565b6001600160a01b03831661040a57604051634b637e8f60e11b81525f6004820152602401610334565b6001600160a01b0382166104335760405163ec442f0560e01b81525f6004820152602401610334565b610361838383610578565b6001600160a01b03821661046757604051634b637e8f60e11b81525f6004820152602401610334565b6102ce825f83610578565b6001600160a01b03821661049b5760405163ec442f0560e01b81525f6004820152602401610334565b6102ce5f8383610578565b6001600160a01b0384166104cf5760405163e602df0560e01b81525f6004820152602401610334565b6001600160a01b0383166104f857604051634a1406b160e11b81525f6004820152602401610334565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156103db57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056a91815260200190565b60405180910390a350505050565b6001600160a01b0383166105a2578060025f8282546105979190610806565b909155506106129050565b6001600160a01b0383165f90815260208190526040902054818110156105f45760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610334565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661062e5760028054829003905561064c565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161069191815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156106ca578581018301518582016040015282016106ae565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610700575f80fd5b919050565b5f8060408385031215610716575f80fd5b61071f836106ea565b946020939093013593505050565b5f805f6060848603121561073f575f80fd5b610748846106ea565b9250610756602085016106ea565b9150604084013590509250925092565b5f60208284031215610776575f80fd5b5035919050565b5f6020828403121561078d575f80fd5b610796826106ea565b9392505050565b5f80604083850312156107ae575f80fd5b6107b7836106ea565b91506107c5602084016106ea565b90509250929050565b600181811c908216806107e257607f821691505b60208210810361080057634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561028357634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC20InsufficientAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InsufficientBalance\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSpender\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108698061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e491906106d5565b60405180910390f35b6101006100fb36600461073c565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610764565b6102b6565b604051601281526020016100e4565b61015761015236600461073c565b6102d9565b005b61015761016736600461079d565b6102e7565b61011461017a3660046107b4565b6001600160a01b03165f9081526020819052604090205490565b6101576101a236600461073c565b6102f4565b6100d7610309565b6101576101bd36600461079d565b610318565b6101006101d036600461073c565b61037e565b6101146101e33660046107d4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c90610805565b80601f016020809104026020016040519081016040528092919081815260200182805461024890610805565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa81858561038b565b60019150505b92915050565b5f336102c385828561039d565b6102ce858585610418565b506001949350505050565b6102e38282610475565b5050565b6102f133826104a9565b50565b6102ff82338361039d565b6102e382826104a9565b60606004805461021c90610805565b662386f26fc100008111156103745760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b6102f13382610475565b5f336102aa818585610418565b61039883838360016104dd565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610412578181101561040457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161036b565b61041284848484035f6104dd565b50505050565b6001600160a01b03831661044157604051634b637e8f60e11b81525f600482015260240161036b565b6001600160a01b03821661046a5760405163ec442f0560e01b81525f600482015260240161036b565b6103988383836105af565b6001600160a01b03821661049e5760405163ec442f0560e01b81525f600482015260240161036b565b6102e35f83836105af565b6001600160a01b0382166104d257604051634b637e8f60e11b81525f600482015260240161036b565b6102e3825f836105af565b6001600160a01b0384166105065760405163e602df0560e01b81525f600482015260240161036b565b6001600160a01b03831661052f57604051634a1406b160e11b81525f600482015260240161036b565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561041257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a191815260200190565b60405180910390a350505050565b6001600160a01b0383166105d9578060025f8282546105ce919061083d565b909155506106499050565b6001600160a01b0383165f908152602081905260409020548181101561062b5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161036b565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661066557600280548290039055610683565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106c891815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015610701578581018301518582016040015282016106e5565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610737575f80fd5b919050565b5f806040838503121561074d575f80fd5b61075683610721565b946020939093013593505050565b5f805f60608486031215610776575f80fd5b61077f84610721565b925061078d60208501610721565b9150604084013590509250925092565b5f602082840312156107ad575f80fd5b5035919050565b5f602082840312156107c4575f80fd5b6107cd82610721565b9392505050565b5f80604083850312156107e5575f80fd5b6107ee83610721565b91506107fc60208401610721565b90509250929050565b600181811c9082168061081957607f821691505b60208210810361083757634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. @@ -451,25 +451,46 @@ func (_ExampleERC20 *ExampleERC20TransactorSession) BurnFrom(account common.Addr return _ExampleERC20.Contract.BurnFrom(&_ExampleERC20.TransactOpts, account, value) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20Transactor) Mint(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.contract.Transact(opts, "mint", account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20Session) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20TransactorSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, account, amount) +} + +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20Transactor) Mint(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.contract.Transact(opts, "mint", amount) +func (_ExampleERC20 *ExampleERC20Transactor) Mint0(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.contract.Transact(opts, "mint0", amount) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20Session) Mint(amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, amount) +func (_ExampleERC20 *ExampleERC20Session) Mint0(amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint0(&_ExampleERC20.TransactOpts, amount) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20TransactorSession) Mint(amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, amount) +func (_ExampleERC20 *ExampleERC20TransactorSession) Mint0(amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint0(&_ExampleERC20.TransactOpts, amount) } // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 18d5f149c..6c1c39fa8 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,7 +47,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", Bin: "0x608060405234801561000f575f80fd5b506040516148f43803806148f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e13565b6102d6565b005b610128610138366004613e4e565b610761565b61017b61014b366004613e4e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e4e565b6108bd565b6101286101af366004613e79565b61092a565b6101c76101c2366004613e4e565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613eb6565b610a24565b610128610200366004613ecf565b610a4f565b61017b610213366004613f0d565b610c40565b6101c7610226366004613e4e565b610c59565b610128610239366004613e4e565b610c6d565b61012861024c366004613e13565b610cda565b61017b61025f366004613fb8565b610cf5565b610128610272366004613ecf565b610d1a565b61017b610285366004614054565b610f49565b610128610298366004613eb6565b610f5c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e4e565b611119565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146fb8339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614074565b600481111561036b5761036b614074565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614074565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061471b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061471b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614074565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061409c565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a01602052604090209091506106928282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614227565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614259565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061473b8339815191529291906107a9906140c3565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614074565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614259565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461190b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361430e565b92915050565b5f610a2e82611925565b9050610a4b81606001516001600160401b03168260400151611cb2565b5050565b5f805160206146fb8339815191525f610a6784611ce8565b90505f80610a788360400151611ec9565b5091509150610a8685612104565b5f8581526004850160205260408120610a9e91613d5b565b5f610aa8836114f8565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614321565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b90614363565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b614074565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a510006143ac565b5f610c63826114f8565b60a0015192915050565b610c7681612104565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b8115610cec57610cea83826111e8565b505b6108b8836121dd565b5f80610d0086612595565b9050610d0e85828686612642565b9150505b949350505050565b5f805160206146fb8339815191525f610d3284611ce8565b90505f80610d438360400151611ec9565b5091509150610d518561183c565b5f8581526005850160205260408120610d6991613d5b565b5f610d73836114f8565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614321565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b90614363565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f614074565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061471b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f079190611cb2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f55833384612a97565b9392505050565b5f8051602061473b8339815191525f610f7483611ce8565b90505f80610f858360400151612e52565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054611001906140c3565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614074565b145b61104f5760405162461bcd60e51b815260040161043b906143c3565b5f828152600585016020526040812061106791613d5b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061473b833981519152929190611161906140c3565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614074565b145b6111af5760405162461bcd60e51b815260040161043b906143c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a9190810190614415565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614259565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d8460400151612ff3565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061477b8339815191526020526040812060030180545f8051602061473b833981519152916001600160401b03909116908190846114c9836144e7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613d92565b5f8281525f8051602061477b8339815191526020526040908190208151610100810190925280545f8051602061473b833981519152929190829060ff16600581111561154e5761154e614074565b600581111561155f5761155f614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061477b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116985761165881600161450c565b6116639060086143ac565b5081515f9083908390811061167a5761167a61451f565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af81600361450c565b6116ba9060086143ac565b6001901c60f81b826116cd836002614533565b815181106116dd576116dd61451f565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f61450c565b61171d9060086143ac565b86901c60f81b8261172f836006614533565b8151811061173f5761173f61451f565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c85761177481600761450c565b61177f9060086143ac565b6001600160401b038616901c60f81b8261179a836026614533565b815181106117aa576117aa61451f565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df81600761450c565b6117ea9060086143ac565b6001600160401b038516901c60f81b8261180583602e614533565b815181106118155761181561451f565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206146fb833981519152929190611884906140c3565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614074565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061471b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119136131cb565b61191c82613216565b610a4b8161325c565b61192d613d92565b5f8051602061473b8339815191525f61194584611ce8565b90505f806119568360400151612e52565b9150915080156119bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156119ed576119ed614074565b60058111156119fe576119fe614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8557611a85614074565b1480611aa35750600182516005811115611aa157611aa1614074565b145b611b025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1757611b17614074565b03611b3e57505f8381526006860160205260408120600491611b399190613d5b565b611b42565b5060055b6020808301515f90815260088801909152604081205581816005811115611b6b57611b6b614074565b90816005811115611b7e57611b7e614074565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bb257611bb2614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7d57611c7d614074565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613310565b60408051606080820183525f8083526020830181905292820152905f8051602061473b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614415565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eed5760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015611f3c57611f0481600161450c565b611f0f9060086143ac565b61ffff16868281518110611f2557611f2561451f565b016020015160f81c901b9190911790600101611ef0565b5061ffff811615611f5f5760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015611fba57611f7681600361450c565b611f819060086143ac565b63ffffffff1687611f93836002614533565b81518110611fa357611fa361451f565b016020015160f81c901b9190911790600101611f62565b5063ffffffff8116600314611fe15760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561203657611ff881601f61450c565b6120039060086143ac565b8861200f836006614533565b8151811061201f5761201f61451f565b016020015160f81c901b9190911790600101611fe4565b505f805b60088110156120955761204e81600761450c565b6120599060086143ac565b6001600160401b03168961206e836026614533565b8151811061207e5761207e61451f565b016020015160f81c901b919091179060010161203a565b505f805b60088110156120f4576120ad81600761450c565b6120b89060086143ac565b6001600160401b03168a6120cd83602e614533565b815181106120dd576120dd61451f565b016020015160f81c901b9190911790600101612099565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146fb83398151915292919061214c906140c3565b905011801561217e575060015f83815260038301602052604090205460ff16600481111561217c5761217c614074565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061471b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061477b83398151915260205260408082208151610100810190925280545f8051602061473b83398151915293929190829060ff16600581111561222b5761222b614074565b600581111561223c5761223c614074565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c4576122c4614074565b146123205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a78160a0015161336f565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123eb576123eb614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b7846124b181611484565b5f61161f565b5f85815260068501602052604090209091506124d38282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612500908590600401614227565b6020604051808303815f875af115801561251c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125409190614259565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146fb833981519152816125ae84613510565b90505f6125ba82610a0e565b83549091506001600160401b038216108015906125e457508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264b613546565b5f8051602061473b833981519152426001600160401b03851611801561268557506001600160401b038416612683426202a300614533565b115b6126e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561273e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156127ac5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61281c8561336f565b5f806128636040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357d565b5f828152600586016020526040902091935091506128818282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128ae908590600401614227565b6020604051808303815f875af11580156128ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ee9190614259565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561297057612970614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a3183611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f8051602061475b83398151915255565b5f612aa0613546565b5f612aad6101c284613510565b90505f805160206146fb8339815191525f612ac7876114f8565b9050600281516005811115612ade57612ade614074565b14612b3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612b4e9190614619565b9050612b5a88826115d7565b5f612b6489611484565b90505f898983604051602001612bac9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bcd8661336f565b5f612bd98b848661161f565b5f8381526004880160205260409020909150612bf58282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c22908590600401614227565b6020604051808303815f875af1158015612c3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c629190614259565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d1157612d11614074565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f5560015f8051602061475b83398151915255565b5f808251602714612e755760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015612ec457612e8c81600161450c565b612e979060086143ac565b61ffff16858281518110612ead57612ead61451f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015612f4257612efe81600361450c565b612f099060086143ac565b63ffffffff1686612f1b836002614533565b81518110612f2b57612f2b61451f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff8116600214612f695760405162461bcd60e51b815260040161043b906145d2565b5f805b6020811015612fbe57612f8081601f61450c565b612f8b9060086143ac565b87612f97836006614533565b81518110612fa757612fa761451f565b016020015160f81c901b9190911790600101612f6c565b505f86602681518110612fd357612fd361451f565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130165760405162461bcd60e51b815260040161043b90614546565b5f805b60028110156130655761302d81600161450c565b6130389060086143ac565b61ffff1685828151811061304e5761304e61451f565b016020015160f81c901b9190911790600101613019565b5061ffff8116156130885760405162461bcd60e51b815260040161043b9061458f565b5f805b60048110156130e35761309f81600361450c565b6130aa9060086143ac565b63ffffffff16866130bc836002614533565b815181106130cc576130cc61451f565b016020015160f81c901b919091179060010161308b565b5063ffffffff811660041461310a5760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561315f5761312181601f61450c565b61312c9060086143ac565b87613138836006614533565b815181106131485761314861451f565b016020015160f81c901b919091179060010161310d565b505f805b60088110156131be5761317781600761450c565b6131829060086143ac565b6001600160401b031688613197836026614533565b815181106131a7576131a761451f565b016020015160f81c901b9190911790600101613163565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321457604051631afcd79f60e31b815260040160405180910390fd5b565b61321e6131cb565b61322781613935565b6132596060820135608083013561324460c0850160a08601613f0d565b61325460e0860160c08701614639565b613956565b50565b6132646131cb565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139b1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061473b8339815191529060ff165f036133ad575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133f5908361450c565b10613411576001600160401b0384166040830152808252613430565b83826040018181516134239190614619565b6001600160401b03169052505b5f8260200151836040015160646134479190614654565b613451919061467f565b600285015490915060ff90811690821611156134cc5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a12565b5f8051602061475b83398151915280546001190161357757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365e5761361e81600161450c565b6136299060086143ac565b5081515f908390839081106136405761364061451f565b60200101906001600160f81b03191690815f1a90535060010161360a565b505f5b60048110156136bc5761367581600361450c565b6136809060086143ac565b505f8261368e836002614533565b8151811061369e5761369e61451f565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371957845181602081106136db576136db61451f565b1a60f81b826136eb836006614533565b815181106136fb576136fb61451f565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613779578460200151816020811061373b5761373b61451f565b1a60f81b8261374b836026614533565b8151811061375b5761375b61451f565b60200101906001600160f81b03191690815f1a90535060010161371c565b505f5b60088110156137ed5761379081600761450c565b61379b9060086143ac565b60ff1685604001516001600160401b0316901c60f81b828260466137bf9190614533565b815181106137cf576137cf61451f565b60200101906001600160f81b03191690815f1a90535060010161377c565b505f5b6030811015613858578460800151818151811061380f5761380f61451f565b01602001516001600160f81b0319168261382a83604e614533565b8151811061383a5761383a61451f565b60200101906001600160f81b03191690815f1a9053506001016137f0565b505f5b60088110156138ca5761386f81600761450c565b61387a9060086143ac565b60608601516001600160401b0390811691161c60f81b8261389c83607e614533565b815181106138ac576138ac61451f565b60200101906001600160f81b03191690815f1a90535060010161385b565b506002816040516138db91906146a4565b602060405180830381855afa1580156138f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139199190614259565b94909350915050565b60015f8051602061475b83398151915255565b61393d6131cb565b613945613b74565b61394d613b84565b61325981613b8c565b61395e6131cb565b5f5f805160206146fb833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139c56001600160a01b03841683613bf8565b905080515f141580156139e95750808060200190518101906139e791906146bf565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c9190614259565b9050613a936001600160a01b038516333086613c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ad7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afb9190614259565b9050818111613b615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613b6b828261450c565b95945050505050565b613b7c6131cb565b613214613c44565b6132146131cb565b613b946131cb565b80355f8051602061473b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bde60608301604084016146da565b600291909101805460ff191660ff90921691909117905550565b6060610f5583835f613c4c565b6040516001600160a01b038481166024830152838116604483015260648201839052613c3e9186918216906323b872dd9060840161333d565b50505050565b6139226131cb565b606081471015613c715760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613c8c91906146a4565b5f6040518083038185875af1925050503d805f8114613cc6576040519150601f19603f3d011682016040523d82523d5f602084013e613ccb565b606091505b509150915061147a868383606082613ceb57613ce682613d32565b610f55565b8151158015613d0257506001600160a01b0384163b155b15613d2b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f55565b805115613d425780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d67906140c3565b5f825580601f10613d76575050565b601f0160209004905f5260205f20908101906132599190613dd6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613dea575f8155600101613dd7565b5090565b8015158114613259575f80fd5b803563ffffffff81168114613e0e575f80fd5b919050565b5f805f60608486031215613e25575f80fd5b833592506020840135613e3781613dee565b9150613e4560408501613dfb565b90509250925092565b5f60208284031215613e5e575f80fd5b5035919050565b6001600160a01b0381168114613259575f80fd5b5f80828403610100811215613e8c575f80fd5b60e0811215613e99575f80fd5b5082915060e0830135613eab81613e65565b809150509250929050565b5f60208284031215613ec6575f80fd5b610f5582613dfb565b5f8060408385031215613ee0575f80fd5b613ee983613dfb565b946020939093013593505050565b80356001600160401b0381168114613e0e575f80fd5b5f60208284031215613f1d575f80fd5b610f5582613ef7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f5c57613f5c613f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f8a57613f8a613f26565b604052919050565b5f6001600160401b03821115613faa57613faa613f26565b50601f01601f191660200190565b5f805f8060808587031215613fcb575f80fd5b8435935060208501359250613fe260408601613ef7565b915060608501356001600160401b03811115613ffc575f80fd5b8501601f8101871361400c575f80fd5b803561401f61401a82613f92565b613f62565b818152886020838501011115614033575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614065575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140bc576140bc614088565b5092915050565b600181811c908216806140d757607f821691505b6020821081036140f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141205750805b601f840160051c820191505b8181101561413f575f815560010161412c565b5050505050565b81516001600160401b0381111561415f5761415f613f26565b6141738161416d84546140c3565b846140fb565b602080601f8311600181146141a6575f841561418f5750858301515b5f19600386901b1c1916600185901b1785556141fd565b5f85815260208120601f198616915b828110156141d4578886015182559484019460019091019084016141b5565b50858210156141f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561421f578181015183820152602001614207565b50505f910152565b602081525f8251806020840152614245816040850160208701614205565b601f01601f19169190910160400192915050565b5f60208284031215614269575f80fd5b5051919050565b5f60208083525f8454614282816140c3565b806020870152604060018084165f81146142a357600181146142bf576142ec565b60ff19851660408a0152604084151560051b8a010195506142ec565b895f5260205f205f5b858110156142e35781548b82018601529083019088016142c8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261431c5761431c6142fa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e614088565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e0e81613dee565b5f8060408385031215614426575f80fd5b82516001600160401b038082111561443c575f80fd5b908401906060828703121561444f575f80fd5b614457613f3a565b8251815260208084015161446a81613e65565b8282015260408401518381111561447f575f80fd5b80850194505087601f850112614493575f80fd5b835192506144a361401a84613f92565b83815288828587010111156144b6575f80fd5b6144c584838301848801614205565b806040840152508195506144da81880161440a565b9450505050509250929050565b5f6001600160401b0380831681810361450257614502614088565b6001019392505050565b81810381811115610a1e57610a1e614088565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e614088565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140bc576140bc614088565b5f60208284031215614649575f80fd5b8135610f5581613e65565b6001600160401b0381811683821602808216919082811461467757614677614088565b505092915050565b5f6001600160401b0380841680614698576146986142fa565b92169190910492915050565b5f82516146b5818460208701614205565b9190910192915050565b5f602082840312156146cf575f80fd5b8151610f5581613dee565b5f602082840312156146ea575f80fd5b813560ff81168114610f55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index db4d6cb92..9f6d137a7 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -13,8 +13,9 @@ import { ERC20Burnable, ERC20 } from "@openzeppelin/contracts@5.0.2/token/ERC20/extensions/ERC20Burnable.sol"; +import {IERC20Mintable} from "../staking/interfaces/IERC20Mintable.sol"; -contract ExampleERC20 is ERC20Burnable { +contract ExampleERC20 is ERC20Burnable, IERC20Mintable { string private constant _TOKEN_NAME = "Mock Token"; string private constant _TOKEN_SYMBOL = "EXMP"; @@ -30,4 +31,8 @@ contract ExampleERC20 is ERC20Burnable { _mint(msg.sender, amount); } + + function mint(address account, uint256 amount) external { + _mint(account, amount); + } } diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 33f8efe5f..046dce5c1 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -8,7 +8,7 @@ pragma solidity 0.8.25; import {IERC20TokenStakingManager} from "./interfaces/IERC20TokenStakingManager.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; -import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +import {IERC20Mintable} from "./interfaces/IERC20Mintable.sol"; import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; import {ICMInitializable} from "../utilities/ICMInitializable.sol"; @@ -20,13 +20,13 @@ contract ERC20TokenStakingManager is PoSValidatorManager, IERC20TokenStakingManager { - using SafeERC20 for IERC20; - using SafeERC20TransferFrom for IERC20; + using SafeERC20 for IERC20Mintable; + using SafeERC20TransferFrom for IERC20Mintable; // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ERC20TokenStakingManager struct ERC20TokenStakingManagerStorage { - IERC20 _token; + IERC20Mintable _token; uint8 _tokenDecimals; } // solhint-enable private-vars-leading-underscore @@ -62,7 +62,7 @@ contract ERC20TokenStakingManager is */ function initialize( PoSValidatorManagerSettings calldata settings, - IERC20 token + IERC20Mintable token ) external reinitializer(2) { __ERC20TokenStakingManager_init(settings, token); } @@ -70,14 +70,17 @@ contract ERC20TokenStakingManager is // solhint-disable func-name-mixedcase function __ERC20TokenStakingManager_init( PoSValidatorManagerSettings calldata settings, - IERC20 token + IERC20Mintable token ) internal onlyInitializing { __POS_Validator_Manager_init(settings); __ERC20TokenStakingManager_init_unchained(token); } // solhint-disable func-name-mixedcase - function __ERC20TokenStakingManager_init_unchained(IERC20 token) internal onlyInitializing { + function __ERC20TokenStakingManager_init_unchained(IERC20Mintable token) + internal + onlyInitializing + { ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); require(address(token) != address(0), "ERC20TokenStakingManager: zero token address"); $._token = token; diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/staking/interfaces/IERC20Mintable.sol new file mode 100644 index 000000000..fd28ad6b1 --- /dev/null +++ b/contracts/staking/interfaces/IERC20Mintable.sol @@ -0,0 +1,12 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; + +interface IERC20Mintable is IERC20 { + function mint(address account, uint256 amount) external; +} diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 36b877a52..ea5ddebdb 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -13,15 +13,16 @@ import {IRewardCalculator} from "../interfaces/IRewardCalculator.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"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { - using SafeERC20 for IERC20; + using SafeERC20 for IERC20Mintable; ERC20TokenStakingManager public app; - IERC20 public token; + IERC20Mintable public token; function setUp() public virtual { // Construct the object under test From 318c2775b6b0c4726224184097595436ffe09a31 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 14:11:27 +0000 Subject: [PATCH 02/36] issue ERC20 staking rewards (native rewards TBD) --- .../ERC20TokenStakingManager.go | 2 +- .../ExampleRewardCalculator.go | 296 ++++++++++++++++++ .../NativeTokenStakingManager.go | 2 +- .../staking/ERC20TokenStakingManager.sol | 5 + .../staking/NativeTokenStakingManager.sol | 5 + contracts/staking/PoSValidatorManager.sol | 16 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 10 +- .../NativeTokenStakingManagerTests.t.sol | 17 +- .../tests/PoSValidatorManagerTests.t.sol | 52 ++- scripts/abi_bindings.sh | 2 +- tests/flows/governance/validator_set_sig.go | 11 +- tests/flows/staking/poa_to_pos.go | 10 +- tests/utils/staking.go | 38 ++- 13 files changed, 435 insertions(+), 31 deletions(-) create mode 100644 abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6c1c39fa8..c15551c16 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148f43803806148f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e13565b6102d6565b005b610128610138366004613e4e565b610761565b61017b61014b366004613e4e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e4e565b6108bd565b6101286101af366004613e79565b61092a565b6101c76101c2366004613e4e565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613eb6565b610a24565b610128610200366004613ecf565b610a4f565b61017b610213366004613f0d565b610c40565b6101c7610226366004613e4e565b610c59565b610128610239366004613e4e565b610c6d565b61012861024c366004613e13565b610cda565b61017b61025f366004613fb8565b610cf5565b610128610272366004613ecf565b610d1a565b61017b610285366004614054565b610f49565b610128610298366004613eb6565b610f5c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e4e565b611119565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146fb8339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614074565b600481111561036b5761036b614074565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614074565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061471b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061471b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614074565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061409c565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a01602052604090209091506106928282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614227565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614259565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061473b8339815191529291906107a9906140c3565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614074565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614259565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461190b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361430e565b92915050565b5f610a2e82611925565b9050610a4b81606001516001600160401b03168260400151611cb2565b5050565b5f805160206146fb8339815191525f610a6784611ce8565b90505f80610a788360400151611ec9565b5091509150610a8685612104565b5f8581526004850160205260408120610a9e91613d5b565b5f610aa8836114f8565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614321565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b90614363565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b614074565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a510006143ac565b5f610c63826114f8565b60a0015192915050565b610c7681612104565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b8115610cec57610cea83826111e8565b505b6108b8836121dd565b5f80610d0086612595565b9050610d0e85828686612642565b9150505b949350505050565b5f805160206146fb8339815191525f610d3284611ce8565b90505f80610d438360400151611ec9565b5091509150610d518561183c565b5f8581526005850160205260408120610d6991613d5b565b5f610d73836114f8565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614321565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b90614363565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f614074565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061471b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f079190611cb2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f55833384612a97565b9392505050565b5f8051602061473b8339815191525f610f7483611ce8565b90505f80610f858360400151612e52565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054611001906140c3565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614074565b145b61104f5760405162461bcd60e51b815260040161043b906143c3565b5f828152600585016020526040812061106791613d5b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061473b833981519152929190611161906140c3565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614074565b145b6111af5760405162461bcd60e51b815260040161043b906143c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a9190810190614415565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614259565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d8460400151612ff3565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061477b8339815191526020526040812060030180545f8051602061473b833981519152916001600160401b03909116908190846114c9836144e7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613d92565b5f8281525f8051602061477b8339815191526020526040908190208151610100810190925280545f8051602061473b833981519152929190829060ff16600581111561154e5761154e614074565b600581111561155f5761155f614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061477b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116985761165881600161450c565b6116639060086143ac565b5081515f9083908390811061167a5761167a61451f565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af81600361450c565b6116ba9060086143ac565b6001901c60f81b826116cd836002614533565b815181106116dd576116dd61451f565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f61450c565b61171d9060086143ac565b86901c60f81b8261172f836006614533565b8151811061173f5761173f61451f565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c85761177481600761450c565b61177f9060086143ac565b6001600160401b038616901c60f81b8261179a836026614533565b815181106117aa576117aa61451f565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df81600761450c565b6117ea9060086143ac565b6001600160401b038516901c60f81b8261180583602e614533565b815181106118155761181561451f565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206146fb833981519152929190611884906140c3565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614074565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061471b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119136131cb565b61191c82613216565b610a4b8161325c565b61192d613d92565b5f8051602061473b8339815191525f61194584611ce8565b90505f806119568360400151612e52565b9150915080156119bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156119ed576119ed614074565b60058111156119fe576119fe614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8557611a85614074565b1480611aa35750600182516005811115611aa157611aa1614074565b145b611b025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1757611b17614074565b03611b3e57505f8381526006860160205260408120600491611b399190613d5b565b611b42565b5060055b6020808301515f90815260088801909152604081205581816005811115611b6b57611b6b614074565b90816005811115611b7e57611b7e614074565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bb257611bb2614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7d57611c7d614074565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613310565b60408051606080820183525f8083526020830181905292820152905f8051602061473b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614415565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eed5760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015611f3c57611f0481600161450c565b611f0f9060086143ac565b61ffff16868281518110611f2557611f2561451f565b016020015160f81c901b9190911790600101611ef0565b5061ffff811615611f5f5760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015611fba57611f7681600361450c565b611f819060086143ac565b63ffffffff1687611f93836002614533565b81518110611fa357611fa361451f565b016020015160f81c901b9190911790600101611f62565b5063ffffffff8116600314611fe15760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561203657611ff881601f61450c565b6120039060086143ac565b8861200f836006614533565b8151811061201f5761201f61451f565b016020015160f81c901b9190911790600101611fe4565b505f805b60088110156120955761204e81600761450c565b6120599060086143ac565b6001600160401b03168961206e836026614533565b8151811061207e5761207e61451f565b016020015160f81c901b919091179060010161203a565b505f805b60088110156120f4576120ad81600761450c565b6120b89060086143ac565b6001600160401b03168a6120cd83602e614533565b815181106120dd576120dd61451f565b016020015160f81c901b9190911790600101612099565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146fb83398151915292919061214c906140c3565b905011801561217e575060015f83815260038301602052604090205460ff16600481111561217c5761217c614074565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061471b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061477b83398151915260205260408082208151610100810190925280545f8051602061473b83398151915293929190829060ff16600581111561222b5761222b614074565b600581111561223c5761223c614074565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c4576122c4614074565b146123205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a78160a0015161336f565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123eb576123eb614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b7846124b181611484565b5f61161f565b5f85815260068501602052604090209091506124d38282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612500908590600401614227565b6020604051808303815f875af115801561251c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125409190614259565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146fb833981519152816125ae84613510565b90505f6125ba82610a0e565b83549091506001600160401b038216108015906125e457508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264b613546565b5f8051602061473b833981519152426001600160401b03851611801561268557506001600160401b038416612683426202a300614533565b115b6126e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561273e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156127ac5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61281c8561336f565b5f806128636040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357d565b5f828152600586016020526040902091935091506128818282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128ae908590600401614227565b6020604051808303815f875af11580156128ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ee9190614259565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561297057612970614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a3183611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f8051602061475b83398151915255565b5f612aa0613546565b5f612aad6101c284613510565b90505f805160206146fb8339815191525f612ac7876114f8565b9050600281516005811115612ade57612ade614074565b14612b3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612b4e9190614619565b9050612b5a88826115d7565b5f612b6489611484565b90505f898983604051602001612bac9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bcd8661336f565b5f612bd98b848661161f565b5f8381526004880160205260409020909150612bf58282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c22908590600401614227565b6020604051808303815f875af1158015612c3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c629190614259565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d1157612d11614074565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f5560015f8051602061475b83398151915255565b5f808251602714612e755760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015612ec457612e8c81600161450c565b612e979060086143ac565b61ffff16858281518110612ead57612ead61451f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015612f4257612efe81600361450c565b612f099060086143ac565b63ffffffff1686612f1b836002614533565b81518110612f2b57612f2b61451f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff8116600214612f695760405162461bcd60e51b815260040161043b906145d2565b5f805b6020811015612fbe57612f8081601f61450c565b612f8b9060086143ac565b87612f97836006614533565b81518110612fa757612fa761451f565b016020015160f81c901b9190911790600101612f6c565b505f86602681518110612fd357612fd361451f565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130165760405162461bcd60e51b815260040161043b90614546565b5f805b60028110156130655761302d81600161450c565b6130389060086143ac565b61ffff1685828151811061304e5761304e61451f565b016020015160f81c901b9190911790600101613019565b5061ffff8116156130885760405162461bcd60e51b815260040161043b9061458f565b5f805b60048110156130e35761309f81600361450c565b6130aa9060086143ac565b63ffffffff16866130bc836002614533565b815181106130cc576130cc61451f565b016020015160f81c901b919091179060010161308b565b5063ffffffff811660041461310a5760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561315f5761312181601f61450c565b61312c9060086143ac565b87613138836006614533565b815181106131485761314861451f565b016020015160f81c901b919091179060010161310d565b505f805b60088110156131be5761317781600761450c565b6131829060086143ac565b6001600160401b031688613197836026614533565b815181106131a7576131a761451f565b016020015160f81c901b9190911790600101613163565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321457604051631afcd79f60e31b815260040160405180910390fd5b565b61321e6131cb565b61322781613935565b6132596060820135608083013561324460c0850160a08601613f0d565b61325460e0860160c08701614639565b613956565b50565b6132646131cb565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139b1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061473b8339815191529060ff165f036133ad575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133f5908361450c565b10613411576001600160401b0384166040830152808252613430565b83826040018181516134239190614619565b6001600160401b03169052505b5f8260200151836040015160646134479190614654565b613451919061467f565b600285015490915060ff90811690821611156134cc5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a12565b5f8051602061475b83398151915280546001190161357757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365e5761361e81600161450c565b6136299060086143ac565b5081515f908390839081106136405761364061451f565b60200101906001600160f81b03191690815f1a90535060010161360a565b505f5b60048110156136bc5761367581600361450c565b6136809060086143ac565b505f8261368e836002614533565b8151811061369e5761369e61451f565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371957845181602081106136db576136db61451f565b1a60f81b826136eb836006614533565b815181106136fb576136fb61451f565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613779578460200151816020811061373b5761373b61451f565b1a60f81b8261374b836026614533565b8151811061375b5761375b61451f565b60200101906001600160f81b03191690815f1a90535060010161371c565b505f5b60088110156137ed5761379081600761450c565b61379b9060086143ac565b60ff1685604001516001600160401b0316901c60f81b828260466137bf9190614533565b815181106137cf576137cf61451f565b60200101906001600160f81b03191690815f1a90535060010161377c565b505f5b6030811015613858578460800151818151811061380f5761380f61451f565b01602001516001600160f81b0319168261382a83604e614533565b8151811061383a5761383a61451f565b60200101906001600160f81b03191690815f1a9053506001016137f0565b505f5b60088110156138ca5761386f81600761450c565b61387a9060086143ac565b60608601516001600160401b0390811691161c60f81b8261389c83607e614533565b815181106138ac576138ac61451f565b60200101906001600160f81b03191690815f1a90535060010161385b565b506002816040516138db91906146a4565b602060405180830381855afa1580156138f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139199190614259565b94909350915050565b60015f8051602061475b83398151915255565b61393d6131cb565b613945613b74565b61394d613b84565b61325981613b8c565b61395e6131cb565b5f5f805160206146fb833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139c56001600160a01b03841683613bf8565b905080515f141580156139e95750808060200190518101906139e791906146bf565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c9190614259565b9050613a936001600160a01b038516333086613c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ad7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afb9190614259565b9050818111613b615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613b6b828261450c565b95945050505050565b613b7c6131cb565b613214613c44565b6132146131cb565b613b946131cb565b80355f8051602061473b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bde60608301604084016146da565b600291909101805460ff191660ff90921691909117905550565b6060610f5583835f613c4c565b6040516001600160a01b038481166024830152838116604483015260648201839052613c3e9186918216906323b872dd9060840161333d565b50505050565b6139226131cb565b606081471015613c715760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613c8c91906146a4565b5f6040518083038185875af1925050503d805f8114613cc6576040519150601f19603f3d011682016040523d82523d5f602084013e613ccb565b606091505b509150915061147a868383606082613ceb57613ce682613d32565b610f55565b8151158015613d0257506001600160a01b0384163b155b15613d2b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f55565b805115613d425780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d67906140c3565b5f825580601f10613d76575050565b601f0160209004905f5260205f20908101906132599190613dd6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613dea575f8155600101613dd7565b5090565b8015158114613259575f80fd5b803563ffffffff81168114613e0e575f80fd5b919050565b5f805f60608486031215613e25575f80fd5b833592506020840135613e3781613dee565b9150613e4560408501613dfb565b90509250925092565b5f60208284031215613e5e575f80fd5b5035919050565b6001600160a01b0381168114613259575f80fd5b5f80828403610100811215613e8c575f80fd5b60e0811215613e99575f80fd5b5082915060e0830135613eab81613e65565b809150509250929050565b5f60208284031215613ec6575f80fd5b610f5582613dfb565b5f8060408385031215613ee0575f80fd5b613ee983613dfb565b946020939093013593505050565b80356001600160401b0381168114613e0e575f80fd5b5f60208284031215613f1d575f80fd5b610f5582613ef7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f5c57613f5c613f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f8a57613f8a613f26565b604052919050565b5f6001600160401b03821115613faa57613faa613f26565b50601f01601f191660200190565b5f805f8060808587031215613fcb575f80fd5b8435935060208501359250613fe260408601613ef7565b915060608501356001600160401b03811115613ffc575f80fd5b8501601f8101871361400c575f80fd5b803561401f61401a82613f92565b613f62565b818152886020838501011115614033575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614065575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140bc576140bc614088565b5092915050565b600181811c908216806140d757607f821691505b6020821081036140f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141205750805b601f840160051c820191505b8181101561413f575f815560010161412c565b5050505050565b81516001600160401b0381111561415f5761415f613f26565b6141738161416d84546140c3565b846140fb565b602080601f8311600181146141a6575f841561418f5750858301515b5f19600386901b1c1916600185901b1785556141fd565b5f85815260208120601f198616915b828110156141d4578886015182559484019460019091019084016141b5565b50858210156141f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561421f578181015183820152602001614207565b50505f910152565b602081525f8251806020840152614245816040850160208701614205565b601f01601f19169190910160400192915050565b5f60208284031215614269575f80fd5b5051919050565b5f60208083525f8454614282816140c3565b806020870152604060018084165f81146142a357600181146142bf576142ec565b60ff19851660408a0152604084151560051b8a010195506142ec565b895f5260205f205f5b858110156142e35781548b82018601529083019088016142c8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261431c5761431c6142fa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e614088565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e0e81613dee565b5f8060408385031215614426575f80fd5b82516001600160401b038082111561443c575f80fd5b908401906060828703121561444f575f80fd5b614457613f3a565b8251815260208084015161446a81613e65565b8282015260408401518381111561447f575f80fd5b80850194505087601f850112614493575f80fd5b835192506144a361401a84613f92565b83815288828587010111156144b6575f80fd5b6144c584838301848801614205565b806040840152508195506144da81880161440a565b9450505050509250929050565b5f6001600160401b0380831681810361450257614502614088565b6001019392505050565b81810381811115610a1e57610a1e614088565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e614088565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140bc576140bc614088565b5f60208284031215614649575f80fd5b8135610f5581613e65565b6001600160401b0381811683821602808216919082811461467757614677614088565b505092915050565b5f6001600160401b0380841680614698576146986142fa565b92169190910492915050565b5f82516146b5818460208701614205565b9190910192915050565b5f602082840312156146cf575f80fd5b8151610f5581613dee565b5f602082840312156146ea575f80fd5b813560ff81168114610f55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614ada380380614ada83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61498d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fd9565b6102d6565b005b610128610138366004614014565b610761565b61017b61014b366004614014565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004614014565b6108bd565b6101286101af36600461403f565b61092a565b6101c76101c2366004614014565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed36600461407c565b610a24565b610128610200366004614095565b610b1e565b61017b6102133660046140d3565b610d0f565b6101c7610226366004614014565b610d28565b610128610239366004614014565b610d3c565b61012861024c366004613fd9565b610da9565b61017b61025f36600461417e565b610dc4565b610128610272366004614095565b610de9565b61017b61028536600461421a565b6110d4565b61012861029836600461407c565b6110e7565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004614014565b6112a4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206148e1833981519152918415610328576103258285611373565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a61423a565b600481111561036b5761036b61423a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f261423a565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461160f565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105005761050061423a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611683565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614262565b905061066a8682611762565b5f6106768785846117aa565b5f8c815260058a0160205260409020909150610692828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016143ed565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061441f565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149218339815191529291906107a990614289565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d961423a565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061441f565b505050565b6108c6816119c7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611a9a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a51000836144d4565b92915050565b5f610a2e82611ab4565b90505f5f805160206148e1833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610ac9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aed919061441f565b9050610afd836040015182611e41565b610b1883606001516001600160401b03168460400151611eb7565b50505050565b5f805160206148e18339815191525f610b3684611eda565b90505f80610b4783604001516120bb565b5091509150610b55856122f6565b5f8581526004850160205260408120610b6d91613f21565b5f610b7783611683565b9050816001600160401b031681608001516001600160401b03161015610baf5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bf45760405162461bcd60e51b815260040161043b90614529565b60015f87815260038701602052604090205460ff166004811115610c1a57610c1a61423a565b14610c835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614572565b5f610d3282611683565b60a0015192915050565b610d45816122f6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b8115610dbb57610db98382611373565b505b6108b8836123cf565b5f80610dcf86612787565b9050610ddd85828686612834565b9150505b949350505050565b5f805160206148e18339815191525f610e0184611eda565b90505f80610e1283604001516120bb565b5091509150610e20856119c7565b5f8581526005850160205260408120610e3891613f21565b5f610e4283611683565b9050816001600160401b031681608001516001600160401b03161015610e7a5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003808701602052604090912001546001600160401b0380841691161115610eb85760405162461bcd60e51b815260040161043b90614529565b60035f87815260038701602052604090205460ff166004811115610ede57610ede61423a565b14610f325760405162461bcd60e51b815260206004820152603160248201525f805160206149018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610fd69190611eb7565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561105d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611081919061441f565b9050611091826020015182611e41565b836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f6110e0833384612c89565b9392505050565b5f805160206149218339815191525f6110ff83611eda565b90505f806111108360400151613044565b91509150806111725760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526005850160205260408120805461118c90614289565b90501180156111be575060015f83815260078601602052604090205460ff1660058111156111bc576111bc61423a565b145b6111da5760405162461bcd60e51b815260040161043b90614589565b5f82815260058501602052604081206111f291613f21565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149218339815191529291906112ec90614289565b905011801561131e575060015f83815260078301602052604090205460ff16600581111561131c5761131c61423a565b145b61133a5760405162461bcd60e51b815260040161043b90614589565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113e591908101906145db565b91509150806114485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114af919061441f565b8251146115135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156115895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061159884604001516131e5565b915091508187146116055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149618339815191526020526040812060030180545f80516020614921833981519152916001600160401b0390911690819084611654836146ad565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61168b613f58565b5f8281525f805160206149618339815191526020526040908190208151610100810190925280545f80516020614921833981519152929190829060ff1660058111156116d9576116d961423a565b60058111156116ea576116ea61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614961833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611823576117e38160016146d2565b6117ee906008614572565b5081515f90839083908110611805576118056146e5565b60200101906001600160f81b03191690815f1a9053506001016117cf565b505f5b60048110156118865761183a8160036146d2565b611845906008614572565b6001901c60f81b826118588360026146f9565b81518110611868576118686146e5565b60200101906001600160f81b03191690815f1a905350600101611826565b505f5b60208110156118e85761189d81601f6146d2565b6118a8906008614572565b86901c60f81b826118ba8360066146f9565b815181106118ca576118ca6146e5565b60200101906001600160f81b03191690815f1a905350600101611889565b505f5b6008811015611953576118ff8160076146d2565b61190a906008614572565b6001600160401b038616901c60f81b826119258360266146f9565b81518110611935576119356146e5565b60200101906001600160f81b03191690815f1a9053506001016118eb565b505f5b60088110156119be5761196a8160076146d2565b611975906008614572565b6001600160401b038516901c60f81b8261199083602e6146f9565b815181106119a0576119a06146e5565b60200101906001600160f81b03191690815f1a905350600101611956565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206148e1833981519152929190611a0f90614289565b9050118015611a41575060035f83815260038301602052604090205460ff166004811115611a3f57611a3f61423a565b145b611a965760405162461bcd60e51b815260206004820152603360248201525f8051602061490183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611aa26133bd565b611aab82613408565b611a968161344e565b611abc613f58565b5f805160206149218339815191525f611ad484611eda565b90505f80611ae58360400151613044565b915091508015611b4a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611b7c57611b7c61423a565b6005811115611b8d57611b8d61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c1457611c1461423a565b1480611c325750600182516005811115611c3057611c3061423a565b145b611c915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611ca657611ca661423a565b03611ccd57505f8381526006860160205260408120600491611cc89190613f21565b611cd1565b5060055b6020808301515f90815260088801909152604081205581816005811115611cfa57611cfa61423a565b90816005811115611d0d57611d0d61423a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611d4157611d4161423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e0c57611e0c61423a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206148c183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611e9c575f80fd5b505af1158015611eae573d5f803e3d5ffd5b50505050505050565b5f805160206148c183398151915254611a96906001600160a01b031682846134ef565b60408051606080820183525f8083526020830181905292820152905f805160206149218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f4f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7691908101906145db565b9150915080611fdd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b82548251146120405760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b0316156120b35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f83516036146120df5760405162461bcd60e51b815260040161043b9061470c565b5f805b600281101561212e576120f68160016146d2565b612101906008614572565b61ffff16868281518110612117576121176146e5565b016020015160f81c901b91909117906001016120e2565b5061ffff8116156121515760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156121ac576121688160036146d2565b612173906008614572565b63ffffffff16876121858360026146f9565b81518110612195576121956146e5565b016020015160f81c901b9190911790600101612154565b5063ffffffff81166003146121d35760405162461bcd60e51b815260040161043b90614798565b5f805b6020811015612228576121ea81601f6146d2565b6121f5906008614572565b886122018360066146f9565b81518110612211576122116146e5565b016020015160f81c901b91909117906001016121d6565b505f805b6008811015612287576122408160076146d2565b61224b906008614572565b6001600160401b0316896122608360266146f9565b81518110612270576122706146e5565b016020015160f81c901b919091179060010161222c565b505f805b60088110156122e65761229f8160076146d2565b6122aa906008614572565b6001600160401b03168a6122bf83602e6146f9565b815181106122cf576122cf6146e5565b016020015160f81c901b919091179060010161228b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206148e183398151915292919061233e90614289565b9050118015612370575060015f83815260038301602052604090205460ff16600481111561236e5761236e61423a565b145b611a965760405162461bcd60e51b815260206004820152603860248201525f8051602061490183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061496183398151915260205260408082208151610100810190925280545f8051602061492183398151915293929190829060ff16600581111561241d5761241d61423a565b600581111561242e5761242e61423a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b6576124b661423a565b146125125760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461258c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6125998160a0015161354e565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125dd576125dd61423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126a9846126a38161160f565b5f6117aa565b5f85815260068501602052604090209091506126c5828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f29085906004016143ed565b6020604051808303815f875af115801561270e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612732919061441f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206148e1833981519152816127a0846136ef565b90505f6127ac82610a0e565b83549091506001600160401b038216108015906127d657508260010154816001600160401b031611155b610de15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61283d613712565b5f80516020614921833981519152426001600160401b03851611801561287757506001600160401b038416612875426202a3006146f9565b115b6128d95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856129305760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561299e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b612a0e8561354e565b5f80612a556040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613749565b5f82815260058601602052604090209193509150612a73828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612aa09085906004016143ed565b6020604051808303815f875af1158015612abc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae0919061441f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612b6257612b6261423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612c238361160f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610de160015f8051602061494183398151915255565b5f612c92613712565b5f612c9f6101c2846136ef565b90505f805160206148e18339815191525f612cb987611683565b9050600281516005811115612cd057612cd061423a565b14612d2f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612d4091906147df565b9050612d4c8882611762565b5f612d568961160f565b90505f898983604051602001612d9e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612dbf8661354e565b5f612dcb8b84866117aa565b5f8381526004880160205260409020909150612de7828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e149085906004016143ed565b6020604051808303815f875af1158015612e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e54919061441f565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f0357612f0361423a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506110e060015f8051602061494183398151915255565b5f8082516027146130675760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156130b65761307e8160016146d2565b613089906008614572565b61ffff1685828151811061309f5761309f6146e5565b016020015160f81c901b919091179060010161306a565b5061ffff8116156130d95760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015613134576130f08160036146d2565b6130fb906008614572565b63ffffffff168661310d8360026146f9565b8151811061311d5761311d6146e5565b016020015160f81c901b91909117906001016130dc565b5063ffffffff811660021461315b5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156131b05761317281601f6146d2565b61317d906008614572565b876131898360066146f9565b81518110613199576131996146e5565b016020015160f81c901b919091179060010161315e565b505f866026815181106131c5576131c56146e5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132085760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156132575761321f8160016146d2565b61322a906008614572565b61ffff16858281518110613240576132406146e5565b016020015160f81c901b919091179060010161320b565b5061ffff81161561327a5760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156132d5576132918160036146d2565b61329c906008614572565b63ffffffff16866132ae8360026146f9565b815181106132be576132be6146e5565b016020015160f81c901b919091179060010161327d565b5063ffffffff81166004146132fc5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156133515761331381601f6146d2565b61331e906008614572565b8761332a8360066146f9565b8151811061333a5761333a6146e5565b016020015160f81c901b91909117906001016132ff565b505f805b60088110156133b0576133698160076146d2565b613374906008614572565b6001600160401b0316886133898360266146f9565b81518110613399576133996146e5565b016020015160f81c901b9190911790600101613355565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661340657604051631afcd79f60e31b815260040160405180910390fd5b565b6134106133bd565b61341981613b01565b61344b6060820135608083013561343660c0850160a086016140d3565b61344660e0860160c087016147ff565b613b22565b50565b6134566133bd565b5f805160206148c18339815191526001600160a01b0382166134cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613b7d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149218339815191529060ff165f0361358c575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135d490836146d2565b106135f0576001600160401b038416604083015280825261360f565b838260400181815161360291906147df565b6001600160401b03169052505b5f826020015183604001516064613626919061481a565b6136309190614845565b600285015490915060ff90811690821611156136ab5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e825f805160206148c1833981519152546001600160a01b031690613bde565b5f8051602061494183398151915280546001190161374357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137b35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561382a576137ea8160016146d2565b6137f5906008614572565b5081515f9083908390811061380c5761380c6146e5565b60200101906001600160f81b03191690815f1a9053506001016137d6565b505f5b6004811015613888576138418160036146d2565b61384c906008614572565b505f8261385a8360026146f9565b8151811061386a5761386a6146e5565b60200101906001600160f81b03191690815f1a90535060010161382d565b505f5b60208110156138e557845181602081106138a7576138a76146e5565b1a60f81b826138b78360066146f9565b815181106138c7576138c76146e5565b60200101906001600160f81b03191690815f1a90535060010161388b565b505f5b60208110156139455784602001518160208110613907576139076146e5565b1a60f81b826139178360266146f9565b81518110613927576139276146e5565b60200101906001600160f81b03191690815f1a9053506001016138e8565b505f5b60088110156139b95761395c8160076146d2565b613967906008614572565b60ff1685604001516001600160401b0316901c60f81b8282604661398b91906146f9565b8151811061399b5761399b6146e5565b60200101906001600160f81b03191690815f1a905350600101613948565b505f5b6030811015613a2457846080015181815181106139db576139db6146e5565b01602001516001600160f81b031916826139f683604e6146f9565b81518110613a0657613a066146e5565b60200101906001600160f81b03191690815f1a9053506001016139bc565b505f5b6008811015613a9657613a3b8160076146d2565b613a46906008614572565b60608601516001600160401b0390811691161c60f81b82613a6883607e6146f9565b81518110613a7857613a786146e5565b60200101906001600160f81b03191690815f1a905350600101613a27565b50600281604051613aa7919061486a565b602060405180830381855afa158015613ac2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ae5919061441f565b94909350915050565b60015f8051602061494183398151915255565b613b096133bd565b613b11613d40565b613b19613d50565b61344b81613d58565b613b2a6133bd565b5f5f805160206148e1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613b916001600160a01b03841683613dc4565b905080515f14158015613bb5575080806020019051810190613bb39190614885565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c48919061441f565b9050613c5f6001600160a01b038516333086613dd1565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc7919061441f565b9050818111613d2d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613d3782826146d2565b95945050505050565b613d486133bd565b613406613e0a565b6134066133bd565b613d606133bd565b80355f8051602061492183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613daa60608301604084016148a0565b600291909101805460ff191660ff90921691909117905550565b60606110e083835f613e12565b6040516001600160a01b038481166024830152838116604483015260648201839052610b189186918216906323b872dd9060840161351c565b613aee6133bd565b606081471015613e375760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e52919061486a565b5f6040518083038185875af1925050503d805f8114613e8c576040519150601f19603f3d011682016040523d82523d5f602084013e613e91565b606091505b5091509150611605868383606082613eb157613eac82613ef8565b6110e0565b8151158015613ec857506001600160a01b0384163b155b15613ef157604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b50806110e0565b805115613f085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f2d90614289565b5f825580601f10613f3c575050565b601f0160209004905f5260205f209081019061344b9190613f9c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fb0575f8155600101613f9d565b5090565b801515811461344b575f80fd5b803563ffffffff81168114613fd4575f80fd5b919050565b5f805f60608486031215613feb575f80fd5b833592506020840135613ffd81613fb4565b915061400b60408501613fc1565b90509250925092565b5f60208284031215614024575f80fd5b5035919050565b6001600160a01b038116811461344b575f80fd5b5f80828403610100811215614052575f80fd5b60e081121561405f575f80fd5b5082915060e08301356140718161402b565b809150509250929050565b5f6020828403121561408c575f80fd5b6110e082613fc1565b5f80604083850312156140a6575f80fd5b6140af83613fc1565b946020939093013593505050565b80356001600160401b0381168114613fd4575f80fd5b5f602082840312156140e3575f80fd5b6110e0826140bd565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614122576141226140ec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614150576141506140ec565b604052919050565b5f6001600160401b03821115614170576141706140ec565b50601f01601f191660200190565b5f805f8060808587031215614191575f80fd5b84359350602085013592506141a8604086016140bd565b915060608501356001600160401b038111156141c2575f80fd5b8501601f810187136141d2575f80fd5b80356141e56141e082614158565b614128565b8181528860208385010111156141f9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561422b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142825761428261424e565b5092915050565b600181811c9082168061429d57607f821691505b6020821081036142bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142e65750805b601f840160051c820191505b81811015614305575f81556001016142f2565b5050505050565b81516001600160401b03811115614325576143256140ec565b614339816143338454614289565b846142c1565b602080601f83116001811461436c575f84156143555750858301515b5f19600386901b1c1916600185901b1785556143c3565b5f85815260208120601f198616915b8281101561439a5788860151825594840194600190910190840161437b565b50858210156143b757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143e55781810151838201526020016143cd565b50505f910152565b602081525f825180602084015261440b8160408501602087016143cb565b601f01601f19169190910160400192915050565b5f6020828403121561442f575f80fd5b5051919050565b5f60208083525f845461444881614289565b806020870152604060018084165f81146144695760018114614485576144b2565b60ff19851660408a0152604084151560051b8a010195506144b2565b895f5260205f205f5b858110156144a95781548b820186015290830190880161448e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826144e2576144e26144c0565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e61424e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fd481613fb4565b5f80604083850312156145ec575f80fd5b82516001600160401b0380821115614602575f80fd5b9084019060608287031215614615575f80fd5b61461d614100565b825181526020808401516146308161402b565b82820152604084015183811115614645575f80fd5b80850194505087601f850112614659575f80fd5b835192506146696141e084614158565b838152888285870101111561467c575f80fd5b61468b848383018488016143cb565b806040840152508195506146a08188016145d0565b9450505050509250929050565b5f6001600160401b038083168181036146c8576146c861424e565b6001019392505050565b81810381811115610a1e57610a1e61424e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e61424e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142825761428261424e565b5f6020828403121561480f575f80fd5b81356110e08161402b565b6001600160401b0381811683821602808216919082811461483d5761483d61424e565b505092915050565b5f6001600160401b038084168061485e5761485e6144c0565b92169190910492915050565b5f825161487b8184602087016143cb565b9190910192915050565b5f60208284031215614895575f80fd5b81516110e081613fb4565b5f602082840312156148b0575f80fd5b813560ff811681146110e0575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go new file mode 100644 index 000000000..75980496a --- /dev/null +++ b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -0,0 +1,296 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package examplerewardcalculator + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. +var ExampleRewardCalculatorMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", +} + +// ExampleRewardCalculatorABI is the input ABI used to generate the binding from. +// Deprecated: Use ExampleRewardCalculatorMetaData.ABI instead. +var ExampleRewardCalculatorABI = ExampleRewardCalculatorMetaData.ABI + +// ExampleRewardCalculatorBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ExampleRewardCalculatorMetaData.Bin instead. +var ExampleRewardCalculatorBin = ExampleRewardCalculatorMetaData.Bin + +// DeployExampleRewardCalculator deploys a new Ethereum contract, binding an instance of ExampleRewardCalculator to it. +func DeployExampleRewardCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, rewardBasisPoints_ uint64) (common.Address, *types.Transaction, *ExampleRewardCalculator, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ExampleRewardCalculatorBin), backend, rewardBasisPoints_) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// ExampleRewardCalculator is an auto generated Go binding around an Ethereum contract. +type ExampleRewardCalculator struct { + ExampleRewardCalculatorCaller // Read-only binding to the contract + ExampleRewardCalculatorTransactor // Write-only binding to the contract + ExampleRewardCalculatorFilterer // Log filterer for contract events +} + +// ExampleRewardCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ExampleRewardCalculatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ExampleRewardCalculatorSession struct { + Contract *ExampleRewardCalculator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ExampleRewardCalculatorCallerSession struct { + Contract *ExampleRewardCalculatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ExampleRewardCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ExampleRewardCalculatorTransactorSession struct { + Contract *ExampleRewardCalculatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type ExampleRewardCalculatorRaw struct { + Contract *ExampleRewardCalculator // Generic contract binding to access the raw methods on +} + +// ExampleRewardCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCallerRaw struct { + Contract *ExampleRewardCalculatorCaller // Generic read-only contract binding to access the raw methods on +} + +// ExampleRewardCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactorRaw struct { + Contract *ExampleRewardCalculatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewExampleRewardCalculator creates a new instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculator(address common.Address, backend bind.ContractBackend) (*ExampleRewardCalculator, error) { + contract, err := bindExampleRewardCalculator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// NewExampleRewardCalculatorCaller creates a new read-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorCaller(address common.Address, caller bind.ContractCaller) (*ExampleRewardCalculatorCaller, error) { + contract, err := bindExampleRewardCalculator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorCaller{contract: contract}, nil +} + +// NewExampleRewardCalculatorTransactor creates a new write-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*ExampleRewardCalculatorTransactor, error) { + contract, err := bindExampleRewardCalculator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorTransactor{contract: contract}, nil +} + +// NewExampleRewardCalculatorFilterer creates a new log filterer instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*ExampleRewardCalculatorFilterer, error) { + contract, err := bindExampleRewardCalculator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorFilterer{contract: contract}, nil +} + +// bindExampleRewardCalculator binds a generic wrapper to an already deployed contract. +func bindExampleRewardCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transact(opts, method, params...) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) SECONDSINYEAR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "SECONDS_IN_YEAR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) RewardBasisPoints(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "rewardBasisPoints") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 417ebce75..24b9a52d7 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161452538038061452583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d88061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a91565b610389565b005b348015610134575f80fd5b50610127610143366004613acc565b61046b565b348015610153575f80fd5b50610127610162366004613b07565b6108f6565b348015610172575f80fd5b506101b1610181366004613b07565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613b07565b610a52565b3480156101ee575f80fd5b506102026101fd366004613b07565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613b1e565b610ad5565b348015610244575f80fd5b50610127610253366004613b37565b610b00565b348015610263575f80fd5b506101b1610272366004613b75565b610cf1565b348015610282575f80fd5b50610202610291366004613b07565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613b07565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613acc565b610d8b565b3480156102df575f80fd5b506101276102ee366004613b37565b610da6565b3480156102fe575f80fd5b5061012761030d366004613b1e565b610fd5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613b07565b611192565b6101b1610371366004613b07565b611261565b6101b1610384366004613c20565b61126d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611291565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061432c8339815191529184156104bd576104ba82856112a5565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613cb2565b600481111561050057610500613cb2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613cb2565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f8051602061434c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611541565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613cb2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610767856115b5565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613cda565b90506107ff8682611694565b5f61080b8785846116dc565b5f8c815260058a01602052604090209091506108278282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613e5f565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e91565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061436c83398151915292919061093e90613d01565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613cb2565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e91565b505050565b610a5b816118f9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b5f610acf64e8d4a5100083613f46565b92915050565b5f610adf826119c8565b9050610afc81606001516001600160401b03168260400151611d55565b5050565b5f8051602061432c8339815191525f610b1884611d68565b90505f80610b298360400151611f49565b5091509150610b3785612184565b5f8581526004850160205260408120610b4f916139fe565b5f610b59836115b5565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613f59565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f9b565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613cb2565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613fe4565b5f610d14826115b5565b60a0015192915050565b610d2781612184565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b8115610d9d57610d9b83826112a5565b505b610a4d8361225d565b5f8051602061432c8339815191525f610dbe84611d68565b90505f80610dcf8360400151611f49565b5091509150610ddd856118f9565b5f8581526005850160205260408120610df5916139fe565b5f610dff836115b5565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613f59565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f9b565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613cb2565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f8051602061434c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f939190611d55565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061436c8339815191525f610fed83611d68565b90505f80610ffe8360400151612615565b91509150806110605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461107a90613d01565b90501180156110ac575060015f83815260078601602052604090205460ff1660058111156110aa576110aa613cb2565b145b6110c85760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058501602052604081206110e0916139fe565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061436c8339815191529291906111da90613d01565b905011801561120c575060015f83815260078301602052604090205460ff16600581111561120a5761120a613cb2565b145b6112285760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b5f610acf8233346127b6565b5f8061127834612b6e565b905061128685828686612c18565b9150505b9392505050565b61129961306d565b6112a2816130b8565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112f0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113179190810190614061565b915091508061137a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e19190613e91565b8251146114455760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156114bb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806114ca84604001516130fb565b915091508187146115375760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206143ac8339815191526020526040812060030180545f8051602061436c833981519152916001600160401b039091169081908461158683614133565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115bd613a35565b5f8281525f805160206143ac8339815191526020526040908190208151610100810190925280545f8051602061436c833981519152929190829060ff16600581111561160b5761160b613cb2565b600581111561161c5761161c613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206143ac833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175557611715816001614158565b611720906008613fe4565b5081515f908390839081106117375761173761416b565b60200101906001600160f81b03191690815f1a905350600101611701565b505f5b60048110156117b85761176c816003614158565b611777906008613fe4565b6001901c60f81b8261178a83600261417f565b8151811061179a5761179a61416b565b60200101906001600160f81b03191690815f1a905350600101611758565b505f5b602081101561181a576117cf81601f614158565b6117da906008613fe4565b86901c60f81b826117ec83600661417f565b815181106117fc576117fc61416b565b60200101906001600160f81b03191690815f1a9053506001016117bb565b505f5b600881101561188557611831816007614158565b61183c906008613fe4565b6001600160401b038616901c60f81b8261185783602661417f565b815181106118675761186761416b565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60088110156118f05761189c816007614158565b6118a7906008613fe4565b6001600160401b038516901c60f81b826118c283602e61417f565b815181106118d2576118d261416b565b60200101906001600160f81b03191690815f1a905350600101611888565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061432c83398151915292919061194190613d01565b9050118015611973575060035f83815260038301602052604090205460ff16600481111561197157611971613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119d0613a35565b5f8051602061436c8339815191525f6119e884611d68565b90505f806119f98360400151612615565b915091508015611a5e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a9057611a90613cb2565b6005811115611aa157611aa1613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2857611b28613cb2565b1480611b465750600182516005811115611b4457611b44613cb2565b145b611ba55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611bba57611bba613cb2565b03611be157505f8381526006860160205260408120600491611bdc91906139fe565b611be5565b5060055b6020808301515f90815260088801909152604081205581816005811115611c0e57611c0e613cb2565b90816005811115611c2157611c21613cb2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c5557611c55613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2057611d20613cb2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b038216836132d3565b60408051606080820183525f8083526020830181905292820152905f8051602061436c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ddd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e049190810190614061565b9150915080611e6b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611ece5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611f415760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611f6d5760405162461bcd60e51b81526004016105d090614192565b5f805b6002811015611fbc57611f84816001614158565b611f8f906008613fe4565b61ffff16868281518110611fa557611fa561416b565b016020015160f81c901b9190911790600101611f70565b5061ffff811615611fdf5760405162461bcd60e51b81526004016105d0906141db565b5f805b600481101561203a57611ff6816003614158565b612001906008613fe4565b63ffffffff168761201383600261417f565b815181106120235761202361416b565b016020015160f81c901b9190911790600101611fe2565b5063ffffffff81166003146120615760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156120b65761207881601f614158565b612083906008613fe4565b8861208f83600661417f565b8151811061209f5761209f61416b565b016020015160f81c901b9190911790600101612064565b505f805b6008811015612115576120ce816007614158565b6120d9906008613fe4565b6001600160401b0316896120ee83602661417f565b815181106120fe576120fe61416b565b016020015160f81c901b91909117906001016120ba565b505f805b60088110156121745761212d816007614158565b612138906008613fe4565b6001600160401b03168a61214d83602e61417f565b8151811061215d5761215d61416b565b016020015160f81c901b9190911790600101612119565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061432c8339815191529291906121cc90613d01565b90501180156121fe575060015f83815260038301602052604090205460ff1660048111156121fc576121fc613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f8051602061434c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f805160206143ac83398151915260205260408082208151610100810190925280545f8051602061436c83398151915293929190829060ff1660058111156122ab576122ab613cb2565b60058111156122bc576122bc613cb2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561234457612344613cb2565b146123a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461241a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6124278160a00151613366565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561246b5761246b613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125378461253181611541565b5f6116dc565b5f85815260068501602052604090209091506125538282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612580908590600401613e5f565b6020604051808303815f875af115801561259c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c09190613e91565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146126385760405162461bcd60e51b81526004016105d090614192565b5f805b60028110156126875761264f816001614158565b61265a906008613fe4565b61ffff168582815181106126705761267061416b565b016020015160f81c901b919091179060010161263b565b5061ffff8116156126aa5760405162461bcd60e51b81526004016105d0906141db565b5f805b6004811015612705576126c1816003614158565b6126cc906008613fe4565b63ffffffff16866126de83600261417f565b815181106126ee576126ee61416b565b016020015160f81c901b91909117906001016126ad565b5063ffffffff811660021461272c5760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156127815761274381601f614158565b61274e906008613fe4565b8761275a83600661417f565b8151811061276a5761276a61416b565b016020015160f81c901b919091179060010161272f565b505f866026815181106127965761279661416b565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127bf613507565b5f6127c983610abf565b90505f8051602061432c8339815191525f6127e3876115b5565b90506002815160058111156127fa576127fa613cb2565b146128595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a0015161286a9190614265565b90506128768882611694565b5f61288089611541565b90505f8989836040516020016128c89392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128e986613366565b5f6128f58b84866116dc565b5f83815260048801602052604090209091506129118282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061293e908590600401613e5f565b6020604051808303815f875af115801561295a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297e9190613e91565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a2d57612a2d613cb2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061128a60015f8051602061438c83398151915255565b5f5f8051602061432c8339815191528282612b8882610abf565b83549091506001600160401b03821610801590612bb257508260010154816001600160401b031611155b612c105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612c21613507565b5f8051602061436c833981519152426001600160401b038516118015612c5b57506001600160401b038416612c59426202a30061417f565b115b612cbd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612d145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612d825760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612df285613366565b5f80612e396040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613551565b5f82815260058601602052604090209193509150612e578282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e84908590600401613e5f565b6020604051808303815f875af1158015612ea0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ec49190613e91565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612f4657612f46613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561300783611541565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c1060015f8051602061438c83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130b657604051631afcd79f60e31b815260040160405180910390fd5b565b6130c061306d565b6130c9816138f6565b6112a2606082013560808301356130e660c0850160a08601613b75565b6130f660e0860160c08701614285565b613917565b5f808251602e1461311e5760405162461bcd60e51b81526004016105d090614192565b5f805b600281101561316d57613135816001614158565b613140906008613fe4565b61ffff168582815181106131565761315661416b565b016020015160f81c901b9190911790600101613121565b5061ffff8116156131905760405162461bcd60e51b81526004016105d0906141db565b5f805b60048110156131eb576131a7816003614158565b6131b2906008613fe4565b63ffffffff16866131c483600261417f565b815181106131d4576131d461416b565b016020015160f81c901b9190911790600101613193565b5063ffffffff81166004146132125760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156132675761322981601f614158565b613234906008613fe4565b8761324083600661417f565b815181106132505761325061416b565b016020015160f81c901b9190911790600101613215565b505f805b60088110156132c65761327f816007614158565b61328a906008613fe4565b6001600160401b03168861329f83602661417f565b815181106132af576132af61416b565b016020015160f81c901b919091179060010161326b565b5090969095509350505050565b804710156132f65760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461333f576040519150601f19603f3d011682016040523d82523d5f602084013e613344565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061436c8339815191529060ff165f036133a4575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ec9083614158565b10613408576001600160401b0384166040830152808252613427565b838260400181815161341a9190614265565b6001600160401b03169052505b5f82602001518360400151606461343e91906142a0565b61344891906142cb565b600285015490915060ff90811690821611156134c35760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061438c83398151915280546001190161353857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061438c83398151915255565b5f60608260800151516030146135bb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613632576135f2816001614158565b6135fd906008613fe4565b5081515f908390839081106136145761361461416b565b60200101906001600160f81b03191690815f1a9053506001016135de565b505f5b600481101561369057613649816003614158565b613654906008613fe4565b505f8261366283600261417f565b815181106136725761367261416b565b60200101906001600160f81b03191690815f1a905350600101613635565b505f5b60208110156136ed57845181602081106136af576136af61416b565b1a60f81b826136bf83600661417f565b815181106136cf576136cf61416b565b60200101906001600160f81b03191690815f1a905350600101613693565b505f5b602081101561374d578460200151816020811061370f5761370f61416b565b1a60f81b8261371f83602661417f565b8151811061372f5761372f61416b565b60200101906001600160f81b03191690815f1a9053506001016136f0565b505f5b60088110156137c157613764816007614158565b61376f906008613fe4565b60ff1685604001516001600160401b0316901c60f81b82826046613793919061417f565b815181106137a3576137a361416b565b60200101906001600160f81b03191690815f1a905350600101613750565b505f5b603081101561382c57846080015181815181106137e3576137e361416b565b01602001516001600160f81b031916826137fe83604e61417f565b8151811061380e5761380e61416b565b60200101906001600160f81b03191690815f1a9053506001016137c4565b505f5b600881101561389e57613843816007614158565b61384e906008613fe4565b60608601516001600160401b0390811691161c60f81b8261387083607e61417f565b815181106138805761388061416b565b60200101906001600160f81b03191690815f1a90535060010161382f565b506002816040516138af91906142f0565b602060405180830381855afa1580156138ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ed9190613e91565b94909350915050565b6138fe61306d565b613906613972565b61390e613982565b6112a28161398a565b61391f61306d565b5f5f8051602061432c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61397a61306d565b6130b66139f6565b6130b661306d565b61399261306d565b80355f8051602061436c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139dc606083016040840161430b565b600291909101805460ff191660ff90921691909117905550565b61353e61306d565b508054613a0a90613d01565b5f825580601f10613a19575050565b601f0160209004905f5260205f20908101906112a29190613a79565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613a8d575f8155600101613a7a565b5090565b5f60e08284031215613aa1575f80fd5b50919050565b80151581146112a2575f80fd5b803563ffffffff81168114613ac7575f80fd5b919050565b5f805f60608486031215613ade575f80fd5b833592506020840135613af081613aa7565b9150613afe60408501613ab4565b90509250925092565b5f60208284031215613b17575f80fd5b5035919050565b5f60208284031215613b2e575f80fd5b61128a82613ab4565b5f8060408385031215613b48575f80fd5b613b5183613ab4565b946020939093013593505050565b80356001600160401b0381168114613ac7575f80fd5b5f60208284031215613b85575f80fd5b61128a82613b5f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bc457613bc4613b8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bf257613bf2613b8e565b604052919050565b5f6001600160401b03821115613c1257613c12613b8e565b50601f01601f191660200190565b5f805f60608486031215613c32575f80fd5b83359250613c4260208501613b5f565b915060408401356001600160401b03811115613c5c575f80fd5b8401601f81018613613c6c575f80fd5b8035613c7f613c7a82613bfa565b613bca565b818152876020838501011115613c93575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613cfa57613cfa613cc6565b5092915050565b600181811c90821680613d1557607f821691505b602082108103613aa157634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613d585750805b601f840160051c820191505b81811015613d77575f8155600101613d64565b5050505050565b81516001600160401b03811115613d9757613d97613b8e565b613dab81613da58454613d01565b84613d33565b602080601f831160018114613dde575f8415613dc75750858301515b5f19600386901b1c1916600185901b178555613e35565b5f85815260208120601f198616915b82811015613e0c57888601518255948401946001909101908401613ded565b5085821015613e2957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e57578181015183820152602001613e3f565b50505f910152565b602081525f8251806020840152613e7d816040850160208701613e3d565b601f01601f19169190910160400192915050565b5f60208284031215613ea1575f80fd5b5051919050565b5f60208083525f8454613eba81613d01565b806020870152604060018084165f8114613edb5760018114613ef757613f24565b60ff19851660408a0152604084151560051b8a01019550613f24565b895f5260205f205f5b85811015613f1b5781548b8201860152908301908801613f00565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f5457613f54613f32565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613cc6565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146112a2575f80fd5b8051613ac781613aa7565b5f8060408385031215614072575f80fd5b82516001600160401b0380821115614088575f80fd5b908401906060828703121561409b575f80fd5b6140a3613ba2565b825181526020808401516140b681614042565b828201526040840151838111156140cb575f80fd5b80850194505087601f8501126140df575f80fd5b835192506140ef613c7a84613bfa565b8381528882858701011115614102575f80fd5b61411184838301848801613e3d565b80604084015250819550614126818801614056565b9450505050509250929050565b5f6001600160401b0380831681810361414e5761414e613cc6565b6001019392505050565b81810381811115610acf57610acf613cc6565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613cc6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613cfa57613cfa613cc6565b5f60208284031215614295575f80fd5b813561128a81614042565b6001600160401b038181168382160280821691908281146142c3576142c3613cc6565b505092915050565b5f6001600160401b03808416806142e4576142e4613f32565b92169190910492915050565b5f8251614301818460208701613e3d565b9190910192915050565b5f6020828403121561431b575f80fd5b813560ff8116811461128a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161469838038061469883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61454b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c04565b610389565b005b348015610134575f80fd5b50610127610143366004613c3f565b61046b565b348015610153575f80fd5b50610127610162366004613c7a565b6108f6565b348015610172575f80fd5b506101b1610181366004613c7a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613c7a565b610a52565b3480156101ee575f80fd5b506102026101fd366004613c7a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613c91565b610ad5565b348015610244575f80fd5b50610127610253366004613caa565b610bc1565b348015610263575f80fd5b506101b1610272366004613ce8565b610db2565b348015610282575f80fd5b50610202610291366004613c7a565b610dcb565b3480156102a1575f80fd5b506101276102b0366004613c7a565b610ddf565b3480156102c0575f80fd5b506101276102cf366004613c3f565b610e4c565b3480156102df575f80fd5b506101276102ee366004613caa565b610e67565b3480156102fe575f80fd5b5061012761030d366004613c91565b611144565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613c7a565b611301565b6101b1610371366004613c7a565b6113d0565b6101b1610384366004613d93565b6113dc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611400565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061449f8339815191529184156104bd576104ba8285611414565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613e25565b600481111561050057610500613e25565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613e25565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206144bf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206144bf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846116b0565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613e25565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611724565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613e4d565b90506107ff8682611803565b5f61080b87858461184b565b5f8c815260058a01602052604090209091506108278282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613fd2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190614004565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206144df83398151915292919061093e90613e74565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613e25565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190614004565b505050565b610a5b81611a68565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b5f610acf64e8d4a51000836140b9565b92915050565b5f610adf82611b3b565b90505f5f8051602061449f833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610b7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614004565b9050610bbb83606001516001600160401b03168460400151611ec8565b50505050565b5f8051602061449f8339815191525f610bd984611edb565b90505f80610bea83604001516120bc565b5091509150610bf8856122f7565b5f8581526004850160205260408120610c1091613b71565b5f610c1a83611724565b9050816001600160401b031681608001516001600160401b03161015610c525760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c975760405162461bcd60e51b81526004016105d09061410e565b60015f87815260038701602052604090205460ff166004811115610cbd57610cbd613e25565b14610d265760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000614157565b5f610dd582611724565b60a0015192915050565b610de8816122f7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b8115610e5e57610e5c8382611414565b505b610a4d836123d0565b5f8051602061449f8339815191525f610e7f84611edb565b90505f80610e9083604001516120bc565b5091509150610e9e85611a68565b5f8581526005850160205260408120610eb691613b71565b5f610ec083611724565b9050816001600160401b031681608001516001600160401b03161015610ef85760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003808701602052604090912001546001600160401b0380841691161115610f365760405162461bcd60e51b81526004016105d09061410e565b60035f87815260038701602052604090205460ff166004811115610f5c57610f5c613e25565b14610fb05760405162461bcd60e51b815260206004820152603160248201525f805160206144bf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110549190611ec8565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa1580156110db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ff9190614004565b9050836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f805160206144df8339815191525f61115c83611edb565b90505f8061116d8360400151612788565b91509150806111cf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f828152600585016020526040812080546111e990613e74565b905011801561121b575060015f83815260078601602052604090205460ff16600581111561121957611219613e25565b145b6112375760405162461bcd60e51b81526004016105d09061416e565b5f828152600585016020526040812061124f91613b71565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144df83398151915292919061134990613e74565b905011801561137b575060015f83815260078301602052604090205460ff16600581111561137957611379613e25565b145b6113975760405162461bcd60e51b81526004016105d09061416e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b5f610acf823334612929565b5f806113e734612ce1565b90506113f585828686612d8b565b9150505b9392505050565b6114086131e0565b6114118161322b565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561145f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261148691908101906141d4565b91509150806114e95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561152c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190614004565b8251146115b45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561162a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611639846040015161326e565b915091508187146116a65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061451f8339815191526020526040812060030180545f805160206144df833981519152916001600160401b03909116908190846116f5836142a6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61172c613ba8565b5f8281525f8051602061451f8339815191526020526040908190208151610100810190925280545f805160206144df833981519152929190829060ff16600581111561177a5761177a613e25565b600581111561178b5761178b613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061451f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118c4576118848160016142cb565b61188f906008614157565b5081515f908390839081106118a6576118a66142de565b60200101906001600160f81b03191690815f1a905350600101611870565b505f5b6004811015611927576118db8160036142cb565b6118e6906008614157565b6001901c60f81b826118f98360026142f2565b81518110611909576119096142de565b60200101906001600160f81b03191690815f1a9053506001016118c7565b505f5b60208110156119895761193e81601f6142cb565b611949906008614157565b86901c60f81b8261195b8360066142f2565b8151811061196b5761196b6142de565b60200101906001600160f81b03191690815f1a90535060010161192a565b505f5b60088110156119f4576119a08160076142cb565b6119ab906008614157565b6001600160401b038616901c60f81b826119c68360266142f2565b815181106119d6576119d66142de565b60200101906001600160f81b03191690815f1a90535060010161198c565b505f5b6008811015611a5f57611a0b8160076142cb565b611a16906008614157565b6001600160401b038516901c60f81b82611a3183602e6142f2565b81518110611a4157611a416142de565b60200101906001600160f81b03191690815f1a9053506001016119f7565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061449f833981519152929190611ab090613e74565b9050118015611ae2575060035f83815260038301602052604090205460ff166004811115611ae057611ae0613e25565b145b611b375760405162461bcd60e51b815260206004820152603360248201525f805160206144bf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b611b43613ba8565b5f805160206144df8339815191525f611b5b84611edb565b90505f80611b6c8360400151612788565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c03613e25565b6005811115611c1457611c14613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b613e25565b1480611cb95750600182516005811115611cb757611cb7613e25565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611d2d57611d2d613e25565b03611d5457505f8381526006860160205260408120600491611d4f9190613b71565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d81613e25565b90816005811115611d9457611d94613e25565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc8613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e93613e25565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b376001600160a01b03821683613446565b60408051606080820183525f8083526020830181905292820152905f805160206144df8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7791908101906141d4565b9150915080611fde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b82548251146120415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b0316156120b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f83516036146120e05760405162461bcd60e51b81526004016105d090614305565b5f805b600281101561212f576120f78160016142cb565b612102906008614157565b61ffff16868281518110612118576121186142de565b016020015160f81c901b91909117906001016120e3565b5061ffff8116156121525760405162461bcd60e51b81526004016105d09061434e565b5f805b60048110156121ad576121698160036142cb565b612174906008614157565b63ffffffff16876121868360026142f2565b81518110612196576121966142de565b016020015160f81c901b9190911790600101612155565b5063ffffffff81166003146121d45760405162461bcd60e51b81526004016105d090614391565b5f805b6020811015612229576121eb81601f6142cb565b6121f6906008614157565b886122028360066142f2565b81518110612212576122126142de565b016020015160f81c901b91909117906001016121d7565b505f805b6008811015612288576122418160076142cb565b61224c906008614157565b6001600160401b0316896122618360266142f2565b81518110612271576122716142de565b016020015160f81c901b919091179060010161222d565b505f805b60088110156122e7576122a08160076142cb565b6122ab906008614157565b6001600160401b03168a6122c083602e6142f2565b815181106122d0576122d06142de565b016020015160f81c901b919091179060010161228c565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061449f83398151915292919061233f90613e74565b9050118015612371575060015f83815260038301602052604090205460ff16600481111561236f5761236f613e25565b145b611b375760405162461bcd60e51b815260206004820152603860248201525f805160206144bf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061451f83398151915260205260408082208151610100810190925280545f805160206144df83398151915293929190829060ff16600581111561241e5761241e613e25565b600581111561242f5761242f613e25565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b7576124b7613e25565b146125135760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461258d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b61259a8160a001516134d9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125de576125de613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126aa846126a4816116b0565b5f61184b565b5f85815260068501602052604090209091506126c68282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f3908590600401613fd2565b6020604051808303815f875af115801561270f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127339190614004565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146127ab5760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156127fa576127c28160016142cb565b6127cd906008614157565b61ffff168582815181106127e3576127e36142de565b016020015160f81c901b91909117906001016127ae565b5061ffff81161561281d5760405162461bcd60e51b81526004016105d09061434e565b5f805b6004811015612878576128348160036142cb565b61283f906008614157565b63ffffffff16866128518360026142f2565b81518110612861576128616142de565b016020015160f81c901b9190911790600101612820565b5063ffffffff811660021461289f5760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156128f4576128b681601f6142cb565b6128c1906008614157565b876128cd8360066142f2565b815181106128dd576128dd6142de565b016020015160f81c901b91909117906001016128a2565b505f86602681518110612909576129096142de565b016020015191976001600160f81b03199092161515965090945050505050565b5f61293261367a565b5f61293c83610abf565b90505f8051602061449f8339815191525f61295687611724565b905060028151600581111561296d5761296d613e25565b146129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516129dd91906143d8565b90506129e98882611803565b5f6129f3896116b0565b90505f898983604051602001612a3b9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a5c866134d9565b5f612a688b848661184b565b5f8381526004880160205260409020909150612a848282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab1908590600401613fd2565b6020604051808303815f875af1158015612acd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af19190614004565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba057612ba0613e25565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506113f960015f805160206144ff83398151915255565b5f5f8051602061449f8339815191528282612cfb82610abf565b83549091506001600160401b03821610801590612d2557508260010154816001600160401b031611155b612d835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612d9461367a565b5f805160206144df833981519152426001600160401b038516118015612dce57506001600160401b038416612dcc426202a3006142f2565b115b612e305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612e875760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ef55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612f5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612f65856134d9565b5f80612fac6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136c4565b5f82815260058601602052604090209193509150612fca8282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ff7908590600401613fd2565b6020604051808303815f875af1158015613013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130379190614004565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156130b9576130b9613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561317a836116b0565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612d8360015f805160206144ff83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322957604051631afcd79f60e31b815260040160405180910390fd5b565b6132336131e0565b61323c81613a69565b6114116060820135608083013561325960c0850160a08601613ce8565b61326960e0860160c087016143f8565b613a8a565b5f808251602e146132915760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156132e0576132a88160016142cb565b6132b3906008614157565b61ffff168582815181106132c9576132c96142de565b016020015160f81c901b9190911790600101613294565b5061ffff8116156133035760405162461bcd60e51b81526004016105d09061434e565b5f805b600481101561335e5761331a8160036142cb565b613325906008614157565b63ffffffff16866133378360026142f2565b81518110613347576133476142de565b016020015160f81c901b9190911790600101613306565b5063ffffffff81166004146133855760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156133da5761339c81601f6142cb565b6133a7906008614157565b876133b38360066142f2565b815181106133c3576133c36142de565b016020015160f81c901b9190911790600101613388565b505f805b6008811015613439576133f28160076142cb565b6133fd906008614157565b6001600160401b0316886134128360266142f2565b81518110613422576134226142de565b016020015160f81c901b91909117906001016133de565b5090969095509350505050565b804710156134695760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134b2576040519150601f19603f3d011682016040523d82523d5f602084013e6134b7565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144df8339815191529060ff165f03613517575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061355f90836142cb565b1061357b576001600160401b038416604083015280825261359a565b838260400181815161358d91906143d8565b6001600160401b03169052505b5f8260200151836040015160646135b19190614413565b6135bb919061443e565b600285015490915060ff90811690821611156136365760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206144ff8339815191528054600119016136ab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144ff83398151915255565b5f606082608001515160301461372e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137a5576137658160016142cb565b613770906008614157565b5081515f90839083908110613787576137876142de565b60200101906001600160f81b03191690815f1a905350600101613751565b505f5b6004811015613803576137bc8160036142cb565b6137c7906008614157565b505f826137d58360026142f2565b815181106137e5576137e56142de565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b60208110156138605784518160208110613822576138226142de565b1a60f81b826138328360066142f2565b81518110613842576138426142de565b60200101906001600160f81b03191690815f1a905350600101613806565b505f5b60208110156138c05784602001518160208110613882576138826142de565b1a60f81b826138928360266142f2565b815181106138a2576138a26142de565b60200101906001600160f81b03191690815f1a905350600101613863565b505f5b6008811015613934576138d78160076142cb565b6138e2906008614157565b60ff1685604001516001600160401b0316901c60f81b8282604661390691906142f2565b81518110613916576139166142de565b60200101906001600160f81b03191690815f1a9053506001016138c3565b505f5b603081101561399f5784608001518181518110613956576139566142de565b01602001516001600160f81b0319168261397183604e6142f2565b81518110613981576139816142de565b60200101906001600160f81b03191690815f1a905350600101613937565b505f5b6008811015613a11576139b68160076142cb565b6139c1906008614157565b60608601516001600160401b0390811691161c60f81b826139e383607e6142f2565b815181106139f3576139f36142de565b60200101906001600160f81b03191690815f1a9053506001016139a2565b50600281604051613a229190614463565b602060405180830381855afa158015613a3d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a609190614004565b94909350915050565b613a716131e0565b613a79613ae5565b613a81613af5565b61141181613afd565b613a926131e0565b5f5f8051602061449f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613aed6131e0565b613229613b69565b6132296131e0565b613b056131e0565b80355f805160206144df83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161447e565b600291909101805460ff191660ff90921691909117905550565b6136b16131e0565b508054613b7d90613e74565b5f825580601f10613b8c575050565b601f0160209004905f5260205f20908101906114119190613bec565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c00575f8155600101613bed565b5090565b5f60e08284031215613c14575f80fd5b50919050565b8015158114611411575f80fd5b803563ffffffff81168114613c3a575f80fd5b919050565b5f805f60608486031215613c51575f80fd5b833592506020840135613c6381613c1a565b9150613c7160408501613c27565b90509250925092565b5f60208284031215613c8a575f80fd5b5035919050565b5f60208284031215613ca1575f80fd5b6113f982613c27565b5f8060408385031215613cbb575f80fd5b613cc483613c27565b946020939093013593505050565b80356001600160401b0381168114613c3a575f80fd5b5f60208284031215613cf8575f80fd5b6113f982613cd2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d3757613d37613d01565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d6557613d65613d01565b604052919050565b5f6001600160401b03821115613d8557613d85613d01565b50601f01601f191660200190565b5f805f60608486031215613da5575f80fd5b83359250613db560208501613cd2565b915060408401356001600160401b03811115613dcf575f80fd5b8401601f81018613613ddf575f80fd5b8035613df2613ded82613d6d565b613d3d565b818152876020838501011115613e06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e6d57613e6d613e39565b5092915050565b600181811c90821680613e8857607f821691505b602082108103613c1457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613ecb5750805b601f840160051c820191505b81811015613eea575f8155600101613ed7565b5050505050565b81516001600160401b03811115613f0a57613f0a613d01565b613f1e81613f188454613e74565b84613ea6565b602080601f831160018114613f51575f8415613f3a5750858301515b5f19600386901b1c1916600185901b178555613fa8565b5f85815260208120601f198616915b82811015613f7f57888601518255948401946001909101908401613f60565b5085821015613f9c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613fca578181015183820152602001613fb2565b50505f910152565b602081525f8251806020840152613ff0816040850160208701613fb0565b601f01601f19169190910160400192915050565b5f60208284031215614014575f80fd5b5051919050565b5f60208083525f845461402d81613e74565b806020870152604060018084165f811461404e576001811461406a57614097565b60ff19851660408a0152604084151560051b8a01019550614097565b895f5260205f205f5b8581101561408e5781548b8201860152908301908801614073565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826140c7576140c76140a5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613e39565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611411575f80fd5b8051613c3a81613c1a565b5f80604083850312156141e5575f80fd5b82516001600160401b03808211156141fb575f80fd5b908401906060828703121561420e575f80fd5b614216613d15565b82518152602080840151614229816141b5565b8282015260408401518381111561423e575f80fd5b80850194505087601f850112614252575f80fd5b83519250614262613ded84613d6d565b8381528882858701011115614275575f80fd5b61428484838301848801613fb0565b806040840152508195506142998188016141c9565b9450505050509250929050565b5f6001600160401b038083168181036142c1576142c1613e39565b6001019392505050565b81810381811115610acf57610acf613e39565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613e39565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613e6d57613e6d613e39565b5f60208284031215614408575f80fd5b81356113f9816141b5565b6001600160401b0381811683821602808216919082811461443657614436613e39565b505092915050565b5f6001600160401b0380841680614457576144576140a5565b92169190910492915050565b5f8251614474818460208701613fb0565b9190910192915050565b5f6020828403121561448e575f80fd5b813560ff811681146113f9575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 046dce5c1..27145e00f 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -123,4 +123,9 @@ contract ERC20TokenStakingManager is function _unlock(uint256 value, address to) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } + + function _reward(address account, uint256 amount) internal virtual override { + ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); + $._token.mint(account, amount); + } } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 8763d0e7f..9b1443a84 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -82,4 +82,9 @@ contract NativeTokenStakingManager is function _unlock(uint256 value, address to) internal virtual override { payable(to).sendValue(value); } + + // solhint-disable-next-line no-empty-blocks + function _reward(address account, uint256 amount) internal virtual override { + // TODO: call the native minter precompile to mint `amount` for `account` + } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 20e61e03a..302c1da6d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -98,6 +98,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function completeEndValidation(uint32 messageIndex) external { Validator memory validator = _completeEndValidation(messageIndex); + + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + uint256 rewardAmount = $._rewardCalculator.calculateReward( + validator.weight, validator.startedAt, validator.endedAt, 0, 0 + ); + + _reward(validator.owner, rewardAmount); + _unlock(validator.startingWeight, validator.owner); } @@ -356,7 +364,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Delegator memory delegator = $._delegatorStakes[delegationID]; _unlock(delegator.weight, delegator.owner); - // TODO: issue rewards + + uint256 rewardAmount = $._rewardCalculator.calculateReward( + delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 + ); + _reward(delegator.owner, rewardAmount); emit DelegationEnded(delegationID, validationID, nonce); } @@ -378,4 +390,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: delegation registration not pending" ); } + + function _reward(address account, uint256 amount) internal virtual; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index ea5ddebdb..b6970f91e 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -9,7 +9,7 @@ import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.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"; @@ -23,11 +23,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ERC20TokenStakingManager public app; IERC20Mintable public token; + ExampleRewardCalculator public rewardCalculator; function setUp() public virtual { // Construct the object under test app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -38,7 +40,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: rewardCalculator }), token ); @@ -84,6 +86,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } + function _expectRewardIssuance(address account, uint256 amount) internal override { + vm.expectCall(address(token), abi.encodeCall(IERC20Mintable.mint, (account, amount))); + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return token.balanceOf(account); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 467ed85f8..536e299a5 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -10,6 +10,7 @@ import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; // TODO: Remove this once all unit tests implemented @@ -30,13 +31,25 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: IRewardCalculator(new ExampleRewardCalculator(DEFAULT_REWARD_RATE)) }) ); validatorManager = app; posValidatorManager = app; } + function testCompleteEndValidation() public override { + // TODO: get native token staking rewards working, then remove this + // method and let the implementation in PosValidatorManagerTests do the + // test, and remove the `virtual` modifier from that implementation. + } + + function testCompleteEndDelegation() public override { + // TODO: get native token staking rewards working, then remove this + // method and let the implementation in PosValidatorManagerTests do the + // test, and remove the `virtual` modifier from that implementation. + } + // Helpers function _initializeValidatorRegistration( bytes32 nodeID, @@ -69,6 +82,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } + function _expectRewardIssuance(address account, uint256 amount) internal override {} + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 5e99fa2bc..7629c6343 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -21,6 +21,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = uint64(4000); address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + uint64 public constant DEFAULT_REWARD_RATE = uint64(10); PoSValidatorManager public posValidatorManager; @@ -371,14 +372,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.resendEndDelegation(delegationID); } - function testCompleteEndDelegation() public { + function testCompleteEndDelegation() public virtual { + uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + + uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, + registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + registrationTimestamp: uint64(registrationExpiry) }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, @@ -388,32 +393,34 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpCompleteDelegatorRegistration({ + validationID: validationID, + delegationID: delegationID, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); _setUpInitializeEndDelegation({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, - endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + endDelegationTimestamp: uint64(registrationExpiry), expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); address delegator = DEFAULT_DELEGATOR_ADDRESS; uint256 balanceBefore = _getStakeAssetBalance(delegator); + uint256 expectedReward = DEFAULT_DELEGATOR_WEIGHT * DEFAULT_REWARD_RATE / 365; _expectStakeUnlock(delegator, DEFAULT_DELEGATOR_WEIGHT); + _expectRewardIssuance(delegator, expectedReward); _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; require( - balanceChange >= DEFAULT_DELEGATOR_WEIGHT, - "delegator should have received their stake back" + balanceChange == DEFAULT_DELEGATOR_WEIGHT + expectedReward, + "delegator should have received their stake back and been rewarded" ); } @@ -557,25 +564,35 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } - function testCompleteEndValidation() public override { + function testCompleteEndValidation() public virtual override { + uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + + uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, + registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: uint64(registrationExpiry) }); uint256 balanceBefore = _getStakeAssetBalance(address(this)); + uint256 expectedReward = DEFAULT_WEIGHT * DEFAULT_REWARD_RATE / 365 - 1; + _expectStakeUnlock(address(this), DEFAULT_WEIGHT); + _expectRewardIssuance(address(this), expectedReward); _testCompleteEndValidation(validationID); uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; - require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); + require( + balanceChange == DEFAULT_WEIGHT + expectedReward, + "validator should have received their stake back and been rewarded" + ); } function testValueToWeight() public view { @@ -713,6 +730,7 @@ 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 _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 2b91a7405..a4cbc1338 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -16,7 +16,7 @@ export ARCH=$(uname -m) [ $ARCH = x86_64 ] && ARCH=amd64 echo "ARCH set to $ARCH" -DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" +DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 ExampleRewardCalculator TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" diff --git a/tests/flows/governance/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go index 8a3d60960..2901f1f9b 100644 --- a/tests/flows/governance/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -85,7 +85,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a ValidatorSetSig message with mock ERC20 as the target contract // and mint 100 tokens as the TxPayload - callData, err := erc20ABI.Pack("mint", big.NewInt(100)) + callData, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(100)) Expect(err).Should(BeNil()) vssMessage1 := validatorsetsig.ValidatorSetSigMessage{ @@ -99,7 +99,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a second ValidatorSetSig message with mock ERC20 as the target contract // and mint 50 tokens as the TxPayload - callData2, err := erc20ABI.Pack("mint", big.NewInt(50)) + callData2, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(50)) Expect(err).Should(BeNil()) vssMessage2 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress, @@ -111,13 +111,18 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { } // Create a message for the case where validatorSetSig contract and targetContract are on the same chain. + // Construct a ValidatorSetSig message with mock ERC20 as the target contract + // and mint 100 tokens as the TxPayload + callData3, err := erc20ABI.Pack("mint", validatorSetSigContractAddress2, big.NewInt(100)) + Expect(err).Should(BeNil()) + vssMessage3 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress2, TargetContractAddress: exampleERC20ContractAddressB, TargetBlockchainID: subnetB.BlockchainID, Nonce: big.NewInt(0), Value: big.NewInt(0), - Payload: callData, + Payload: callData3, } // Create chain config file with off-chain validatorsetsig message diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 367121ca0..2280e8e38 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -12,7 +12,6 @@ import ( poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" . "github.com/onsi/gomega" @@ -143,6 +142,13 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) + rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( + ctx, + fundedKey, + subnetAInfo, + uint64(10), + ) + tx, err = posValidatorManager.Initialize( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ @@ -154,7 +160,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 31dde39f1..6a543aa2b 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -18,6 +18,7 @@ import ( predicateutils "github.com/ava-labs/subnet-evm/predicate" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/ERC20TokenStakingManager" + examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/staking/ExampleRewardCalculator" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" @@ -61,6 +62,12 @@ func DeployAndInitializeNativeTokenStakingManager( senderKey, subnet, ) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -74,7 +81,7 @@ func DeployAndInitializeNativeTokenStakingManager( MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) @@ -121,6 +128,12 @@ func DeployAndInitializeERC20TokenStakingManager( ) erc20Address, erc20 := DeployExampleERC20(ctx, senderKey, subnet) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -134,7 +147,7 @@ func DeployAndInitializeERC20TokenStakingManager( MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, erc20Address, ) @@ -193,6 +206,27 @@ func DeployAndInitializePoAValidatorManager( return validatorManagerAddress, validatorManager } +func DeployExampleRewardCalculator( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + rewardBasisPoints uint64, +) (common.Address, *examplerewardcalculator.ExampleRewardCalculator) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, calculator, err := examplerewardcalculator.DeployExampleRewardCalculator( + opts, + subnet.RPCClient, + rewardBasisPoints, + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, calculator +} + // // Function call utils // From f45cce738e2c16f9e80b95a9d73fd07de1cb6fba Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Tue, 10 Sep 2024 21:35:06 +0000 Subject: [PATCH 03/36] mint(addr,amount): respect _MAX_MINT addresses review comment https://github.com/ava-labs/teleporter/pull/534#discussion_r1752539780 --- abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go | 2 +- contracts/mocks/ExampleERC20.sol | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index fe803b2d1..f3b31c597 100644 --- a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go +++ b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go @@ -32,7 +32,7 @@ var ( // ExampleERC20MetaData contains all meta data concerning the ExampleERC20 contract. var ExampleERC20MetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC20InsufficientAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InsufficientBalance\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSpender\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108698061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e491906106d5565b60405180910390f35b6101006100fb36600461073c565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610764565b6102b6565b604051601281526020016100e4565b61015761015236600461073c565b6102d9565b005b61015761016736600461079d565b6102e7565b61011461017a3660046107b4565b6001600160a01b03165f9081526020819052604090205490565b6101576101a236600461073c565b6102f4565b6100d7610309565b6101576101bd36600461079d565b610318565b6101006101d036600461073c565b61037e565b6101146101e33660046107d4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c90610805565b80601f016020809104026020016040519081016040528092919081815260200182805461024890610805565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa81858561038b565b60019150505b92915050565b5f336102c385828561039d565b6102ce858585610418565b506001949350505050565b6102e38282610475565b5050565b6102f133826104a9565b50565b6102ff82338361039d565b6102e382826104a9565b60606004805461021c90610805565b662386f26fc100008111156103745760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b6102f13382610475565b5f336102aa818585610418565b61039883838360016104dd565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610412578181101561040457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161036b565b61041284848484035f6104dd565b50505050565b6001600160a01b03831661044157604051634b637e8f60e11b81525f600482015260240161036b565b6001600160a01b03821661046a5760405163ec442f0560e01b81525f600482015260240161036b565b6103988383836105af565b6001600160a01b03821661049e5760405163ec442f0560e01b81525f600482015260240161036b565b6102e35f83836105af565b6001600160a01b0382166104d257604051634b637e8f60e11b81525f600482015260240161036b565b6102e3825f836105af565b6001600160a01b0384166105065760405163e602df0560e01b81525f600482015260240161036b565b6001600160a01b03831661052f57604051634a1406b160e11b81525f600482015260240161036b565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561041257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a191815260200190565b60405180910390a350505050565b6001600160a01b0383166105d9578060025f8282546105ce919061083d565b909155506106499050565b6001600160a01b0383165f908152602081905260409020548181101561062b5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161036b565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661066557600280548290039055610683565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106c891815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015610701578581018301518582016040015282016106e5565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610737575f80fd5b919050565b5f806040838503121561074d575f80fd5b61075683610721565b946020939093013593505050565b5f805f60608486031215610776575f80fd5b61077f84610721565b925061078d60208501610721565b9150604084013590509250925092565b5f602082840312156107ad575f80fd5b5035919050565b5f602082840312156107c4575f80fd5b6107cd82610721565b9392505050565b5f80604083850312156107e5575f80fd5b6107ee83610721565b91506107fc60208401610721565b90509250929050565b600181811c9082168061081957607f821691505b60208210810361083757634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c08061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072c565b60405180910390f35b6101006100fb366004610793565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bb565b6102b6565b604051601281526020016100e4565b610157610152366004610793565b6102d9565b005b6101576101673660046107f4565b610343565b61011461017a36600461080b565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610793565b610350565b6100d7610365565b6101576101bd3660046107f4565b610374565b6101006101d0366004610793565b6103d5565b6101146101e336600461082b565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085c565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085c565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e2565b60019150505b92915050565b5f336102c38582856103f4565b6102ce85858561046f565b506001949350505050565b662386f26fc100008111156103355760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61033f82826104cc565b5050565b61034d3382610500565b50565b61035b8233836103f4565b61033f8282610500565b60606004805461021c9061085c565b662386f26fc100008111156103cb5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032c565b61034d33826104cc565b5f336102aa81858561046f565b6103ef8383836001610534565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610469578181101561045b57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032c565b61046984848484035f610534565b50505050565b6001600160a01b03831661049857604051634b637e8f60e11b81525f600482015260240161032c565b6001600160a01b0382166104c15760405163ec442f0560e01b81525f600482015260240161032c565b6103ef838383610606565b6001600160a01b0382166104f55760405163ec442f0560e01b81525f600482015260240161032c565b61033f5f8383610606565b6001600160a01b03821661052957604051634b637e8f60e11b81525f600482015260240161032c565b61033f825f83610606565b6001600160a01b03841661055d5760405163e602df0560e01b81525f600482015260240161032c565b6001600160a01b03831661058657604051634a1406b160e11b81525f600482015260240161032c565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105f891815260200190565b60405180910390a350505050565b6001600160a01b038316610630578060025f8282546106259190610894565b909155506106a09050565b6001600160a01b0383165f90815260208190526040902054818110156106825760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106bc576002805482900390556106da565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071f91815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156107585785810183015185820160400152820161073c565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461078e575f80fd5b919050565b5f80604083850312156107a4575f80fd5b6107ad83610778565b946020939093013593505050565b5f805f606084860312156107cd575f80fd5b6107d684610778565b92506107e460208501610778565b9150604084013590509250925092565b5f60208284031215610804575f80fd5b5035919050565b5f6020828403121561081b575f80fd5b61082482610778565b9392505050565b5f806040838503121561083c575f80fd5b61084583610778565b915061085360208401610778565b90509250929050565b600181811c9082168061087057607f821691505b60208210810361088e57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index 9f6d137a7..a17f2f49d 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -33,6 +33,9 @@ contract ExampleERC20 is ERC20Burnable, IERC20Mintable { } function mint(address account, uint256 amount) external { + // Can only mint 10 at a time. + require(amount <= _MAX_MINT, "ExampleERC20: max mint exceeded"); + _mint(account, amount); } } From 57a519e728da4431a644ebd148f588bad396ad9e Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 11 Sep 2024 00:05:36 +0000 Subject: [PATCH 04/36] incorporate uptime in rewards --- .../ERC20TokenStakingManager.go | 2 +- .../ExampleRewardCalculator.go | 28 +++++------ .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- contracts/staking/ExampleRewardCalculator.sol | 5 +- contracts/staking/PoSValidatorManager.sol | 33 ++++++------ contracts/staking/ValidatorManager.sol | 8 ++- .../staking/interfaces/IRewardCalculator.sol | 3 +- .../tests/ExamplesRewardCalculatorTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 50 +++++++++++++++++-- .../staking/tests/ValidatorManagerTests.t.sol | 39 +++++++++++++-- 11 files changed, 130 insertions(+), 44 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index c15551c16..f3eab1c63 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614ada380380614ada83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61498d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fd9565b6102d6565b005b610128610138366004614014565b610761565b61017b61014b366004614014565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004614014565b6108bd565b6101286101af36600461403f565b61092a565b6101c76101c2366004614014565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed36600461407c565b610a24565b610128610200366004614095565b610b1e565b61017b6102133660046140d3565b610d0f565b6101c7610226366004614014565b610d28565b610128610239366004614014565b610d3c565b61012861024c366004613fd9565b610da9565b61017b61025f36600461417e565b610dc4565b610128610272366004614095565b610de9565b61017b61028536600461421a565b6110d4565b61012861029836600461407c565b6110e7565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004614014565b6112a4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206148e1833981519152918415610328576103258285611373565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a61423a565b600481111561036b5761036b61423a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f261423a565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461160f565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105005761050061423a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611683565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614262565b905061066a8682611762565b5f6106768785846117aa565b5f8c815260058a0160205260409020909150610692828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016143ed565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061441f565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149218339815191529291906107a990614289565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d961423a565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061441f565b505050565b6108c6816119c7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611a9a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a51000836144d4565b92915050565b5f610a2e82611ab4565b90505f5f805160206148e1833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610ac9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aed919061441f565b9050610afd836040015182611e41565b610b1883606001516001600160401b03168460400151611eb7565b50505050565b5f805160206148e18339815191525f610b3684611eda565b90505f80610b4783604001516120bb565b5091509150610b55856122f6565b5f8581526004850160205260408120610b6d91613f21565b5f610b7783611683565b9050816001600160401b031681608001516001600160401b03161015610baf5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bf45760405162461bcd60e51b815260040161043b90614529565b60015f87815260038701602052604090205460ff166004811115610c1a57610c1a61423a565b14610c835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614572565b5f610d3282611683565b60a0015192915050565b610d45816122f6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b8115610dbb57610db98382611373565b505b6108b8836123cf565b5f80610dcf86612787565b9050610ddd85828686612834565b9150505b949350505050565b5f805160206148e18339815191525f610e0184611eda565b90505f80610e1283604001516120bb565b5091509150610e20856119c7565b5f8581526005850160205260408120610e3891613f21565b5f610e4283611683565b9050816001600160401b031681608001516001600160401b03161015610e7a5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003808701602052604090912001546001600160401b0380841691161115610eb85760405162461bcd60e51b815260040161043b90614529565b60035f87815260038701602052604090205460ff166004811115610ede57610ede61423a565b14610f325760405162461bcd60e51b815260206004820152603160248201525f805160206149018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610fd69190611eb7565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561105d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611081919061441f565b9050611091826020015182611e41565b836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f6110e0833384612c89565b9392505050565b5f805160206149218339815191525f6110ff83611eda565b90505f806111108360400151613044565b91509150806111725760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526005850160205260408120805461118c90614289565b90501180156111be575060015f83815260078601602052604090205460ff1660058111156111bc576111bc61423a565b145b6111da5760405162461bcd60e51b815260040161043b90614589565b5f82815260058501602052604081206111f291613f21565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149218339815191529291906112ec90614289565b905011801561131e575060015f83815260078301602052604090205460ff16600581111561131c5761131c61423a565b145b61133a5760405162461bcd60e51b815260040161043b90614589565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113e591908101906145db565b91509150806114485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114af919061441f565b8251146115135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156115895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061159884604001516131e5565b915091508187146116055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149618339815191526020526040812060030180545f80516020614921833981519152916001600160401b0390911690819084611654836146ad565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61168b613f58565b5f8281525f805160206149618339815191526020526040908190208151610100810190925280545f80516020614921833981519152929190829060ff1660058111156116d9576116d961423a565b60058111156116ea576116ea61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614961833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611823576117e38160016146d2565b6117ee906008614572565b5081515f90839083908110611805576118056146e5565b60200101906001600160f81b03191690815f1a9053506001016117cf565b505f5b60048110156118865761183a8160036146d2565b611845906008614572565b6001901c60f81b826118588360026146f9565b81518110611868576118686146e5565b60200101906001600160f81b03191690815f1a905350600101611826565b505f5b60208110156118e85761189d81601f6146d2565b6118a8906008614572565b86901c60f81b826118ba8360066146f9565b815181106118ca576118ca6146e5565b60200101906001600160f81b03191690815f1a905350600101611889565b505f5b6008811015611953576118ff8160076146d2565b61190a906008614572565b6001600160401b038616901c60f81b826119258360266146f9565b81518110611935576119356146e5565b60200101906001600160f81b03191690815f1a9053506001016118eb565b505f5b60088110156119be5761196a8160076146d2565b611975906008614572565b6001600160401b038516901c60f81b8261199083602e6146f9565b815181106119a0576119a06146e5565b60200101906001600160f81b03191690815f1a905350600101611956565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206148e1833981519152929190611a0f90614289565b9050118015611a41575060035f83815260038301602052604090205460ff166004811115611a3f57611a3f61423a565b145b611a965760405162461bcd60e51b815260206004820152603360248201525f8051602061490183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611aa26133bd565b611aab82613408565b611a968161344e565b611abc613f58565b5f805160206149218339815191525f611ad484611eda565b90505f80611ae58360400151613044565b915091508015611b4a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611b7c57611b7c61423a565b6005811115611b8d57611b8d61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c1457611c1461423a565b1480611c325750600182516005811115611c3057611c3061423a565b145b611c915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611ca657611ca661423a565b03611ccd57505f8381526006860160205260408120600491611cc89190613f21565b611cd1565b5060055b6020808301515f90815260088801909152604081205581816005811115611cfa57611cfa61423a565b90816005811115611d0d57611d0d61423a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611d4157611d4161423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e0c57611e0c61423a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206148c183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611e9c575f80fd5b505af1158015611eae573d5f803e3d5ffd5b50505050505050565b5f805160206148c183398151915254611a96906001600160a01b031682846134ef565b60408051606080820183525f8083526020830181905292820152905f805160206149218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f4f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7691908101906145db565b9150915080611fdd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b82548251146120405760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b0316156120b35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f83516036146120df5760405162461bcd60e51b815260040161043b9061470c565b5f805b600281101561212e576120f68160016146d2565b612101906008614572565b61ffff16868281518110612117576121176146e5565b016020015160f81c901b91909117906001016120e2565b5061ffff8116156121515760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156121ac576121688160036146d2565b612173906008614572565b63ffffffff16876121858360026146f9565b81518110612195576121956146e5565b016020015160f81c901b9190911790600101612154565b5063ffffffff81166003146121d35760405162461bcd60e51b815260040161043b90614798565b5f805b6020811015612228576121ea81601f6146d2565b6121f5906008614572565b886122018360066146f9565b81518110612211576122116146e5565b016020015160f81c901b91909117906001016121d6565b505f805b6008811015612287576122408160076146d2565b61224b906008614572565b6001600160401b0316896122608360266146f9565b81518110612270576122706146e5565b016020015160f81c901b919091179060010161222c565b505f805b60088110156122e65761229f8160076146d2565b6122aa906008614572565b6001600160401b03168a6122bf83602e6146f9565b815181106122cf576122cf6146e5565b016020015160f81c901b919091179060010161228b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206148e183398151915292919061233e90614289565b9050118015612370575060015f83815260038301602052604090205460ff16600481111561236e5761236e61423a565b145b611a965760405162461bcd60e51b815260206004820152603860248201525f8051602061490183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061496183398151915260205260408082208151610100810190925280545f8051602061492183398151915293929190829060ff16600581111561241d5761241d61423a565b600581111561242e5761242e61423a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b6576124b661423a565b146125125760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461258c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6125998160a0015161354e565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125dd576125dd61423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126a9846126a38161160f565b5f6117aa565b5f85815260068501602052604090209091506126c5828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f29085906004016143ed565b6020604051808303815f875af115801561270e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612732919061441f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206148e1833981519152816127a0846136ef565b90505f6127ac82610a0e565b83549091506001600160401b038216108015906127d657508260010154816001600160401b031611155b610de15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61283d613712565b5f80516020614921833981519152426001600160401b03851611801561287757506001600160401b038416612875426202a3006146f9565b115b6128d95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856129305760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561299e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b612a0e8561354e565b5f80612a556040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613749565b5f82815260058601602052604090209193509150612a73828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612aa09085906004016143ed565b6020604051808303815f875af1158015612abc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae0919061441f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612b6257612b6261423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612c238361160f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610de160015f8051602061494183398151915255565b5f612c92613712565b5f612c9f6101c2846136ef565b90505f805160206148e18339815191525f612cb987611683565b9050600281516005811115612cd057612cd061423a565b14612d2f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612d4091906147df565b9050612d4c8882611762565b5f612d568961160f565b90505f898983604051602001612d9e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612dbf8661354e565b5f612dcb8b84866117aa565b5f8381526004880160205260409020909150612de7828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e149085906004016143ed565b6020604051808303815f875af1158015612e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e54919061441f565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f0357612f0361423a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506110e060015f8051602061494183398151915255565b5f8082516027146130675760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156130b65761307e8160016146d2565b613089906008614572565b61ffff1685828151811061309f5761309f6146e5565b016020015160f81c901b919091179060010161306a565b5061ffff8116156130d95760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015613134576130f08160036146d2565b6130fb906008614572565b63ffffffff168661310d8360026146f9565b8151811061311d5761311d6146e5565b016020015160f81c901b91909117906001016130dc565b5063ffffffff811660021461315b5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156131b05761317281601f6146d2565b61317d906008614572565b876131898360066146f9565b81518110613199576131996146e5565b016020015160f81c901b919091179060010161315e565b505f866026815181106131c5576131c56146e5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132085760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156132575761321f8160016146d2565b61322a906008614572565b61ffff16858281518110613240576132406146e5565b016020015160f81c901b919091179060010161320b565b5061ffff81161561327a5760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156132d5576132918160036146d2565b61329c906008614572565b63ffffffff16866132ae8360026146f9565b815181106132be576132be6146e5565b016020015160f81c901b919091179060010161327d565b5063ffffffff81166004146132fc5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156133515761331381601f6146d2565b61331e906008614572565b8761332a8360066146f9565b8151811061333a5761333a6146e5565b016020015160f81c901b91909117906001016132ff565b505f805b60088110156133b0576133698160076146d2565b613374906008614572565b6001600160401b0316886133898360266146f9565b81518110613399576133996146e5565b016020015160f81c901b9190911790600101613355565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661340657604051631afcd79f60e31b815260040160405180910390fd5b565b6134106133bd565b61341981613b01565b61344b6060820135608083013561343660c0850160a086016140d3565b61344660e0860160c087016147ff565b613b22565b50565b6134566133bd565b5f805160206148c18339815191526001600160a01b0382166134cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613b7d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149218339815191529060ff165f0361358c575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135d490836146d2565b106135f0576001600160401b038416604083015280825261360f565b838260400181815161360291906147df565b6001600160401b03169052505b5f826020015183604001516064613626919061481a565b6136309190614845565b600285015490915060ff90811690821611156136ab5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e825f805160206148c1833981519152546001600160a01b031690613bde565b5f8051602061494183398151915280546001190161374357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137b35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561382a576137ea8160016146d2565b6137f5906008614572565b5081515f9083908390811061380c5761380c6146e5565b60200101906001600160f81b03191690815f1a9053506001016137d6565b505f5b6004811015613888576138418160036146d2565b61384c906008614572565b505f8261385a8360026146f9565b8151811061386a5761386a6146e5565b60200101906001600160f81b03191690815f1a90535060010161382d565b505f5b60208110156138e557845181602081106138a7576138a76146e5565b1a60f81b826138b78360066146f9565b815181106138c7576138c76146e5565b60200101906001600160f81b03191690815f1a90535060010161388b565b505f5b60208110156139455784602001518160208110613907576139076146e5565b1a60f81b826139178360266146f9565b81518110613927576139276146e5565b60200101906001600160f81b03191690815f1a9053506001016138e8565b505f5b60088110156139b95761395c8160076146d2565b613967906008614572565b60ff1685604001516001600160401b0316901c60f81b8282604661398b91906146f9565b8151811061399b5761399b6146e5565b60200101906001600160f81b03191690815f1a905350600101613948565b505f5b6030811015613a2457846080015181815181106139db576139db6146e5565b01602001516001600160f81b031916826139f683604e6146f9565b81518110613a0657613a066146e5565b60200101906001600160f81b03191690815f1a9053506001016139bc565b505f5b6008811015613a9657613a3b8160076146d2565b613a46906008614572565b60608601516001600160401b0390811691161c60f81b82613a6883607e6146f9565b81518110613a7857613a786146e5565b60200101906001600160f81b03191690815f1a905350600101613a27565b50600281604051613aa7919061486a565b602060405180830381855afa158015613ac2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ae5919061441f565b94909350915050565b60015f8051602061494183398151915255565b613b096133bd565b613b11613d40565b613b19613d50565b61344b81613d58565b613b2a6133bd565b5f5f805160206148e1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613b916001600160a01b03841683613dc4565b905080515f14158015613bb5575080806020019051810190613bb39190614885565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c48919061441f565b9050613c5f6001600160a01b038516333086613dd1565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc7919061441f565b9050818111613d2d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613d3782826146d2565b95945050505050565b613d486133bd565b613406613e0a565b6134066133bd565b613d606133bd565b80355f8051602061492183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613daa60608301604084016148a0565b600291909101805460ff191660ff90921691909117905550565b60606110e083835f613e12565b6040516001600160a01b038481166024830152838116604483015260648201839052610b189186918216906323b872dd9060840161351c565b613aee6133bd565b606081471015613e375760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e52919061486a565b5f6040518083038185875af1925050503d805f8114613e8c576040519150601f19603f3d011682016040523d82523d5f602084013e613e91565b606091505b5091509150611605868383606082613eb157613eac82613ef8565b6110e0565b8151158015613ec857506001600160a01b0384163b155b15613ef157604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b50806110e0565b805115613f085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f2d90614289565b5f825580601f10613f3c575050565b601f0160209004905f5260205f209081019061344b9190613f9c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fb0575f8155600101613f9d565b5090565b801515811461344b575f80fd5b803563ffffffff81168114613fd4575f80fd5b919050565b5f805f60608486031215613feb575f80fd5b833592506020840135613ffd81613fb4565b915061400b60408501613fc1565b90509250925092565b5f60208284031215614024575f80fd5b5035919050565b6001600160a01b038116811461344b575f80fd5b5f80828403610100811215614052575f80fd5b60e081121561405f575f80fd5b5082915060e08301356140718161402b565b809150509250929050565b5f6020828403121561408c575f80fd5b6110e082613fc1565b5f80604083850312156140a6575f80fd5b6140af83613fc1565b946020939093013593505050565b80356001600160401b0381168114613fd4575f80fd5b5f602082840312156140e3575f80fd5b6110e0826140bd565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614122576141226140ec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614150576141506140ec565b604052919050565b5f6001600160401b03821115614170576141706140ec565b50601f01601f191660200190565b5f805f8060808587031215614191575f80fd5b84359350602085013592506141a8604086016140bd565b915060608501356001600160401b038111156141c2575f80fd5b8501601f810187136141d2575f80fd5b80356141e56141e082614158565b614128565b8181528860208385010111156141f9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561422b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142825761428261424e565b5092915050565b600181811c9082168061429d57607f821691505b6020821081036142bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142e65750805b601f840160051c820191505b81811015614305575f81556001016142f2565b5050505050565b81516001600160401b03811115614325576143256140ec565b614339816143338454614289565b846142c1565b602080601f83116001811461436c575f84156143555750858301515b5f19600386901b1c1916600185901b1785556143c3565b5f85815260208120601f198616915b8281101561439a5788860151825594840194600190910190840161437b565b50858210156143b757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143e55781810151838201526020016143cd565b50505f910152565b602081525f825180602084015261440b8160408501602087016143cb565b601f01601f19169190910160400192915050565b5f6020828403121561442f575f80fd5b5051919050565b5f60208083525f845461444881614289565b806020870152604060018084165f81146144695760018114614485576144b2565b60ff19851660408a0152604084151560051b8a010195506144b2565b895f5260205f205f5b858110156144a95781548b820186015290830190880161448e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826144e2576144e26144c0565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e61424e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fd481613fb4565b5f80604083850312156145ec575f80fd5b82516001600160401b0380821115614602575f80fd5b9084019060608287031215614615575f80fd5b61461d614100565b825181526020808401516146308161402b565b82820152604084015183811115614645575f80fd5b80850194505087601f850112614659575f80fd5b835192506146696141e084614158565b838152888285870101111561467c575f80fd5b61468b848383018488016143cb565b806040840152508195506146a08188016145d0565b9450505050509250929050565b5f6001600160401b038083168181036146c8576146c861424e565b6001019392505050565b81810381811115610a1e57610a1e61424e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e61424e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142825761428261424e565b5f6020828403121561480f575f80fd5b81356110e08161402b565b6001600160401b0381811683821602808216919082811461483d5761483d61424e565b505092915050565b5f6001600160401b038084168061485e5761485e6144c0565b92169190910492915050565b5f825161487b8184602087016143cb565b9190910192915050565b5f60208284031215614895575f80fd5b81516110e081613fb4565b5f602082840312156148b0575f80fd5b813560ff811681146110e0575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614b72380380614b7283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a258061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614071565b6102d6565b005b6101286101383660046140ac565b6107ff565b61017b61014b3660046140ac565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c3660046140ac565b61095b565b6101286101af3660046140d7565b6109c8565b6101c76101c23660046140ac565b610aac565b6040516001600160401b039091168152602001610185565b6101286101ed366004614114565b610ac2565b61012861020036600461412d565b610b61565b61017b61021336600461416b565b610d52565b6101c76102263660046140ac565b610d6b565b6101286102393660046140ac565b610d7f565b61012861024c366004614071565b610dec565b61017b61025f366004614216565b610ed8565b61012861027236600461412d565b610efd565b61017b6102853660046142b2565b61115b565b610128610298366004614114565b61116e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d13660046140ac565b61132b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f80516020614979833981519152949193919290829060ff16600481111561033e5761033e6142d2565b600481111561034f5761034f6142d2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f85156103d5576103d283866113fa565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610447573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046b91906142e6565b5f888152600686016020526040902055600282516004811115610490576104906142d2565b146104e25760405162461bcd60e51b815260206004820152602a60248201525f805160206149998339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105475760405162461bcd60e51b815260206004820152603360248201525f805160206149998339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104d9565b5f61055184611696565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561059e5761059e6142d2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106708561170a565b905083606001516001600160401b03168160a001516001600160401b0316116106e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104d9565b5f84606001518260a001516106fc9190614311565b905061070886826117e9565b5f610714878584611831565b5f8c815260058a016020526040902090915061073082826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061075d90859060040161449c565b6020604051808303815f875af1158015610779573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079d91906142e6565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149b983398151915292919061084790614338565b9050118015610879575060035f83815260078301602052604090205460ff166005811115610877576108776142d2565b145b6108dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104d9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6020604051808303815f875af1158015610932573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095691906142e6565b505050565b61096481611a4e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a11575080546001600160401b03808416911610155b15610a2f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5a8484611b21565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610abc64e8d4a510008361456c565b92915050565b5f610acc82611b3b565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205291909120549192505f8051602061497983398151915291610b259190611ec8565b604080830180516001600160a01b03165f908152600784016020529182209190915560608301519051610956916001600160401b031690611f3e565b5f805160206149798339815191525f610b7984611f61565b90505f80610b8a8360400151612142565b5091509150610b988561237d565b5f8581526004850160205260408120610bb091613fb9565b5f610bba8361170a565b9050816001600160401b031681608001516001600160401b03161015610bf25760405162461bcd60e51b81526004016104d99061457f565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c375760405162461bcd60e51b81526004016104d9906145c1565b60015f87815260038701602052604090205460ff166004811115610c5d57610c5d6142d2565b14610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104d9565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061460a565b5f610d758261170a565b60a0015192915050565b610d888161237d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b5f8215610e0057610dfd84836113fa565b90505b5f610e0a85612456565b90505f5f80516020614979833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610e8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb391906142e6565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f80610ee386612819565b9050610ef1858286866128c6565b9150505b949350505050565b5f805160206149798339815191525f610f1584611f61565b90505f80610f268360400151612142565b5091509150610f3485611a4e565b5f8581526005850160205260408120610f4c91613fb9565b5f610f568361170a565b9050816001600160401b031681608001516001600160401b03161015610f8e5760405162461bcd60e51b81526004016104d99061457f565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fcc5760405162461bcd60e51b81526004016104d9906145c1565b60035f87815260038701602052604090205460ff166004811115610ff257610ff26142d2565b146110465760405162461bcd60e51b815260206004820152603160248201525f805160206149998339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104d9565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110ea9190611f3e565b61110b8160200151876006015f8a81526020019081526020015f2054611ec8565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611167833384612d1b565b9392505050565b5f805160206149b98339815191525f61118683611f61565b90505f8061119783604001516130d6565b91509150806111f95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104d9565b5f8281526005850160205260408120805461121390614338565b9050118015611245575060015f83815260078601602052604090205460ff166005811115611243576112436142d2565b145b6112615760405162461bcd60e51b81526004016104d990614621565b5f828152600585016020526040812061127991613fb9565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149b983398151915292919061137390614338565b90501180156113a5575060015f83815260078301602052604090205460ff1660058111156113a3576113a36142d2565b145b6113c15760405162461bcd60e51b81526004016104d990614621565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611445573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146c9190810190614673565b91509150806114cf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104d9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611512573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906142e6565b82511461159a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104d9565b60208201516001600160a01b0316156116105760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104d9565b5f8061161f8460400151613277565b9150915081871461168c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104d9565b9695505050505050565b5f8181525f805160206149f98339815191526020526040812060030180545f805160206149b9833981519152916001600160401b03909116908190846116db83614745565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611712613ff0565b5f8281525f805160206149f98339815191526020526040908190208151610100810190925280545f805160206149b9833981519152929190829060ff166005811115611760576117606142d2565b6005811115611771576117716142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206149f9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118aa5761186a81600161476a565b61187590600861460a565b5081515f9083908390811061188c5761188c61477d565b60200101906001600160f81b03191690815f1a905350600101611856565b505f5b600481101561190d576118c181600361476a565b6118cc90600861460a565b6001901c60f81b826118df836002614791565b815181106118ef576118ef61477d565b60200101906001600160f81b03191690815f1a9053506001016118ad565b505f5b602081101561196f5761192481601f61476a565b61192f90600861460a565b86901c60f81b82611941836006614791565b815181106119515761195161477d565b60200101906001600160f81b03191690815f1a905350600101611910565b505f5b60088110156119da5761198681600761476a565b61199190600861460a565b6001600160401b038616901c60f81b826119ac836026614791565b815181106119bc576119bc61477d565b60200101906001600160f81b03191690815f1a905350600101611972565b505f5b6008811015611a45576119f181600761476a565b6119fc90600861460a565b6001600160401b038516901c60f81b82611a1783602e614791565b81518110611a2757611a2761477d565b60200101906001600160f81b03191690815f1a9053506001016119dd565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614979833981519152929190611a9690614338565b9050118015611ac8575060035f83815260038301602052604090205460ff166004811115611ac657611ac66142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603360248201525f8051602061499983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104d9565b5050565b611b2961344f565b611b328261349a565b611b1d816134e0565b611b43613ff0565b5f805160206149b98339815191525f611b5b84611f61565b90505f80611b6c83604001516130d6565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104d9565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c036142d2565b6005811115611c1457611c146142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b6142d2565b1480611cb95750600182516005811115611cb757611cb76142d2565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104d9565b600382516005811115611d2d57611d2d6142d2565b03611d5457505f8381526006860160205260408120600491611d4f9190613fb9565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d816142d2565b90816005811115611d9457611d946142d2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc86142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e936142d2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061495983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611f23575f80fd5b505af1158015611f35573d5f803e3d5ffd5b50505050505050565b5f8051602061495983398151915254611b1d906001600160a01b03168284613581565b60408051606080820183525f8083526020830181905292820152905f805160206149b98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fd6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ffd9190810190614673565b91509150806120645760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104d9565b82548251146120c75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104d9565b60208201516001600160a01b03161561213a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104d9565b509392505050565b5f805f83516036146121665760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156121b55761217d81600161476a565b61218890600861460a565b61ffff1686828151811061219e5761219e61477d565b016020015160f81c901b9190911790600101612169565b5061ffff8116156121d85760405162461bcd60e51b81526004016104d9906147ed565b5f805b6004811015612233576121ef81600361476a565b6121fa90600861460a565b63ffffffff168761220c836002614791565b8151811061221c5761221c61477d565b016020015160f81c901b91909117906001016121db565b5063ffffffff811660031461225a5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156122af5761227181601f61476a565b61227c90600861460a565b88612288836006614791565b815181106122985761229861477d565b016020015160f81c901b919091179060010161225d565b505f805b600881101561230e576122c781600761476a565b6122d290600861460a565b6001600160401b0316896122e7836026614791565b815181106122f7576122f761477d565b016020015160f81c901b91909117906001016122b3565b505f805b600881101561236d5761232681600761476a565b61233190600861460a565b6001600160401b03168a61234683602e614791565b815181106123565761235661477d565b016020015160f81c901b9190911790600101612312565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206149798339815191529291906123c590614338565b90501180156123f7575060015f83815260038301602052604090205460ff1660048111156123f5576123f56142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603860248201525f8051602061499983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104d9565b61245e613ff0565b5f8281525f805160206149f983398151915260205260408082208151610100810190925280545f805160206149b983398151915293929190829060ff1660058111156124ac576124ac6142d2565b60058111156124bd576124bd6142d2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612545576125456142d2565b146125a15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104d9565b60408101516001600160a01b0316336001600160a01b03161461261b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104d9565b6126288160a001516135e0565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561266c5761266c6142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127388561273281611696565b5f611831565b5f868152600685016020526040902090915061275482826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061278190859060040161449c565b6020604051808303815f875af115801561279d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127c191906142e6565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f5f805160206149798339815191528161283284613781565b90505f61283e82610aac565b83549091506001600160401b0382161080159061286857508260010154816001600160401b031611155b610ef55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104d9565b5f6128cf6137a4565b5f805160206149b9833981519152426001600160401b03851611801561290957506001600160401b038416612907426202a300614791565b115b61296b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104d9565b856129c25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104d9565b5f86815260088201602052604090205415612a305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104d9565b8251603014612a975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104d9565b612aa0856135e0565b5f80612ae76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506137db565b5f82815260058601602052604090209193509150612b0582826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3290859060040161449c565b6020604051808303815f875af1158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7291906142e6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612bf457612bf46142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612cb583611696565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610ef560015f805160206149d983398151915255565b5f612d246137a4565b5f612d316101c284613781565b90505f805160206149798339815191525f612d4b8761170a565b9050600281516005811115612d6257612d626142d2565b14612dc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104d9565b5f838260a00151612dd29190614877565b9050612dde88826117e9565b5f612de889611696565b90505f898983604051602001612e309392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e51866135e0565b5f612e5d8b8486611831565b5f8381526004880160205260409020909150612e7982826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ea690859060040161449c565b6020604051808303815f875af1158015612ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee691906142e6565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f9557612f956142d2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061116760015f805160206149d983398151915255565b5f8082516027146130f95760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156131485761311081600161476a565b61311b90600861460a565b61ffff168582815181106131315761313161477d565b016020015160f81c901b91909117906001016130fc565b5061ffff81161561316b5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156131c65761318281600361476a565b61318d90600861460a565b63ffffffff168661319f836002614791565b815181106131af576131af61477d565b016020015160f81c901b919091179060010161316e565b5063ffffffff81166002146131ed5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156132425761320481601f61476a565b61320f90600861460a565b8761321b836006614791565b8151811061322b5761322b61477d565b016020015160f81c901b91909117906001016131f0565b505f866026815181106132575761325761477d565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461329a5760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156132e9576132b181600161476a565b6132bc90600861460a565b61ffff168582815181106132d2576132d261477d565b016020015160f81c901b919091179060010161329d565b5061ffff81161561330c5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156133675761332381600361476a565b61332e90600861460a565b63ffffffff1686613340836002614791565b815181106133505761335061477d565b016020015160f81c901b919091179060010161330f565b5063ffffffff811660041461338e5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156133e3576133a581601f61476a565b6133b090600861460a565b876133bc836006614791565b815181106133cc576133cc61477d565b016020015160f81c901b9190911790600101613391565b505f805b6008811015613442576133fb81600761476a565b61340690600861460a565b6001600160401b03168861341b836026614791565b8151811061342b5761342b61477d565b016020015160f81c901b91909117906001016133e7565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349857604051631afcd79f60e31b815260040160405180910390fd5b565b6134a261344f565b6134ab81613b93565b6134dd606082013560808301356134c860c0850160a0860161416b565b6134d860e0860160c08701614897565b613bb4565b50565b6134e861344f565b5f805160206149598339815191526001600160a01b0382166135615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104d9565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261095691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c0f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149b98339815191529060ff165f0361361e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613666908361476a565b10613682576001600160401b03841660408301528082526136a1565b83826040018181516136949190614877565b6001600160401b03169052505b5f8260200151836040015160646136b891906148b2565b6136c291906148dd565b600285015490915060ff908116908216111561373d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104d9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610abc825f80516020614959833981519152546001600160a01b031690613c70565b5f805160206149d98339815191528054600119016137d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146138455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104d9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156138bc5761387c81600161476a565b61388790600861460a565b5081515f9083908390811061389e5761389e61477d565b60200101906001600160f81b03191690815f1a905350600101613868565b505f5b600481101561391a576138d381600361476a565b6138de90600861460a565b505f826138ec836002614791565b815181106138fc576138fc61477d565b60200101906001600160f81b03191690815f1a9053506001016138bf565b505f5b602081101561397757845181602081106139395761393961477d565b1a60f81b82613949836006614791565b815181106139595761395961477d565b60200101906001600160f81b03191690815f1a90535060010161391d565b505f5b60208110156139d757846020015181602081106139995761399961477d565b1a60f81b826139a9836026614791565b815181106139b9576139b961477d565b60200101906001600160f81b03191690815f1a90535060010161397a565b505f5b6008811015613a4b576139ee81600761476a565b6139f990600861460a565b60ff1685604001516001600160401b0316901c60f81b82826046613a1d9190614791565b81518110613a2d57613a2d61477d565b60200101906001600160f81b03191690815f1a9053506001016139da565b505f5b6030811015613ab65784608001518181518110613a6d57613a6d61477d565b01602001516001600160f81b03191682613a8883604e614791565b81518110613a9857613a9861477d565b60200101906001600160f81b03191690815f1a905350600101613a4e565b505f5b6008811015613b2857613acd81600761476a565b613ad890600861460a565b60608601516001600160401b0390811691161c60f81b82613afa83607e614791565b81518110613b0a57613b0a61477d565b60200101906001600160f81b03191690815f1a905350600101613ab9565b50600281604051613b399190614902565b602060405180830381855afa158015613b54573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613b7791906142e6565b94909350915050565b60015f805160206149d983398151915255565b613b9b61344f565b613ba3613dd2565b613bab613de2565b6134dd81613dea565b613bbc61344f565b5f5f80516020614979833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613c236001600160a01b03841683613e56565b905080515f14158015613c47575080806020019051810190613c45919061491d565b155b1561095657604051635274afe760e01b81526001600160a01b03841660048201526024016104d9565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613cb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cda91906142e6565b9050613cf16001600160a01b038516333086613e63565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d5991906142e6565b9050818111613dbf5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104d9565b613dc9828261476a565b95945050505050565b613dda61344f565b613498613ea2565b61349861344f565b613df261344f565b80355f805160206149b983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e3c6060830160408401614938565b600291909101805460ff191660ff90921691909117905550565b606061116783835f613eaa565b6040516001600160a01b038481166024830152838116604483015260648201839052613e9c9186918216906323b872dd906084016135ae565b50505050565b613b8061344f565b606081471015613ecf5760405163cd78605960e01b81523060048201526024016104d9565b5f80856001600160a01b03168486604051613eea9190614902565b5f6040518083038185875af1925050503d805f8114613f24576040519150601f19603f3d011682016040523d82523d5f602084013e613f29565b606091505b509150915061168c868383606082613f4957613f4482613f90565b611167565b8151158015613f6057506001600160a01b0384163b155b15613f8957604051639996b31560e01b81526001600160a01b03851660048201526024016104d9565b5080611167565b805115613fa05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fc590614338565b5f825580601f10613fd4575050565b601f0160209004905f5260205f20908101906134dd9190614034565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614048575f8155600101614035565b5090565b80151581146134dd575f80fd5b803563ffffffff8116811461406c575f80fd5b919050565b5f805f60608486031215614083575f80fd5b8335925060208401356140958161404c565b91506140a360408501614059565b90509250925092565b5f602082840312156140bc575f80fd5b5035919050565b6001600160a01b03811681146134dd575f80fd5b5f808284036101008112156140ea575f80fd5b60e08112156140f7575f80fd5b5082915060e0830135614109816140c3565b809150509250929050565b5f60208284031215614124575f80fd5b61116782614059565b5f806040838503121561413e575f80fd5b61414783614059565b946020939093013593505050565b80356001600160401b038116811461406c575f80fd5b5f6020828403121561417b575f80fd5b61116782614155565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156141ba576141ba614184565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141e8576141e8614184565b604052919050565b5f6001600160401b0382111561420857614208614184565b50601f01601f191660200190565b5f805f8060808587031215614229575f80fd5b843593506020850135925061424060408601614155565b915060608501356001600160401b0381111561425a575f80fd5b8501601f8101871361426a575f80fd5b803561427d614278826141f0565b6141c0565b818152886020838501011115614291575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142c3575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156142f6575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614331576143316142fd565b5092915050565b600181811c9082168061434c57607f821691505b60208210810361436a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561095657805f5260205f20601f840160051c810160208510156143955750805b601f840160051c820191505b818110156143b4575f81556001016143a1565b5050505050565b81516001600160401b038111156143d4576143d4614184565b6143e8816143e28454614338565b84614370565b602080601f83116001811461441b575f84156144045750858301515b5f19600386901b1c1916600185901b178555614472565b5f85815260208120601f198616915b828110156144495788860151825594840194600190910190840161442a565b508582101561446657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561449457818101518382015260200161447c565b50505f910152565b602081525f82518060208401526144ba81604085016020870161447a565b601f01601f19169190910160400192915050565b5f60208083525f84546144e081614338565b806020870152604060018084165f8114614501576001811461451d5761454a565b60ff19851660408a0152604084151560051b8a0101955061454a565b895f5260205f205f5b858110156145415781548b8201860152908301908801614526565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261457a5761457a614558565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc6142fd565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161406c8161404c565b5f8060408385031215614684575f80fd5b82516001600160401b038082111561469a575f80fd5b90840190606082870312156146ad575f80fd5b6146b5614198565b825181526020808401516146c8816140c3565b828201526040840151838111156146dd575f80fd5b80850194505087601f8501126146f1575f80fd5b83519250614701614278846141f0565b8381528882858701011115614714575f80fd5b6147238483830184880161447a565b80604084015250819550614738818801614668565b9450505050509250929050565b5f6001600160401b03808316818103614760576147606142fd565b6001019392505050565b81810381811115610abc57610abc6142fd565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610abc57610abc6142fd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115614331576143316142fd565b5f602082840312156148a7575f80fd5b8135611167816140c3565b6001600160401b038181168382160280821691908281146148d5576148d56142fd565b505092915050565b5f6001600160401b03808416806148f6576148f6614558565b92169190910492915050565b5f825161491381846020870161447a565b9190910192915050565b5f6020828403121561492d575f80fd5b81516111678161404c565b5f60208284031215614948575f80fd5b813560ff81168114611167575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go index 75980496a..a464de3c8 100644 --- a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -31,8 +31,8 @@ var ( // ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. var ExampleRewardCalculatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b50604051610243380380610243833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516101c06100835f395f81816079015260ca01526101c05ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780636588aa7f14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f366004610125565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133808567ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16886100fe919061016b565b610108919061016b565b6101129190610194565b61011c9190610194565b95945050505050565b5f805f8060808587031215610138575f80fd5b84359350602085013567ffffffffffffffff81168114610156575f80fd5b93969395505050506040820135916060013590565b808202811582820484141761018e57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826101ae57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -233,12 +233,12 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINY return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { +// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, uptime, arg2, arg3) if err != nil { return *new(*big.Int), err @@ -250,18 +250,18 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 24b9a52d7..aa09a95c3 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161469838038061469883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61454b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c04565b610389565b005b348015610134575f80fd5b50610127610143366004613c3f565b61046b565b348015610153575f80fd5b50610127610162366004613c7a565b6108f6565b348015610172575f80fd5b506101b1610181366004613c7a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613c7a565b610a52565b3480156101ee575f80fd5b506102026101fd366004613c7a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613c91565b610ad5565b348015610244575f80fd5b50610127610253366004613caa565b610bc1565b348015610263575f80fd5b506101b1610272366004613ce8565b610db2565b348015610282575f80fd5b50610202610291366004613c7a565b610dcb565b3480156102a1575f80fd5b506101276102b0366004613c7a565b610ddf565b3480156102c0575f80fd5b506101276102cf366004613c3f565b610e4c565b3480156102df575f80fd5b506101276102ee366004613caa565b610e67565b3480156102fe575f80fd5b5061012761030d366004613c91565b611144565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613c7a565b611301565b6101b1610371366004613c7a565b6113d0565b6101b1610384366004613d93565b6113dc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611400565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061449f8339815191529184156104bd576104ba8285611414565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613e25565b600481111561050057610500613e25565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613e25565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206144bf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206144bf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846116b0565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613e25565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611724565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613e4d565b90506107ff8682611803565b5f61080b87858461184b565b5f8c815260058a01602052604090209091506108278282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613fd2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190614004565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206144df83398151915292919061093e90613e74565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613e25565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190614004565b505050565b610a5b81611a68565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b5f610acf64e8d4a51000836140b9565b92915050565b5f610adf82611b3b565b90505f5f8051602061449f833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610b7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614004565b9050610bbb83606001516001600160401b03168460400151611ec8565b50505050565b5f8051602061449f8339815191525f610bd984611edb565b90505f80610bea83604001516120bc565b5091509150610bf8856122f7565b5f8581526004850160205260408120610c1091613b71565b5f610c1a83611724565b9050816001600160401b031681608001516001600160401b03161015610c525760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c975760405162461bcd60e51b81526004016105d09061410e565b60015f87815260038701602052604090205460ff166004811115610cbd57610cbd613e25565b14610d265760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000614157565b5f610dd582611724565b60a0015192915050565b610de8816122f7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b8115610e5e57610e5c8382611414565b505b610a4d836123d0565b5f8051602061449f8339815191525f610e7f84611edb565b90505f80610e9083604001516120bc565b5091509150610e9e85611a68565b5f8581526005850160205260408120610eb691613b71565b5f610ec083611724565b9050816001600160401b031681608001516001600160401b03161015610ef85760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003808701602052604090912001546001600160401b0380841691161115610f365760405162461bcd60e51b81526004016105d09061410e565b60035f87815260038701602052604090205460ff166004811115610f5c57610f5c613e25565b14610fb05760405162461bcd60e51b815260206004820152603160248201525f805160206144bf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110549190611ec8565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa1580156110db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ff9190614004565b9050836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f805160206144df8339815191525f61115c83611edb565b90505f8061116d8360400151612788565b91509150806111cf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f828152600585016020526040812080546111e990613e74565b905011801561121b575060015f83815260078601602052604090205460ff16600581111561121957611219613e25565b145b6112375760405162461bcd60e51b81526004016105d09061416e565b5f828152600585016020526040812061124f91613b71565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144df83398151915292919061134990613e74565b905011801561137b575060015f83815260078301602052604090205460ff16600581111561137957611379613e25565b145b6113975760405162461bcd60e51b81526004016105d09061416e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b5f610acf823334612929565b5f806113e734612ce1565b90506113f585828686612d8b565b9150505b9392505050565b6114086131e0565b6114118161322b565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561145f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261148691908101906141d4565b91509150806114e95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561152c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190614004565b8251146115b45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561162a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611639846040015161326e565b915091508187146116a65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061451f8339815191526020526040812060030180545f805160206144df833981519152916001600160401b03909116908190846116f5836142a6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61172c613ba8565b5f8281525f8051602061451f8339815191526020526040908190208151610100810190925280545f805160206144df833981519152929190829060ff16600581111561177a5761177a613e25565b600581111561178b5761178b613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061451f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118c4576118848160016142cb565b61188f906008614157565b5081515f908390839081106118a6576118a66142de565b60200101906001600160f81b03191690815f1a905350600101611870565b505f5b6004811015611927576118db8160036142cb565b6118e6906008614157565b6001901c60f81b826118f98360026142f2565b81518110611909576119096142de565b60200101906001600160f81b03191690815f1a9053506001016118c7565b505f5b60208110156119895761193e81601f6142cb565b611949906008614157565b86901c60f81b8261195b8360066142f2565b8151811061196b5761196b6142de565b60200101906001600160f81b03191690815f1a90535060010161192a565b505f5b60088110156119f4576119a08160076142cb565b6119ab906008614157565b6001600160401b038616901c60f81b826119c68360266142f2565b815181106119d6576119d66142de565b60200101906001600160f81b03191690815f1a90535060010161198c565b505f5b6008811015611a5f57611a0b8160076142cb565b611a16906008614157565b6001600160401b038516901c60f81b82611a3183602e6142f2565b81518110611a4157611a416142de565b60200101906001600160f81b03191690815f1a9053506001016119f7565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061449f833981519152929190611ab090613e74565b9050118015611ae2575060035f83815260038301602052604090205460ff166004811115611ae057611ae0613e25565b145b611b375760405162461bcd60e51b815260206004820152603360248201525f805160206144bf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b611b43613ba8565b5f805160206144df8339815191525f611b5b84611edb565b90505f80611b6c8360400151612788565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c03613e25565b6005811115611c1457611c14613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b613e25565b1480611cb95750600182516005811115611cb757611cb7613e25565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611d2d57611d2d613e25565b03611d5457505f8381526006860160205260408120600491611d4f9190613b71565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d81613e25565b90816005811115611d9457611d94613e25565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc8613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e93613e25565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b376001600160a01b03821683613446565b60408051606080820183525f8083526020830181905292820152905f805160206144df8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7791908101906141d4565b9150915080611fde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b82548251146120415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b0316156120b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f83516036146120e05760405162461bcd60e51b81526004016105d090614305565b5f805b600281101561212f576120f78160016142cb565b612102906008614157565b61ffff16868281518110612118576121186142de565b016020015160f81c901b91909117906001016120e3565b5061ffff8116156121525760405162461bcd60e51b81526004016105d09061434e565b5f805b60048110156121ad576121698160036142cb565b612174906008614157565b63ffffffff16876121868360026142f2565b81518110612196576121966142de565b016020015160f81c901b9190911790600101612155565b5063ffffffff81166003146121d45760405162461bcd60e51b81526004016105d090614391565b5f805b6020811015612229576121eb81601f6142cb565b6121f6906008614157565b886122028360066142f2565b81518110612212576122126142de565b016020015160f81c901b91909117906001016121d7565b505f805b6008811015612288576122418160076142cb565b61224c906008614157565b6001600160401b0316896122618360266142f2565b81518110612271576122716142de565b016020015160f81c901b919091179060010161222d565b505f805b60088110156122e7576122a08160076142cb565b6122ab906008614157565b6001600160401b03168a6122c083602e6142f2565b815181106122d0576122d06142de565b016020015160f81c901b919091179060010161228c565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061449f83398151915292919061233f90613e74565b9050118015612371575060015f83815260038301602052604090205460ff16600481111561236f5761236f613e25565b145b611b375760405162461bcd60e51b815260206004820152603860248201525f805160206144bf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061451f83398151915260205260408082208151610100810190925280545f805160206144df83398151915293929190829060ff16600581111561241e5761241e613e25565b600581111561242f5761242f613e25565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b7576124b7613e25565b146125135760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461258d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b61259a8160a001516134d9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125de576125de613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126aa846126a4816116b0565b5f61184b565b5f85815260068501602052604090209091506126c68282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f3908590600401613fd2565b6020604051808303815f875af115801561270f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127339190614004565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146127ab5760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156127fa576127c28160016142cb565b6127cd906008614157565b61ffff168582815181106127e3576127e36142de565b016020015160f81c901b91909117906001016127ae565b5061ffff81161561281d5760405162461bcd60e51b81526004016105d09061434e565b5f805b6004811015612878576128348160036142cb565b61283f906008614157565b63ffffffff16866128518360026142f2565b81518110612861576128616142de565b016020015160f81c901b9190911790600101612820565b5063ffffffff811660021461289f5760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156128f4576128b681601f6142cb565b6128c1906008614157565b876128cd8360066142f2565b815181106128dd576128dd6142de565b016020015160f81c901b91909117906001016128a2565b505f86602681518110612909576129096142de565b016020015191976001600160f81b03199092161515965090945050505050565b5f61293261367a565b5f61293c83610abf565b90505f8051602061449f8339815191525f61295687611724565b905060028151600581111561296d5761296d613e25565b146129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516129dd91906143d8565b90506129e98882611803565b5f6129f3896116b0565b90505f898983604051602001612a3b9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a5c866134d9565b5f612a688b848661184b565b5f8381526004880160205260409020909150612a848282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab1908590600401613fd2565b6020604051808303815f875af1158015612acd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af19190614004565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba057612ba0613e25565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506113f960015f805160206144ff83398151915255565b5f5f8051602061449f8339815191528282612cfb82610abf565b83549091506001600160401b03821610801590612d2557508260010154816001600160401b031611155b612d835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612d9461367a565b5f805160206144df833981519152426001600160401b038516118015612dce57506001600160401b038416612dcc426202a3006142f2565b115b612e305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612e875760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ef55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612f5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612f65856134d9565b5f80612fac6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136c4565b5f82815260058601602052604090209193509150612fca8282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ff7908590600401613fd2565b6020604051808303815f875af1158015613013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130379190614004565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156130b9576130b9613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561317a836116b0565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612d8360015f805160206144ff83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322957604051631afcd79f60e31b815260040160405180910390fd5b565b6132336131e0565b61323c81613a69565b6114116060820135608083013561325960c0850160a08601613ce8565b61326960e0860160c087016143f8565b613a8a565b5f808251602e146132915760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156132e0576132a88160016142cb565b6132b3906008614157565b61ffff168582815181106132c9576132c96142de565b016020015160f81c901b9190911790600101613294565b5061ffff8116156133035760405162461bcd60e51b81526004016105d09061434e565b5f805b600481101561335e5761331a8160036142cb565b613325906008614157565b63ffffffff16866133378360026142f2565b81518110613347576133476142de565b016020015160f81c901b9190911790600101613306565b5063ffffffff81166004146133855760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156133da5761339c81601f6142cb565b6133a7906008614157565b876133b38360066142f2565b815181106133c3576133c36142de565b016020015160f81c901b9190911790600101613388565b505f805b6008811015613439576133f28160076142cb565b6133fd906008614157565b6001600160401b0316886134128360266142f2565b81518110613422576134226142de565b016020015160f81c901b91909117906001016133de565b5090969095509350505050565b804710156134695760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134b2576040519150601f19603f3d011682016040523d82523d5f602084013e6134b7565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144df8339815191529060ff165f03613517575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061355f90836142cb565b1061357b576001600160401b038416604083015280825261359a565b838260400181815161358d91906143d8565b6001600160401b03169052505b5f8260200151836040015160646135b19190614413565b6135bb919061443e565b600285015490915060ff90811690821611156136365760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206144ff8339815191528054600119016136ab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144ff83398151915255565b5f606082608001515160301461372e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137a5576137658160016142cb565b613770906008614157565b5081515f90839083908110613787576137876142de565b60200101906001600160f81b03191690815f1a905350600101613751565b505f5b6004811015613803576137bc8160036142cb565b6137c7906008614157565b505f826137d58360026142f2565b815181106137e5576137e56142de565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b60208110156138605784518160208110613822576138226142de565b1a60f81b826138328360066142f2565b81518110613842576138426142de565b60200101906001600160f81b03191690815f1a905350600101613806565b505f5b60208110156138c05784602001518160208110613882576138826142de565b1a60f81b826138928360266142f2565b815181106138a2576138a26142de565b60200101906001600160f81b03191690815f1a905350600101613863565b505f5b6008811015613934576138d78160076142cb565b6138e2906008614157565b60ff1685604001516001600160401b0316901c60f81b8282604661390691906142f2565b81518110613916576139166142de565b60200101906001600160f81b03191690815f1a9053506001016138c3565b505f5b603081101561399f5784608001518181518110613956576139566142de565b01602001516001600160f81b0319168261397183604e6142f2565b81518110613981576139816142de565b60200101906001600160f81b03191690815f1a905350600101613937565b505f5b6008811015613a11576139b68160076142cb565b6139c1906008614157565b60608601516001600160401b0390811691161c60f81b826139e383607e6142f2565b815181106139f3576139f36142de565b60200101906001600160f81b03191690815f1a9053506001016139a2565b50600281604051613a229190614463565b602060405180830381855afa158015613a3d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a609190614004565b94909350915050565b613a716131e0565b613a79613ae5565b613a81613af5565b61141181613afd565b613a926131e0565b5f5f8051602061449f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613aed6131e0565b613229613b69565b6132296131e0565b613b056131e0565b80355f805160206144df83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161447e565b600291909101805460ff191660ff90921691909117905550565b6136b16131e0565b508054613b7d90613e74565b5f825580601f10613b8c575050565b601f0160209004905f5260205f20908101906114119190613bec565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c00575f8155600101613bed565b5090565b5f60e08284031215613c14575f80fd5b50919050565b8015158114611411575f80fd5b803563ffffffff81168114613c3a575f80fd5b919050565b5f805f60608486031215613c51575f80fd5b833592506020840135613c6381613c1a565b9150613c7160408501613c27565b90509250925092565b5f60208284031215613c8a575f80fd5b5035919050565b5f60208284031215613ca1575f80fd5b6113f982613c27565b5f8060408385031215613cbb575f80fd5b613cc483613c27565b946020939093013593505050565b80356001600160401b0381168114613c3a575f80fd5b5f60208284031215613cf8575f80fd5b6113f982613cd2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d3757613d37613d01565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d6557613d65613d01565b604052919050565b5f6001600160401b03821115613d8557613d85613d01565b50601f01601f191660200190565b5f805f60608486031215613da5575f80fd5b83359250613db560208501613cd2565b915060408401356001600160401b03811115613dcf575f80fd5b8401601f81018613613ddf575f80fd5b8035613df2613ded82613d6d565b613d3d565b818152876020838501011115613e06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e6d57613e6d613e39565b5092915050565b600181811c90821680613e8857607f821691505b602082108103613c1457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613ecb5750805b601f840160051c820191505b81811015613eea575f8155600101613ed7565b5050505050565b81516001600160401b03811115613f0a57613f0a613d01565b613f1e81613f188454613e74565b84613ea6565b602080601f831160018114613f51575f8415613f3a5750858301515b5f19600386901b1c1916600185901b178555613fa8565b5f85815260208120601f198616915b82811015613f7f57888601518255948401946001909101908401613f60565b5085821015613f9c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613fca578181015183820152602001613fb2565b50505f910152565b602081525f8251806020840152613ff0816040850160208701613fb0565b601f01601f19169190910160400192915050565b5f60208284031215614014575f80fd5b5051919050565b5f60208083525f845461402d81613e74565b806020870152604060018084165f811461404e576001811461406a57614097565b60ff19851660408a0152604084151560051b8a01019550614097565b895f5260205f205f5b8581101561408e5781548b8201860152908301908801614073565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826140c7576140c76140a5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613e39565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611411575f80fd5b8051613c3a81613c1a565b5f80604083850312156141e5575f80fd5b82516001600160401b03808211156141fb575f80fd5b908401906060828703121561420e575f80fd5b614216613d15565b82518152602080840151614229816141b5565b8282015260408401518381111561423e575f80fd5b80850194505087601f850112614252575f80fd5b83519250614262613ded84613d6d565b8381528882858701011115614275575f80fd5b61428484838301848801613fb0565b806040840152508195506142998188016141c9565b9450505050509250929050565b5f6001600160401b038083168181036142c1576142c1613e39565b6001019392505050565b81810381811115610acf57610acf613e39565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613e39565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613e6d57613e6d613e39565b5f60208284031215614408575f80fd5b81356113f9816141b5565b6001600160401b0381811683821602808216919082811461443657614436613e39565b505092915050565b5f6001600160401b0380841680614457576144576140a5565b92169190910492915050565b5f8251614474818460208701613fb0565b9190910192915050565b5f6020828403121561448e575f80fd5b813560ff811681146113f9575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161470438038061470483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145b78061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c70565b610389565b005b348015610134575f80fd5b50610127610143366004613cab565b61046b565b348015610153575f80fd5b50610127610162366004613ce6565b610994565b348015610172575f80fd5b506101b1610181366004613ce6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613ce6565b610af0565b3480156101ee575f80fd5b506102026101fd366004613ce6565b610b5d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613cfd565b610b73565b348015610244575f80fd5b50610127610253366004613d16565b610bf1565b348015610263575f80fd5b506101b1610272366004613d54565b610de2565b348015610282575f80fd5b50610202610291366004613ce6565b610dfb565b3480156102a1575f80fd5b506101276102b0366004613ce6565b610e0f565b3480156102c0575f80fd5b506101276102cf366004613cab565b610e7c565b3480156102df575f80fd5b506101276102ee366004613d16565b610f68565b3480156102fe575f80fd5b5061012761030d366004613cfd565b6111a5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613ce6565b611362565b6101b1610371366004613ce6565b611431565b6101b1610384366004613dff565b61143d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611461565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f8051602061450b833981519152949193919290829060ff1660048111156104d3576104d3613e91565b60048111156104e4576104e4613e91565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561056a576105678386611475565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613ea5565b5f88815260068601602052604090205560028251600481111561062557610625613e91565b146106775760405162461bcd60e51b815260206004820152602a60248201525f8051602061452b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106dc5760405162461bcd60e51b815260206004820152603360248201525f8051602061452b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161066e565b5f6106e684611711565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561073357610733613e91565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61080585611785565b905083606001516001600160401b03168160a001516001600160401b03161161087c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161066e565b5f84606001518260a001516108919190613ed0565b905061089d8682611864565b5f6108a98785846118ac565b5f8c815260058a01602052604090209091506108c58282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906108f2908590600401614055565b6020604051808303815f875af115801561090e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109329190613ea5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061454b8339815191529291906109dc90613ef7565b9050118015610a0e575060035f83815260078301602052604090205460ff166005811115610a0c57610a0c613e91565b145b610a725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161066e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b6020604051808303815f875af1158015610ac7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aeb9190613ea5565b505050565b610af981611ac9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f610b6d64e8d4a5100083614125565b92915050565b5f610b7d82611b9c565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020528251909116815291822091909155606082015190519192505f8051602061450b83398151915291610aeb916001600160401b031690611f29565b5f8051602061450b8339815191525f610c0984611f3c565b90505f80610c1a836040015161211d565b5091509150610c2885612358565b5f8581526004850160205260408120610c4091613bdd565b5f610c4a83611785565b9050816001600160401b031681608001516001600160401b03161015610c825760405162461bcd60e51b815260040161066e90614138565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610cc75760405162461bcd60e51b815260040161066e9061417a565b60015f87815260038701602052604090205460ff166004811115610ced57610ced613e91565b14610d565760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161066e565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b6d6001600160401b03831664e8d4a510006141c3565b5f610e0582611785565b60a0015192915050565b610e1881612358565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f8215610e9057610e8d8483611475565b90505b5f610e9a85612431565b90505f5f8051602061450b833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613ea5565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f8051602061450b8339815191525f610f8084611f3c565b90505f80610f91836040015161211d565b5091509150610f9f85611ac9565b5f8581526005850160205260408120610fb791613bdd565b5f610fc183611785565b9050816001600160401b031681608001516001600160401b03161015610ff95760405162461bcd60e51b815260040161066e90614138565b5f8681526003808701602052604090912001546001600160401b03808416911611156110375760405162461bcd60e51b815260040161066e9061417a565b60035f87815260038701602052604090205460ff16600481111561105d5761105d613e91565b146110b15760405162461bcd60e51b815260206004820152603160248201525f8051602061452b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161066e565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526111559190611f29565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f8051602061454b8339815191525f6111bd83611f3c565b90505f806111ce83604001516127f4565b91509150806112305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161066e565b5f8281526005850160205260408120805461124a90613ef7565b905011801561127c575060015f83815260078601602052604090205460ff16600581111561127a5761127a613e91565b145b6112985760405162461bcd60e51b815260040161066e906141da565b5f82815260058501602052604081206112b091613bdd565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061454b8339815191529291906113aa90613ef7565b90501180156113dc575060015f83815260078301602052604090205460ff1660058111156113da576113da613e91565b145b6113f85760405162461bcd60e51b815260040161066e906141da565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b5f610b6d823334612995565b5f8061144834612d4d565b905061145685828686612df7565b9150505b9392505050565b61146961324c565b61147281613297565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114e79190810190614240565b915091508061154a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161066e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613ea5565b8251146116155760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161066e565b60208201516001600160a01b03161561168b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161066e565b5f8061169a84604001516132da565b915091508187146117075760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161066e565b9695505050505050565b5f8181525f8051602061458b8339815191526020526040812060030180545f8051602061454b833981519152916001600160401b039091169081908461175683614312565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61178d613c14565b5f8281525f8051602061458b8339815191526020526040908190208151610100810190925280545f8051602061454b833981519152929190829060ff1660058111156117db576117db613e91565b60058111156117ec576117ec613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061458b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611925576118e5816001614337565b6118f09060086141c3565b5081515f908390839081106119075761190761434a565b60200101906001600160f81b03191690815f1a9053506001016118d1565b505f5b60048110156119885761193c816003614337565b6119479060086141c3565b6001901c60f81b8261195a83600261435e565b8151811061196a5761196a61434a565b60200101906001600160f81b03191690815f1a905350600101611928565b505f5b60208110156119ea5761199f81601f614337565b6119aa9060086141c3565b86901c60f81b826119bc83600661435e565b815181106119cc576119cc61434a565b60200101906001600160f81b03191690815f1a90535060010161198b565b505f5b6008811015611a5557611a01816007614337565b611a0c9060086141c3565b6001600160401b038616901c60f81b82611a2783602661435e565b81518110611a3757611a3761434a565b60200101906001600160f81b03191690815f1a9053506001016119ed565b505f5b6008811015611ac057611a6c816007614337565b611a779060086141c3565b6001600160401b038516901c60f81b82611a9283602e61435e565b81518110611aa257611aa261434a565b60200101906001600160f81b03191690815f1a905350600101611a58565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061450b833981519152929190611b1190613ef7565b9050118015611b43575060035f83815260038301602052604090205460ff166004811115611b4157611b41613e91565b145b611b985760405162461bcd60e51b815260206004820152603360248201525f8051602061452b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161066e565b5050565b611ba4613c14565b5f8051602061454b8339815191525f611bbc84611f3c565b90505f80611bcd83604001516127f4565b915091508015611c325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161066e565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c6457611c64613e91565b6005811115611c7557611c75613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cfc57611cfc613e91565b1480611d1a5750600182516005811115611d1857611d18613e91565b145b611d795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161066e565b600382516005811115611d8e57611d8e613e91565b03611db557505f8381526006860160205260408120600491611db09190613bdd565b611db9565b5060055b6020808301515f90815260088801909152604081205581816005811115611de257611de2613e91565b90816005811115611df557611df5613e91565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611e2957611e29613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ef457611ef4613e91565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b986001600160a01b038216836134b2565b60408051606080820183525f8083526020830181905292820152905f8051602061454b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fb1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fd89190810190614240565b915091508061203f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161066e565b82548251146120a25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161066e565b60208201516001600160a01b0316156121155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161066e565b509392505050565b5f805f83516036146121415760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561219057612158816001614337565b6121639060086141c3565b61ffff168682815181106121795761217961434a565b016020015160f81c901b9190911790600101612144565b5061ffff8116156121b35760405162461bcd60e51b815260040161066e906143ba565b5f805b600481101561220e576121ca816003614337565b6121d59060086141c3565b63ffffffff16876121e783600261435e565b815181106121f7576121f761434a565b016020015160f81c901b91909117906001016121b6565b5063ffffffff81166003146122355760405162461bcd60e51b815260040161066e906143fd565b5f805b602081101561228a5761224c81601f614337565b6122579060086141c3565b8861226383600661435e565b815181106122735761227361434a565b016020015160f81c901b9190911790600101612238565b505f805b60088110156122e9576122a2816007614337565b6122ad9060086141c3565b6001600160401b0316896122c283602661435e565b815181106122d2576122d261434a565b016020015160f81c901b919091179060010161228e565b505f805b600881101561234857612301816007614337565b61230c9060086141c3565b6001600160401b03168a61232183602e61435e565b815181106123315761233161434a565b016020015160f81c901b91909117906001016122ed565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061450b8339815191529291906123a090613ef7565b90501180156123d2575060015f83815260038301602052604090205460ff1660048111156123d0576123d0613e91565b145b611b985760405162461bcd60e51b815260206004820152603860248201525f8051602061452b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161066e565b612439613c14565b5f8281525f8051602061458b83398151915260205260408082208151610100810190925280545f8051602061454b83398151915293929190829060ff16600581111561248757612487613e91565b600581111561249857612498613e91565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561252057612520613e91565b1461257c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161066e565b60408101516001600160a01b0316336001600160a01b0316146125f65760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161066e565b6126038160a00151613545565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561264757612647613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127138561270d81611711565b5f6118ac565b5f868152600685016020526040902090915061272f8282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061275c908590600401614055565b6020604051808303815f875af1158015612778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061279c9190613ea5565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8082516027146128175760405162461bcd60e51b815260040161066e90614371565b5f805b60028110156128665761282e816001614337565b6128399060086141c3565b61ffff1685828151811061284f5761284f61434a565b016020015160f81c901b919091179060010161281a565b5061ffff8116156128895760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156128e4576128a0816003614337565b6128ab9060086141c3565b63ffffffff16866128bd83600261435e565b815181106128cd576128cd61434a565b016020015160f81c901b919091179060010161288c565b5063ffffffff811660021461290b5760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156129605761292281601f614337565b61292d9060086141c3565b8761293983600661435e565b815181106129495761294961434a565b016020015160f81c901b919091179060010161290e565b505f866026815181106129755761297561434a565b016020015191976001600160f81b03199092161515965090945050505050565b5f61299e6136e6565b5f6129a883610b5d565b90505f8051602061450b8339815191525f6129c287611785565b90506002815160058111156129d9576129d9613e91565b14612a385760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161066e565b5f838260a00151612a499190614444565b9050612a558882611864565b5f612a5f89611711565b90505f898983604051602001612aa79392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612ac886613545565b5f612ad48b84866118ac565b5f8381526004880160205260409020909150612af08282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b1d908590600401614055565b6020604051808303815f875af1158015612b39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5d9190613ea5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c0c57612c0c613e91565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061145a60015f8051602061456b83398151915255565b5f5f8051602061450b8339815191528282612d6782610b5d565b83549091506001600160401b03821610801590612d9157508260010154816001600160401b031611155b612def5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161066e565b949350505050565b5f612e006136e6565b5f8051602061454b833981519152426001600160401b038516118015612e3a57506001600160401b038416612e38426202a30061435e565b115b612e9c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161066e565b85612ef35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161066e565b5f86815260088201602052604090205415612f615760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161066e565b8251603014612fc85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161066e565b612fd185613545565b5f806130186040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613730565b5f828152600586016020526040902091935091506130368282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613063908590600401614055565b6020604051808303815f875af115801561307f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a39190613ea5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561312557613125613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556131e683611711565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612def60015f8051602061456b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661329557604051631afcd79f60e31b815260040160405180910390fd5b565b61329f61324c565b6132a881613ad5565b611472606082013560808301356132c560c0850160a08601613d54565b6132d560e0860160c08701614464565b613af6565b5f808251602e146132fd5760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561334c57613314816001614337565b61331f9060086141c3565b61ffff168582815181106133355761333561434a565b016020015160f81c901b9190911790600101613300565b5061ffff81161561336f5760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156133ca57613386816003614337565b6133919060086141c3565b63ffffffff16866133a383600261435e565b815181106133b3576133b361434a565b016020015160f81c901b9190911790600101613372565b5063ffffffff81166004146133f15760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156134465761340881601f614337565b6134139060086141c3565b8761341f83600661435e565b8151811061342f5761342f61434a565b016020015160f81c901b91909117906001016133f4565b505f805b60088110156134a55761345e816007614337565b6134699060086141c3565b6001600160401b03168861347e83602661435e565b8151811061348e5761348e61434a565b016020015160f81c901b919091179060010161344a565b5090969095509350505050565b804710156134d55760405163cd78605960e01b815230600482015260240161066e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461351e576040519150601f19603f3d011682016040523d82523d5f602084013e613523565b606091505b5050905080610aeb57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061454b8339815191529060ff165f03613583575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135cb9083614337565b106135e7576001600160401b0384166040830152808252613606565b83826040018181516135f99190614444565b6001600160401b03169052505b5f82602001518360400151606461361d919061447f565b61362791906144aa565b600285015490915060ff90811690821611156136a25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161066e565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061456b83398151915280546001190161371757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061456b83398151915255565b5f606082608001515160301461379a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161066e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613811576137d1816001614337565b6137dc9060086141c3565b5081515f908390839081106137f3576137f361434a565b60200101906001600160f81b03191690815f1a9053506001016137bd565b505f5b600481101561386f57613828816003614337565b6138339060086141c3565b505f8261384183600261435e565b815181106138515761385161434a565b60200101906001600160f81b03191690815f1a905350600101613814565b505f5b60208110156138cc578451816020811061388e5761388e61434a565b1a60f81b8261389e83600661435e565b815181106138ae576138ae61434a565b60200101906001600160f81b03191690815f1a905350600101613872565b505f5b602081101561392c57846020015181602081106138ee576138ee61434a565b1a60f81b826138fe83602661435e565b8151811061390e5761390e61434a565b60200101906001600160f81b03191690815f1a9053506001016138cf565b505f5b60088110156139a057613943816007614337565b61394e9060086141c3565b60ff1685604001516001600160401b0316901c60f81b82826046613972919061435e565b815181106139825761398261434a565b60200101906001600160f81b03191690815f1a90535060010161392f565b505f5b6030811015613a0b57846080015181815181106139c2576139c261434a565b01602001516001600160f81b031916826139dd83604e61435e565b815181106139ed576139ed61434a565b60200101906001600160f81b03191690815f1a9053506001016139a3565b505f5b6008811015613a7d57613a22816007614337565b613a2d9060086141c3565b60608601516001600160401b0390811691161c60f81b82613a4f83607e61435e565b81518110613a5f57613a5f61434a565b60200101906001600160f81b03191690815f1a905350600101613a0e565b50600281604051613a8e91906144cf565b602060405180830381855afa158015613aa9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613acc9190613ea5565b94909350915050565b613add61324c565b613ae5613b51565b613aed613b61565b61147281613b69565b613afe61324c565b5f5f8051602061450b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613b5961324c565b613295613bd5565b61329561324c565b613b7161324c565b80355f8051602061454b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bbb60608301604084016144ea565b600291909101805460ff191660ff90921691909117905550565b61371d61324c565b508054613be990613ef7565b5f825580601f10613bf8575050565b601f0160209004905f5260205f20908101906114729190613c58565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c6c575f8155600101613c59565b5090565b5f60e08284031215613c80575f80fd5b50919050565b8015158114611472575f80fd5b803563ffffffff81168114613ca6575f80fd5b919050565b5f805f60608486031215613cbd575f80fd5b833592506020840135613ccf81613c86565b9150613cdd60408501613c93565b90509250925092565b5f60208284031215613cf6575f80fd5b5035919050565b5f60208284031215613d0d575f80fd5b61145a82613c93565b5f8060408385031215613d27575f80fd5b613d3083613c93565b946020939093013593505050565b80356001600160401b0381168114613ca6575f80fd5b5f60208284031215613d64575f80fd5b61145a82613d3e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613da357613da3613d6d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dd157613dd1613d6d565b604052919050565b5f6001600160401b03821115613df157613df1613d6d565b50601f01601f191660200190565b5f805f60608486031215613e11575f80fd5b83359250613e2160208501613d3e565b915060408401356001600160401b03811115613e3b575f80fd5b8401601f81018613613e4b575f80fd5b8035613e5e613e5982613dd9565b613da9565b818152876020838501011115613e72575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613eb5575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ef057613ef0613ebc565b5092915050565b600181811c90821680613f0b57607f821691505b602082108103613c8057634e487b7160e01b5f52602260045260245ffd5b601f821115610aeb57805f5260205f20601f840160051c81016020851015613f4e5750805b601f840160051c820191505b81811015613f6d575f8155600101613f5a565b5050505050565b81516001600160401b03811115613f8d57613f8d613d6d565b613fa181613f9b8454613ef7565b84613f29565b602080601f831160018114613fd4575f8415613fbd5750858301515b5f19600386901b1c1916600185901b17855561402b565b5f85815260208120601f198616915b8281101561400257888601518255948401946001909101908401613fe3565b508582101561401f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561404d578181015183820152602001614035565b50505f910152565b602081525f8251806020840152614073816040850160208701614033565b601f01601f19169190910160400192915050565b5f60208083525f845461409981613ef7565b806020870152604060018084165f81146140ba57600181146140d657614103565b60ff19851660408a0152604084151560051b8a01019550614103565b895f5260205f205f5b858110156140fa5781548b82018601529083019088016140df565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261413357614133614111565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b6d57610b6d613ebc565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611472575f80fd5b8051613ca681613c86565b5f8060408385031215614251575f80fd5b82516001600160401b0380821115614267575f80fd5b908401906060828703121561427a575f80fd5b614282613d81565b8251815260208084015161429581614221565b828201526040840151838111156142aa575f80fd5b80850194505087601f8501126142be575f80fd5b835192506142ce613e5984613dd9565b83815288828587010111156142e1575f80fd5b6142f084838301848801614033565b80604084015250819550614305818801614235565b9450505050509250929050565b5f6001600160401b0380831681810361432d5761432d613ebc565b6001019392505050565b81810381811115610b6d57610b6d613ebc565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b6d57610b6d613ebc565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ef057613ef0613ebc565b5f60208284031215614474575f80fd5b813561145a81614221565b6001600160401b038181168382160280821691908281146144a2576144a2613ebc565b505092915050565b5f6001600160401b03808416806144c3576144c3614111565b92169190910492915050565b5f82516144e0818460208701614033565b9190910192915050565b5f602082840312156144fa575f80fd5b813560ff8116811461145a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 37830db11..534ad1470 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612bde380380612bde83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a918061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046123a7565b61023f565b005b6101226100f23660046123a7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012261014336600461246b565b6103a0565b6100e261015636600461250e565b6103c0565b61016e6101693660046123a7565b6103cd565b6040516001600160401b03909116815260200161012c565b6100e26103e1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123a7565b6103f4565b6100e26101f336600461250e565b610400565b6101ba6005600160991b0181565b6100e26102143660046123a7565b6105bd565b6100e261022736600461254c565b61068c565b6100e261023a366004612588565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a65833981519152929190610287906125a3565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125db565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125ef565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612679565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610c97565b5050565b5f6103d782611024565b60a0015192915050565b6103e96107d4565b6103f25f611116565b565b6103fd81611186565b50565b5f80516020612a658339815191525f61041883611551565b90505f806104298360400151611732565b915091508061048b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600585016020526040812080546104a5906125a3565b90501180156104d7575060015f83815260078601602052604090205460ff1660058111156104d5576104d56125db565b145b6104f35760405162461bcd60e51b815260040161031990612690565b5f828152600585016020526040812061050b91612314565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a65833981519152929190610605906125a3565b9050118015610637575060015f83815260078301602052604090205460ff166005811115610635576106356125db565b145b6106535760405162461bcd60e51b815260040161031990612690565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125ef565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106d05750825b90505f826001600160401b031660011480156106eb5750303b155b9050811580156106f9575080155b156107175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561074157845460ff60401b1916600160401b1785555b61074b8787611991565b831561079157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b6103fd81611116565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103f25760405163118cdaa760e01b8152336004820152602401610319565b5f6108386119ab565b5f80516020612a65833981519152426001600160401b03851611801561087257506001600160401b038416610870426202a3006126eb565b115b6108d45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b8561092b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600882016020526040902054156109995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610a09856119f5565b5f80610a506040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611b96565b5f82815260058601602052604090209193509150610a6e828261274f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610a9b908590600401612830565b6020604051808303815f875af1158015610ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adb9190612679565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610b5d57610b5d6125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c1e83611f3b565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610c9f61234b565b5f80516020612a658339815191525f610cb784611551565b90505f80610cc88360400151611732565b915091508015610d2d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610d5f57610d5f6125db565b6005811115610d7057610d706125db565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610df757610df76125db565b1480610e155750600182516005811115610e1357610e136125db565b145b610e745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610e8957610e896125db565b03610eb057505f8381526006860160205260408120600491610eab9190612314565b610eb4565b5060055b6020808301515f90815260088801909152604081205581816005811115610edd57610edd6125db565b90816005811115610ef057610ef06125db565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610f2457610f246125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610fef57610fef6125db565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61102c61234b565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040908190208151610100810190925280545f80516020612a65833981519152929190829060ff16600581111561108d5761108d6125db565b600581111561109e5761109e6125db565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a6583398151915293929190829060ff1660058111156111e7576111e76125db565b60058111156111f8576111f86125db565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611280576112806125db565b146112dc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113565760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6113638160a001516119f5565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156113a7576113a76125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114738461146d81611f3b565b5f611fe8565b5f858152600685016020526040902090915061148f828261274f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906114bc908590600401612830565b6020604051808303815f875af11580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190612679565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612a658339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115ed9190810190612871565b91509150806116545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146116b75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561172a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146117975760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156117e6576117ae816001612943565b6117b9906008612956565b61ffff168582815181106117cf576117cf61296d565b016020015160f81c901b919091179060010161179a565b5061ffff8116156118455760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156118a05761185c816003612943565b611867906008612956565b63ffffffff16866118798360026126eb565b815181106118895761188961296d565b016020015160f81c901b9190911790600101611848565b5063ffffffff81166002146119075760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b602081101561195c5761191e81601f612943565b611929906008612956565b876119358360066126eb565b815181106119455761194561296d565b016020015160f81c901b919091179060010161190a565b505f866026815181106119715761197161296d565b016020015191976001600160f81b03199092161515965090945050505050565b611999612205565b6119a28261224e565b6103c98161226f565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016119ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a658339815191529060ff165f03611a33575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a7b9083612943565b10611a97576001600160401b0384166040830152808252611ab6565b8382604001818151611aa99190612981565b6001600160401b03169052505b5f826020015183604001516064611acd91906129a8565b611ad791906129d3565b600285015490915060ff9081169082161115611b525760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c005760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c7757611c37816001612943565b611c42906008612956565b5081515f90839083908110611c5957611c5961296d565b60200101906001600160f81b03191690815f1a905350600101611c23565b505f5b6004811015611cd557611c8e816003612943565b611c99906008612956565b505f82611ca78360026126eb565b81518110611cb757611cb761296d565b60200101906001600160f81b03191690815f1a905350600101611c7a565b505f5b6020811015611d325784518160208110611cf457611cf461296d565b1a60f81b82611d048360066126eb565b81518110611d1457611d1461296d565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6020811015611d925784602001518160208110611d5457611d5461296d565b1a60f81b82611d648360266126eb565b81518110611d7457611d7461296d565b60200101906001600160f81b03191690815f1a905350600101611d35565b505f5b6008811015611e0657611da9816007612943565b611db4906008612956565b60ff1685604001516001600160401b0316901c60f81b82826046611dd891906126eb565b81518110611de857611de861296d565b60200101906001600160f81b03191690815f1a905350600101611d95565b505f5b6030811015611e715784608001518181518110611e2857611e2861296d565b01602001516001600160f81b03191682611e4383604e6126eb565b81518110611e5357611e5361296d565b60200101906001600160f81b03191690815f1a905350600101611e09565b505f5b6008811015611ee357611e88816007612943565b611e93906008612956565b60608601516001600160401b0390811691161c60f81b82611eb583607e6126eb565b81518110611ec557611ec561296d565b60200101906001600160f81b03191690815f1a905350600101611e74565b50600281604051611ef49190612a04565b602060405180830381855afa158015611f0f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f329190612679565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a65833981519152916001600160401b0390911690819084611f9383612a1f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561206157612021816001612943565b61202c906008612956565b5081515f908390839081106120435761204361296d565b60200101906001600160f81b03191690815f1a90535060010161200d565b505f5b60048110156120c457612078816003612943565b612083906008612956565b6001901c60f81b826120968360026126eb565b815181106120a6576120a661296d565b60200101906001600160f81b03191690815f1a905350600101612064565b505f5b6020811015612126576120db81601f612943565b6120e6906008612956565b86901c60f81b826120f88360066126eb565b815181106121085761210861296d565b60200101906001600160f81b03191690815f1a9053506001016120c7565b505f5b60088110156121915761213d816007612943565b612148906008612956565b6001600160401b038616901c60f81b826121638360266126eb565b815181106121735761217361296d565b60200101906001600160f81b03191690815f1a905350600101612129565b505f5b60088110156121fc576121a8816007612943565b6121b3906008612956565b6001600160401b038516901c60f81b826121ce83602e6126eb565b815181106121de576121de61296d565b60200101906001600160f81b03191690815f1a905350600101612194565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103f257604051631afcd79f60e31b815260040160405180910390fd5b612256612205565b61225e612280565b612266612290565b6103fd81612298565b612277612205565b6103fd81612304565b612288612205565b6103f261230c565b6103f2612205565b6122a0612205565b80355f80516020612a6583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122ea6060830160408401612a44565b600291909101805460ff191660ff90921691909117905550565b6107a2612205565b611fc2612205565b508054612320906125a3565b5f825580601f1061232f575050565b601f0160209004905f5260205f20908101906103fd919061238f565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156123a3575f8155600101612390565b5090565b5f602082840312156123b7575f80fd5b5035919050565b80356001600160401b03811681146123d4575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561240f5761240f6123d9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561243d5761243d6123d9565b604052919050565b5f6001600160401b0382111561245d5761245d6123d9565b50601f01601f191660200190565b5f805f806080858703121561247e575f80fd5b612487856123be565b93506020850135925061249c604086016123be565b915060608501356001600160401b038111156124b6575f80fd5b8501601f810187136124c6575f80fd5b80356124d96124d482612445565b612415565b8181528860208385010111156124ed575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6020828403121561251e575f80fd5b813563ffffffff81168114612531575f80fd5b9392505050565b6001600160a01b03811681146103fd575f80fd5b5f80828403608081121561255e575f80fd5b606081121561256b575f80fd5b50829150606083013561257d81612538565b809150509250929050565b5f60208284031215612598575f80fd5b813561253181612538565b600181811c908216806125b757607f821691505b6020821081036125d557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454612601816125a3565b806020870152604060018084165f8114612622576001811461263e5761266b565b60ff19851660408a0152604084151560051b8a0101955061266b565b895f5260205f205f5b858110156126625781548b8201860152908301908801612647565b8a016040019650505b509398975050505050505050565b5f60208284031215612689575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126fe576126fe6126d7565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156127295750805b601f840160051c820191505b81811015612748575f8155600101612735565b5050505050565b81516001600160401b03811115612768576127686123d9565b61277c8161277684546125a3565b84612704565b602080601f8311600181146127af575f84156127985750858301515b5f19600386901b1c1916600185901b178555612806565b5f85815260208120601f198616915b828110156127dd578886015182559484019460019091019084016127be565b50858210156127fa57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015612828578181015183820152602001612810565b50505f910152565b602081525f825180602084015261284e81604085016020870161280e565b601f01601f19169190910160400192915050565b805180151581146123d4575f80fd5b5f8060408385031215612882575f80fd5b82516001600160401b0380821115612898575f80fd5b90840190606082870312156128ab575f80fd5b6128b36123ed565b825181526020808401516128c681612538565b828201526040840151838111156128db575f80fd5b80850194505087601f8501126128ef575f80fd5b835192506128ff6124d484612445565b8381528882858701011115612912575f80fd5b6129218483830184880161280e565b80604084015250819550612936818801612862565b9450505050509250929050565b818103818111156126fe576126fe6126d7565b80820281158282048414176126fe576126fe6126d7565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190808211156129a1576129a16126d7565b5092915050565b6001600160401b038181168382160280821691908281146129cb576129cb6126d7565b505092915050565b5f6001600160401b03808416806129f857634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a1581846020870161280e565b9190910192915050565b5f6001600160401b03808316818103612a3a57612a3a6126d7565b6001019392505050565b5f60208284031215612a54575f80fd5b813560ff81168114612531575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612be9380380612be983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a9c8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046123b2565b61023f565b005b6101226100f23660046123b2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612476565b6103a0565b6100e2610156366004612519565b6103c0565b61016e6101693660046123b2565b6103cd565b6040516001600160401b03909116815260200161012c565b6100e26103e1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123b2565b6103f4565b6100e26101f3366004612519565b6103fd565b6101ba6005600160991b0181565b6100e26102143660046123b2565b6105ba565b6100e2610227366004612557565b610689565b6100e261023a366004612593565b610797565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a70833981519152929190610287906125ae565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125e6565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125fa565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612684565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610c97565b5050565b5f6103d782611024565b60a0015192915050565b6103e96107d4565b6103f25f611116565b565b6103c981611186565b5f80516020612a708339815191525f6104158361155c565b90505f80610426836040015161173d565b91509150806104885760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600585016020526040812080546104a2906125ae565b90501180156104d4575060015f83815260078601602052604090205460ff1660058111156104d2576104d26125e6565b145b6104f05760405162461bcd60e51b81526004016103199061269b565b5f82815260058501602052604081206105089161231f565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a70833981519152929190610602906125ae565b9050118015610634575060015f83815260078301602052604090205460ff166005811115610632576106326125e6565b145b6106505760405162461bcd60e51b81526004016103199061269b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125fa565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106cd5750825b90505f826001600160401b031660011480156106e85750303b155b9050811580156106f6575080155b156107145760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561073e57845460ff60401b1916600160401b1785555b610748878761199c565b831561078e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61079f6107d4565b6001600160a01b0381166107c857604051631e4fbdf760e01b81525f6004820152602401610319565b6107d181611116565b50565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103f25760405163118cdaa760e01b8152336004820152602401610319565b5f6108386119b6565b5f80516020612a70833981519152426001600160401b03851611801561087257506001600160401b038416610870426202a3006126f6565b115b6108d45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b8561092b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600882016020526040902054156109995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610a0985611a00565b5f80610a506040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611ba1565b5f82815260058601602052604090209193509150610a6e828261275a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610a9b90859060040161283b565b6020604051808303815f875af1158015610ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adb9190612684565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610b5d57610b5d6125e6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c1e83611f46565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610c9f612356565b5f80516020612a708339815191525f610cb78461155c565b90505f80610cc8836040015161173d565b915091508015610d2d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610d5f57610d5f6125e6565b6005811115610d7057610d706125e6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610df757610df76125e6565b1480610e155750600182516005811115610e1357610e136125e6565b145b610e745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610e8957610e896125e6565b03610eb057505f8381526006860160205260408120600491610eab919061231f565b610eb4565b5060055b6020808301515f90815260088801909152604081205581816005811115610edd57610edd6125e6565b90816005811115610ef057610ef06125e6565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610f2457610f246125e6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610fef57610fef6125e6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61102c612356565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040908190208151610100810190925280545f80516020612a70833981519152929190829060ff16600581111561108d5761108d6125e6565b600581111561109e5761109e6125e6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61118e612356565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a7083398151915293929190829060ff1660058111156111ef576111ef6125e6565b6005811115611200576112006125e6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611288576112886125e6565b146112e45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b03161461135e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b61136b8160a00151611a00565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156113af576113af6125e6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61147b8561147581611f46565b5f611ff3565b5f8681526006850160205260409020909150611497828261275a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906114c490859060040161283b565b6020604051808303815f875af11580156114e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115049190612684565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612a708339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115f8919081019061287c565b915091508061165f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146116c25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146117a25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156117f1576117b981600161294e565b6117c4906008612961565b61ffff168582815181106117da576117da612978565b016020015160f81c901b91909117906001016117a5565b5061ffff8116156118505760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156118ab5761186781600361294e565b611872906008612961565b63ffffffff16866118848360026126f6565b8151811061189457611894612978565b016020015160f81c901b9190911790600101611853565b5063ffffffff81166002146119125760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156119675761192981601f61294e565b611934906008612961565b876119408360066126f6565b8151811061195057611950612978565b016020015160f81c901b9190911790600101611915565b505f8660268151811061197c5761197c612978565b016020015191976001600160f81b03199092161515965090945050505050565b6119a4612210565b6119ad82612259565b6103c98161227a565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016119fa57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a708339815191529060ff165f03611a3e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a86908361294e565b10611aa2576001600160401b0384166040830152808252611ac1565b8382604001818151611ab4919061298c565b6001600160401b03169052505b5f826020015183604001516064611ad891906129b3565b611ae291906129de565b600285015490915060ff9081169082161115611b5d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c0b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c8257611c4281600161294e565b611c4d906008612961565b5081515f90839083908110611c6457611c64612978565b60200101906001600160f81b03191690815f1a905350600101611c2e565b505f5b6004811015611ce057611c9981600361294e565b611ca4906008612961565b505f82611cb28360026126f6565b81518110611cc257611cc2612978565b60200101906001600160f81b03191690815f1a905350600101611c85565b505f5b6020811015611d3d5784518160208110611cff57611cff612978565b1a60f81b82611d0f8360066126f6565b81518110611d1f57611d1f612978565b60200101906001600160f81b03191690815f1a905350600101611ce3565b505f5b6020811015611d9d5784602001518160208110611d5f57611d5f612978565b1a60f81b82611d6f8360266126f6565b81518110611d7f57611d7f612978565b60200101906001600160f81b03191690815f1a905350600101611d40565b505f5b6008811015611e1157611db481600761294e565b611dbf906008612961565b60ff1685604001516001600160401b0316901c60f81b82826046611de391906126f6565b81518110611df357611df3612978565b60200101906001600160f81b03191690815f1a905350600101611da0565b505f5b6030811015611e7c5784608001518181518110611e3357611e33612978565b01602001516001600160f81b03191682611e4e83604e6126f6565b81518110611e5e57611e5e612978565b60200101906001600160f81b03191690815f1a905350600101611e14565b505f5b6008811015611eee57611e9381600761294e565b611e9e906008612961565b60608601516001600160401b0390811691161c60f81b82611ec083607e6126f6565b81518110611ed057611ed0612978565b60200101906001600160f81b03191690815f1a905350600101611e7f565b50600281604051611eff9190612a0f565b602060405180830381855afa158015611f1a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f3d9190612684565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a70833981519152916001600160401b0390911690819084611f9e83612a2a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561206c5761202c81600161294e565b612037906008612961565b5081515f9083908390811061204e5761204e612978565b60200101906001600160f81b03191690815f1a905350600101612018565b505f5b60048110156120cf5761208381600361294e565b61208e906008612961565b6001901c60f81b826120a18360026126f6565b815181106120b1576120b1612978565b60200101906001600160f81b03191690815f1a90535060010161206f565b505f5b6020811015612131576120e681601f61294e565b6120f1906008612961565b86901c60f81b826121038360066126f6565b8151811061211357612113612978565b60200101906001600160f81b03191690815f1a9053506001016120d2565b505f5b600881101561219c5761214881600761294e565b612153906008612961565b6001600160401b038616901c60f81b8261216e8360266126f6565b8151811061217e5761217e612978565b60200101906001600160f81b03191690815f1a905350600101612134565b505f5b6008811015612207576121b381600761294e565b6121be906008612961565b6001600160401b038516901c60f81b826121d983602e6126f6565b815181106121e9576121e9612978565b60200101906001600160f81b03191690815f1a90535060010161219f565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103f257604051631afcd79f60e31b815260040160405180910390fd5b612261612210565b61226961228b565b61227161229b565b6107d1816122a3565b612282612210565b6107d18161230f565b612293612210565b6103f2612317565b6103f2612210565b6122ab612210565b80355f80516020612a7083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122f56060830160408401612a4f565b600291909101805460ff191660ff90921691909117905550565b61079f612210565b611fcd612210565b50805461232b906125ae565b5f825580601f1061233a575050565b601f0160209004905f5260205f20908101906107d1919061239a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156123ae575f815560010161239b565b5090565b5f602082840312156123c2575f80fd5b5035919050565b80356001600160401b03811681146123df575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561241a5761241a6123e4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612448576124486123e4565b604052919050565b5f6001600160401b03821115612468576124686123e4565b50601f01601f191660200190565b5f805f8060808587031215612489575f80fd5b612492856123c9565b9350602085013592506124a7604086016123c9565b915060608501356001600160401b038111156124c1575f80fd5b8501601f810187136124d1575f80fd5b80356124e46124df82612450565b612420565b8181528860208385010111156124f8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612529575f80fd5b813563ffffffff8116811461253c575f80fd5b9392505050565b6001600160a01b03811681146107d1575f80fd5b5f808284036080811215612569575f80fd5b6060811215612576575f80fd5b50829150606083013561258881612543565b809150509250929050565b5f602082840312156125a3575f80fd5b813561253c81612543565b600181811c908216806125c257607f821691505b6020821081036125e057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461260c816125ae565b806020870152604060018084165f811461262d576001811461264957612676565b60ff19851660408a0152604084151560051b8a01019550612676565b895f5260205f205f5b8581101561266d5781548b8201860152908301908801612652565b8a016040019650505b509398975050505050505050565b5f60208284031215612694575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612709576127096126e2565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156127345750805b601f840160051c820191505b81811015612753575f8155600101612740565b5050505050565b81516001600160401b03811115612773576127736123e4565b6127878161278184546125ae565b8461270f565b602080601f8311600181146127ba575f84156127a35750858301515b5f19600386901b1c1916600185901b178555612811565b5f85815260208120601f198616915b828110156127e8578886015182559484019460019091019084016127c9565b508582101561280557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561283357818101518382015260200161281b565b50505f910152565b602081525f8251806020840152612859816040850160208701612819565b601f01601f19169190910160400192915050565b805180151581146123df575f80fd5b5f806040838503121561288d575f80fd5b82516001600160401b03808211156128a3575f80fd5b90840190606082870312156128b6575f80fd5b6128be6123f8565b825181526020808401516128d181612543565b828201526040840151838111156128e6575f80fd5b80850194505087601f8501126128fa575f80fd5b8351925061290a6124df84612450565b838152888285870101111561291d575f80fd5b61292c84838301848801612819565b8060408401525081955061294181880161286d565b9450505050509250929050565b81810381811115612709576127096126e2565b8082028115828204841417612709576127096126e2565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190808211156129ac576129ac6126e2565b5092915050565b6001600160401b038181168382160280821691908281146129d6576129d66126e2565b505092915050565b5f6001600160401b0380841680612a0357634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a20818460208701612819565b9190910192915050565b5f6001600160401b03808316818103612a4557612a456126e2565b6001019392505050565b5f60208284031215612a5f575f80fd5b813560ff8116811461253c575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 981a9db95..752069164 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -21,11 +21,10 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 uptime, uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 1000; + return (stakeAmount * rewardBasisPoints * uptime) / SECONDS_IN_YEAR / 1000; } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 302c1da6d..fcd905f54 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -35,6 +35,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; /// @notice Maps the delegationID to pending end delegator messages. mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; + /// @notice Maps the delegationID to its pending staking rewards. + mapping(bytes32 delegationID => uint256) _pendingDelegatorRewards; + /// @notice Maps the validator owner address to its pending staking rewards. + mapping(address validatorOwner => uint256) _pendingValidatorRewards; } // solhint-enable private-vars-leading-underscore @@ -88,23 +92,25 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { + uint64 uptime; if (includeUptimeProof) { - _getUptime(validationID, messageIndex); + uptime = _getUptime(validationID, messageIndex); } - // TODO: Calculate the reward for the validator, but do not unlock it - _initializeEndValidation(validationID); + Validator memory validator = _initializeEndValidation(validationID); + + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + $._pendingValidatorRewards[validator.owner] = + $._rewardCalculator.calculateReward(validator.weight, uptime, 0, 0); } function completeEndValidation(uint32 messageIndex) external { Validator memory validator = _completeEndValidation(messageIndex); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - uint256 rewardAmount = $._rewardCalculator.calculateReward( - validator.weight, validator.startedAt, validator.endedAt, 0, 0 - ); - _reward(validator.owner, rewardAmount); + _reward(validator.owner, $._pendingValidatorRewards[validator.owner]); + delete $._pendingValidatorRewards[validator.owner]; _unlock(validator.startingWeight, validator.owner); } @@ -272,15 +278,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); bytes32 validationID = $._delegatorStakes[delegationID].validationID; + Delegator memory delegator = $._delegatorStakes[delegationID]; + uint64 uptime; if (includeUptimeProof) { uptime = _getUptime(validationID, messageIndex); } - - // TODO: Calculate the delegator's reward, but do not unlock it + $._pendingDelegatorRewards[delegationID] = + $._rewardCalculator.calculateReward(delegator.weight, uptime, 0, 0); // Ensure the delegator is active - Delegator memory delegator = $._delegatorStakes[delegationID]; require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" ); @@ -365,10 +372,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Delegator memory delegator = $._delegatorStakes[delegationID]; _unlock(delegator.weight, delegator.owner); - uint256 rewardAmount = $._rewardCalculator.calculateReward( - delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 - ); - _reward(delegator.owner, rewardAmount); + _reward(delegator.owner, $._pendingDelegatorRewards[delegationID]); + delete $._pendingDelegatorRewards[delegationID]; emit DelegationEnded(delegationID, validationID, nonce); } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index d70b145fd..510fb9607 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -210,7 +210,11 @@ abstract contract ValidatorManager is * Any rewards for this validation period will stop accruing when this function is called. * @param validationID The ID of the validation being ended. */ - function _initializeEndValidation(bytes32 validationID) internal virtual { + function _initializeEndValidation(bytes32 validationID) + internal + virtual + returns (Validator memory) + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the validation period is active. @@ -244,6 +248,8 @@ abstract contract ValidatorManager is // Emit the event to signal the start of the validator removal process. emit ValidatorRemovalInitialized(validationID, messageID, validator.weight, block.timestamp); + + return validator; } /** diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index 51fffb6a7..c06bf3bec 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -8,8 +8,7 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 uptime, uint256 initialSupply, uint256 endSupply ) external view returns (uint256); diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index dcee84052..b51a699f0 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -22,7 +22,7 @@ contract ExampleRewardCalculatorTest is Test { function testRewardCalculation() public view { uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 + DEFAULT_STAKE_AMOUNT, DEFAULT_END_TIME - DEFAULT_START_TIME, 0, 0 ); assertEq(output, 42e9); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 7629c6343..68cdcc5ea 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -55,6 +55,19 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); + function testInitializeEndValidation() public override { + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); + } + function testInvalidUptimeWarpMessage() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -328,6 +341,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -362,6 +376,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -372,6 +387,23 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.resendEndDelegation(delegationID); } + function testResendEndValidation() public override { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + validatorManager.resendEndValidatorMessage(validationID); + } + function testCompleteEndDelegation() public virtual { uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day @@ -404,6 +436,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: uint64(registrationExpiry), expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -473,6 +506,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -481,6 +515,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -547,6 +582,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -555,6 +591,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -576,7 +613,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: uint64(registrationExpiry) + completionTimestamp: uint64(registrationExpiry), + includeUptime: true }); uint256 balanceBefore = _getStakeAssetBalance(address(this)); @@ -616,7 +654,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function _initializeEndValidation(bytes32 validationID) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, false, 0); + return posValidatorManager.initializeEndValidation(validationID, true, 0); } function _initializeDelegatorRegistration( @@ -686,6 +724,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID, address delegatorAddress, bytes32 delegationID, + uint64 startDelegationTimestamp, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -694,6 +733,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, endDelegationTimestamp - startDelegationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRemovalInitialized({ @@ -705,7 +749,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { setWeightMessageID: bytes32(0) }); vm.prank(delegatorAddress); - posValidatorManager.initializeEndDelegation(delegationID, false, 0); + posValidatorManager.initializeEndDelegation(delegationID, true, 0); return delegationID; } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 28fdd64c2..1f8afce00 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -127,7 +127,7 @@ abstract contract ValidatorManagerTest is Test { }); } - function testInitializeEndValidation() public { + function testInitializeEndValidation() public virtual { _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -143,7 +143,7 @@ abstract contract ValidatorManagerTest is Test { // TODO: implement } - function testResendEndValidation() public { + function testResendEndValidation() public virtual { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -258,6 +258,28 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 registrationTimestamp, uint64 completionTimestamp + ) internal returns (bytes32 validationID) { + return _setUpInitializeEndValidation({ + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + blsPublicKey: blsPublicKey, + registrationTimestamp: registrationTimestamp, + completionTimestamp: completionTimestamp, + includeUptime: false + }); + } + + function _setUpInitializeEndValidation( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory blsPublicKey, + uint64 registrationTimestamp, + uint64 completionTimestamp, + bool includeUptime ) internal returns (bytes32 validationID) { validationID = _setUpCompleteValidatorRegistration({ nodeID: nodeID, @@ -272,6 +294,13 @@ abstract contract ValidatorManagerTest is Test { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + if (includeUptime) { + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, registrationExpiry - registrationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + } vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); @@ -320,10 +349,14 @@ abstract contract ValidatorManagerTest is Test { } function _mockGetBlockchainID() internal { + _mockGetBlockchainID(DEFAULT_SOURCE_BLOCKCHAIN_ID); + } + + function _mockGetBlockchainID(bytes32 blockchainID) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector), - abi.encode(DEFAULT_SOURCE_BLOCKCHAIN_ID) + abi.encode(blockchainID) ); vm.expectCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector) From f26ecbe8cb75b19247396aa0c083b48ab5f2f02c Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 11 Sep 2024 18:39:13 +0000 Subject: [PATCH 05/36] increment validator rewards, not overwrite them addresses review comment https://github.com/ava-labs/teleporter/pull/534#discussion_r1755308871 --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f3eab1c63..ccb2c92c9 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614b72380380614b7283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a258061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614071565b6102d6565b005b6101286101383660046140ac565b6107ff565b61017b61014b3660046140ac565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c3660046140ac565b61095b565b6101286101af3660046140d7565b6109c8565b6101c76101c23660046140ac565b610aac565b6040516001600160401b039091168152602001610185565b6101286101ed366004614114565b610ac2565b61012861020036600461412d565b610b61565b61017b61021336600461416b565b610d52565b6101c76102263660046140ac565b610d6b565b6101286102393660046140ac565b610d7f565b61012861024c366004614071565b610dec565b61017b61025f366004614216565b610ed8565b61012861027236600461412d565b610efd565b61017b6102853660046142b2565b61115b565b610128610298366004614114565b61116e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d13660046140ac565b61132b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f80516020614979833981519152949193919290829060ff16600481111561033e5761033e6142d2565b600481111561034f5761034f6142d2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f85156103d5576103d283866113fa565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610447573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046b91906142e6565b5f888152600686016020526040902055600282516004811115610490576104906142d2565b146104e25760405162461bcd60e51b815260206004820152602a60248201525f805160206149998339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105475760405162461bcd60e51b815260206004820152603360248201525f805160206149998339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104d9565b5f61055184611696565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561059e5761059e6142d2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106708561170a565b905083606001516001600160401b03168160a001516001600160401b0316116106e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104d9565b5f84606001518260a001516106fc9190614311565b905061070886826117e9565b5f610714878584611831565b5f8c815260058a016020526040902090915061073082826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061075d90859060040161449c565b6020604051808303815f875af1158015610779573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079d91906142e6565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149b983398151915292919061084790614338565b9050118015610879575060035f83815260078301602052604090205460ff166005811115610877576108776142d2565b145b6108dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104d9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6020604051808303815f875af1158015610932573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095691906142e6565b505050565b61096481611a4e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a11575080546001600160401b03808416911610155b15610a2f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5a8484611b21565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610abc64e8d4a510008361456c565b92915050565b5f610acc82611b3b565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205291909120549192505f8051602061497983398151915291610b259190611ec8565b604080830180516001600160a01b03165f908152600784016020529182209190915560608301519051610956916001600160401b031690611f3e565b5f805160206149798339815191525f610b7984611f61565b90505f80610b8a8360400151612142565b5091509150610b988561237d565b5f8581526004850160205260408120610bb091613fb9565b5f610bba8361170a565b9050816001600160401b031681608001516001600160401b03161015610bf25760405162461bcd60e51b81526004016104d99061457f565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c375760405162461bcd60e51b81526004016104d9906145c1565b60015f87815260038701602052604090205460ff166004811115610c5d57610c5d6142d2565b14610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104d9565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061460a565b5f610d758261170a565b60a0015192915050565b610d888161237d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b5f8215610e0057610dfd84836113fa565b90505b5f610e0a85612456565b90505f5f80516020614979833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610e8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb391906142e6565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f80610ee386612819565b9050610ef1858286866128c6565b9150505b949350505050565b5f805160206149798339815191525f610f1584611f61565b90505f80610f268360400151612142565b5091509150610f3485611a4e565b5f8581526005850160205260408120610f4c91613fb9565b5f610f568361170a565b9050816001600160401b031681608001516001600160401b03161015610f8e5760405162461bcd60e51b81526004016104d99061457f565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fcc5760405162461bcd60e51b81526004016104d9906145c1565b60035f87815260038701602052604090205460ff166004811115610ff257610ff26142d2565b146110465760405162461bcd60e51b815260206004820152603160248201525f805160206149998339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104d9565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110ea9190611f3e565b61110b8160200151876006015f8a81526020019081526020015f2054611ec8565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611167833384612d1b565b9392505050565b5f805160206149b98339815191525f61118683611f61565b90505f8061119783604001516130d6565b91509150806111f95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104d9565b5f8281526005850160205260408120805461121390614338565b9050118015611245575060015f83815260078601602052604090205460ff166005811115611243576112436142d2565b145b6112615760405162461bcd60e51b81526004016104d990614621565b5f828152600585016020526040812061127991613fb9565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149b983398151915292919061137390614338565b90501180156113a5575060015f83815260078301602052604090205460ff1660058111156113a3576113a36142d2565b145b6113c15760405162461bcd60e51b81526004016104d990614621565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611445573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146c9190810190614673565b91509150806114cf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104d9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611512573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906142e6565b82511461159a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104d9565b60208201516001600160a01b0316156116105760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104d9565b5f8061161f8460400151613277565b9150915081871461168c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104d9565b9695505050505050565b5f8181525f805160206149f98339815191526020526040812060030180545f805160206149b9833981519152916001600160401b03909116908190846116db83614745565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611712613ff0565b5f8281525f805160206149f98339815191526020526040908190208151610100810190925280545f805160206149b9833981519152929190829060ff166005811115611760576117606142d2565b6005811115611771576117716142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206149f9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118aa5761186a81600161476a565b61187590600861460a565b5081515f9083908390811061188c5761188c61477d565b60200101906001600160f81b03191690815f1a905350600101611856565b505f5b600481101561190d576118c181600361476a565b6118cc90600861460a565b6001901c60f81b826118df836002614791565b815181106118ef576118ef61477d565b60200101906001600160f81b03191690815f1a9053506001016118ad565b505f5b602081101561196f5761192481601f61476a565b61192f90600861460a565b86901c60f81b82611941836006614791565b815181106119515761195161477d565b60200101906001600160f81b03191690815f1a905350600101611910565b505f5b60088110156119da5761198681600761476a565b61199190600861460a565b6001600160401b038616901c60f81b826119ac836026614791565b815181106119bc576119bc61477d565b60200101906001600160f81b03191690815f1a905350600101611972565b505f5b6008811015611a45576119f181600761476a565b6119fc90600861460a565b6001600160401b038516901c60f81b82611a1783602e614791565b81518110611a2757611a2761477d565b60200101906001600160f81b03191690815f1a9053506001016119dd565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614979833981519152929190611a9690614338565b9050118015611ac8575060035f83815260038301602052604090205460ff166004811115611ac657611ac66142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603360248201525f8051602061499983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104d9565b5050565b611b2961344f565b611b328261349a565b611b1d816134e0565b611b43613ff0565b5f805160206149b98339815191525f611b5b84611f61565b90505f80611b6c83604001516130d6565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104d9565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c036142d2565b6005811115611c1457611c146142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b6142d2565b1480611cb95750600182516005811115611cb757611cb76142d2565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104d9565b600382516005811115611d2d57611d2d6142d2565b03611d5457505f8381526006860160205260408120600491611d4f9190613fb9565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d816142d2565b90816005811115611d9457611d946142d2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc86142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e936142d2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061495983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611f23575f80fd5b505af1158015611f35573d5f803e3d5ffd5b50505050505050565b5f8051602061495983398151915254611b1d906001600160a01b03168284613581565b60408051606080820183525f8083526020830181905292820152905f805160206149b98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fd6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ffd9190810190614673565b91509150806120645760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104d9565b82548251146120c75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104d9565b60208201516001600160a01b03161561213a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104d9565b509392505050565b5f805f83516036146121665760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156121b55761217d81600161476a565b61218890600861460a565b61ffff1686828151811061219e5761219e61477d565b016020015160f81c901b9190911790600101612169565b5061ffff8116156121d85760405162461bcd60e51b81526004016104d9906147ed565b5f805b6004811015612233576121ef81600361476a565b6121fa90600861460a565b63ffffffff168761220c836002614791565b8151811061221c5761221c61477d565b016020015160f81c901b91909117906001016121db565b5063ffffffff811660031461225a5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156122af5761227181601f61476a565b61227c90600861460a565b88612288836006614791565b815181106122985761229861477d565b016020015160f81c901b919091179060010161225d565b505f805b600881101561230e576122c781600761476a565b6122d290600861460a565b6001600160401b0316896122e7836026614791565b815181106122f7576122f761477d565b016020015160f81c901b91909117906001016122b3565b505f805b600881101561236d5761232681600761476a565b61233190600861460a565b6001600160401b03168a61234683602e614791565b815181106123565761235661477d565b016020015160f81c901b9190911790600101612312565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206149798339815191529291906123c590614338565b90501180156123f7575060015f83815260038301602052604090205460ff1660048111156123f5576123f56142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603860248201525f8051602061499983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104d9565b61245e613ff0565b5f8281525f805160206149f983398151915260205260408082208151610100810190925280545f805160206149b983398151915293929190829060ff1660058111156124ac576124ac6142d2565b60058111156124bd576124bd6142d2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612545576125456142d2565b146125a15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104d9565b60408101516001600160a01b0316336001600160a01b03161461261b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104d9565b6126288160a001516135e0565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561266c5761266c6142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127388561273281611696565b5f611831565b5f868152600685016020526040902090915061275482826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061278190859060040161449c565b6020604051808303815f875af115801561279d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127c191906142e6565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f5f805160206149798339815191528161283284613781565b90505f61283e82610aac565b83549091506001600160401b0382161080159061286857508260010154816001600160401b031611155b610ef55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104d9565b5f6128cf6137a4565b5f805160206149b9833981519152426001600160401b03851611801561290957506001600160401b038416612907426202a300614791565b115b61296b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104d9565b856129c25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104d9565b5f86815260088201602052604090205415612a305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104d9565b8251603014612a975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104d9565b612aa0856135e0565b5f80612ae76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506137db565b5f82815260058601602052604090209193509150612b0582826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3290859060040161449c565b6020604051808303815f875af1158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7291906142e6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612bf457612bf46142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612cb583611696565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610ef560015f805160206149d983398151915255565b5f612d246137a4565b5f612d316101c284613781565b90505f805160206149798339815191525f612d4b8761170a565b9050600281516005811115612d6257612d626142d2565b14612dc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104d9565b5f838260a00151612dd29190614877565b9050612dde88826117e9565b5f612de889611696565b90505f898983604051602001612e309392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e51866135e0565b5f612e5d8b8486611831565b5f8381526004880160205260409020909150612e7982826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ea690859060040161449c565b6020604051808303815f875af1158015612ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee691906142e6565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f9557612f956142d2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061116760015f805160206149d983398151915255565b5f8082516027146130f95760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156131485761311081600161476a565b61311b90600861460a565b61ffff168582815181106131315761313161477d565b016020015160f81c901b91909117906001016130fc565b5061ffff81161561316b5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156131c65761318281600361476a565b61318d90600861460a565b63ffffffff168661319f836002614791565b815181106131af576131af61477d565b016020015160f81c901b919091179060010161316e565b5063ffffffff81166002146131ed5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156132425761320481601f61476a565b61320f90600861460a565b8761321b836006614791565b8151811061322b5761322b61477d565b016020015160f81c901b91909117906001016131f0565b505f866026815181106132575761325761477d565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461329a5760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156132e9576132b181600161476a565b6132bc90600861460a565b61ffff168582815181106132d2576132d261477d565b016020015160f81c901b919091179060010161329d565b5061ffff81161561330c5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156133675761332381600361476a565b61332e90600861460a565b63ffffffff1686613340836002614791565b815181106133505761335061477d565b016020015160f81c901b919091179060010161330f565b5063ffffffff811660041461338e5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156133e3576133a581601f61476a565b6133b090600861460a565b876133bc836006614791565b815181106133cc576133cc61477d565b016020015160f81c901b9190911790600101613391565b505f805b6008811015613442576133fb81600761476a565b61340690600861460a565b6001600160401b03168861341b836026614791565b8151811061342b5761342b61477d565b016020015160f81c901b91909117906001016133e7565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349857604051631afcd79f60e31b815260040160405180910390fd5b565b6134a261344f565b6134ab81613b93565b6134dd606082013560808301356134c860c0850160a0860161416b565b6134d860e0860160c08701614897565b613bb4565b50565b6134e861344f565b5f805160206149598339815191526001600160a01b0382166135615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104d9565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261095691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c0f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149b98339815191529060ff165f0361361e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613666908361476a565b10613682576001600160401b03841660408301528082526136a1565b83826040018181516136949190614877565b6001600160401b03169052505b5f8260200151836040015160646136b891906148b2565b6136c291906148dd565b600285015490915060ff908116908216111561373d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104d9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610abc825f80516020614959833981519152546001600160a01b031690613c70565b5f805160206149d98339815191528054600119016137d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146138455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104d9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156138bc5761387c81600161476a565b61388790600861460a565b5081515f9083908390811061389e5761389e61477d565b60200101906001600160f81b03191690815f1a905350600101613868565b505f5b600481101561391a576138d381600361476a565b6138de90600861460a565b505f826138ec836002614791565b815181106138fc576138fc61477d565b60200101906001600160f81b03191690815f1a9053506001016138bf565b505f5b602081101561397757845181602081106139395761393961477d565b1a60f81b82613949836006614791565b815181106139595761395961477d565b60200101906001600160f81b03191690815f1a90535060010161391d565b505f5b60208110156139d757846020015181602081106139995761399961477d565b1a60f81b826139a9836026614791565b815181106139b9576139b961477d565b60200101906001600160f81b03191690815f1a90535060010161397a565b505f5b6008811015613a4b576139ee81600761476a565b6139f990600861460a565b60ff1685604001516001600160401b0316901c60f81b82826046613a1d9190614791565b81518110613a2d57613a2d61477d565b60200101906001600160f81b03191690815f1a9053506001016139da565b505f5b6030811015613ab65784608001518181518110613a6d57613a6d61477d565b01602001516001600160f81b03191682613a8883604e614791565b81518110613a9857613a9861477d565b60200101906001600160f81b03191690815f1a905350600101613a4e565b505f5b6008811015613b2857613acd81600761476a565b613ad890600861460a565b60608601516001600160401b0390811691161c60f81b82613afa83607e614791565b81518110613b0a57613b0a61477d565b60200101906001600160f81b03191690815f1a905350600101613ab9565b50600281604051613b399190614902565b602060405180830381855afa158015613b54573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613b7791906142e6565b94909350915050565b60015f805160206149d983398151915255565b613b9b61344f565b613ba3613dd2565b613bab613de2565b6134dd81613dea565b613bbc61344f565b5f5f80516020614979833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613c236001600160a01b03841683613e56565b905080515f14158015613c47575080806020019051810190613c45919061491d565b155b1561095657604051635274afe760e01b81526001600160a01b03841660048201526024016104d9565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613cb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cda91906142e6565b9050613cf16001600160a01b038516333086613e63565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d5991906142e6565b9050818111613dbf5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104d9565b613dc9828261476a565b95945050505050565b613dda61344f565b613498613ea2565b61349861344f565b613df261344f565b80355f805160206149b983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e3c6060830160408401614938565b600291909101805460ff191660ff90921691909117905550565b606061116783835f613eaa565b6040516001600160a01b038481166024830152838116604483015260648201839052613e9c9186918216906323b872dd906084016135ae565b50505050565b613b8061344f565b606081471015613ecf5760405163cd78605960e01b81523060048201526024016104d9565b5f80856001600160a01b03168486604051613eea9190614902565b5f6040518083038185875af1925050503d805f8114613f24576040519150601f19603f3d011682016040523d82523d5f602084013e613f29565b606091505b509150915061168c868383606082613f4957613f4482613f90565b611167565b8151158015613f6057506001600160a01b0384163b155b15613f8957604051639996b31560e01b81526001600160a01b03851660048201526024016104d9565b5080611167565b805115613fa05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fc590614338565b5f825580601f10613fd4575050565b601f0160209004905f5260205f20908101906134dd9190614034565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614048575f8155600101614035565b5090565b80151581146134dd575f80fd5b803563ffffffff8116811461406c575f80fd5b919050565b5f805f60608486031215614083575f80fd5b8335925060208401356140958161404c565b91506140a360408501614059565b90509250925092565b5f602082840312156140bc575f80fd5b5035919050565b6001600160a01b03811681146134dd575f80fd5b5f808284036101008112156140ea575f80fd5b60e08112156140f7575f80fd5b5082915060e0830135614109816140c3565b809150509250929050565b5f60208284031215614124575f80fd5b61116782614059565b5f806040838503121561413e575f80fd5b61414783614059565b946020939093013593505050565b80356001600160401b038116811461406c575f80fd5b5f6020828403121561417b575f80fd5b61116782614155565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156141ba576141ba614184565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141e8576141e8614184565b604052919050565b5f6001600160401b0382111561420857614208614184565b50601f01601f191660200190565b5f805f8060808587031215614229575f80fd5b843593506020850135925061424060408601614155565b915060608501356001600160401b0381111561425a575f80fd5b8501601f8101871361426a575f80fd5b803561427d614278826141f0565b6141c0565b818152886020838501011115614291575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142c3575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156142f6575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614331576143316142fd565b5092915050565b600181811c9082168061434c57607f821691505b60208210810361436a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561095657805f5260205f20601f840160051c810160208510156143955750805b601f840160051c820191505b818110156143b4575f81556001016143a1565b5050505050565b81516001600160401b038111156143d4576143d4614184565b6143e8816143e28454614338565b84614370565b602080601f83116001811461441b575f84156144045750858301515b5f19600386901b1c1916600185901b178555614472565b5f85815260208120601f198616915b828110156144495788860151825594840194600190910190840161442a565b508582101561446657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561449457818101518382015260200161447c565b50505f910152565b602081525f82518060208401526144ba81604085016020870161447a565b601f01601f19169190910160400192915050565b5f60208083525f84546144e081614338565b806020870152604060018084165f8114614501576001811461451d5761454a565b60ff19851660408a0152604084151560051b8a0101955061454a565b895f5260205f205f5b858110156145415781548b8201860152908301908801614526565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261457a5761457a614558565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc6142fd565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161406c8161404c565b5f8060408385031215614684575f80fd5b82516001600160401b038082111561469a575f80fd5b90840190606082870312156146ad575f80fd5b6146b5614198565b825181526020808401516146c8816140c3565b828201526040840151838111156146dd575f80fd5b80850194505087601f8501126146f1575f80fd5b83519250614701614278846141f0565b8381528882858701011115614714575f80fd5b6147238483830184880161447a565b80604084015250819550614738818801614668565b9450505050509250929050565b5f6001600160401b03808316818103614760576147606142fd565b6001019392505050565b81810381811115610abc57610abc6142fd565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610abc57610abc6142fd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115614331576143316142fd565b5f602082840312156148a7575f80fd5b8135611167816140c3565b6001600160401b038181168382160280821691908281146148d5576148d56142fd565b505092915050565b5f6001600160401b03808416806148f6576148f6614558565b92169190910492915050565b5f825161491381846020870161447a565b9190910192915050565b5f6020828403121561492d575f80fd5b81516111678161404c565b5f60208284031215614948575f80fd5b813560ff81168114611167575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614b87380380614b8783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a3a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614086565b6102d6565b005b6101286101383660046140c1565b6107ff565b61017b61014b3660046140c1565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c3660046140c1565b61095b565b6101286101af3660046140ec565b6109c8565b6101c76101c23660046140c1565b610aac565b6040516001600160401b039091168152602001610185565b6101286101ed366004614129565b610ac2565b610128610200366004614142565b610b61565b61017b610213366004614180565b610d52565b6101c76102263660046140c1565b610d6b565b6101286102393660046140c1565b610d7f565b61012861024c366004614086565b610dec565b61017b61025f36600461422b565b610eed565b610128610272366004614142565b610f12565b61017b6102853660046142c7565b611170565b610128610298366004614129565b611183565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d13660046140c1565b611340565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f8051602061498e833981519152949193919290829060ff16600481111561033e5761033e6142e7565b600481111561034f5761034f6142e7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f85156103d5576103d2838661140f565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610447573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046b91906142fb565b5f888152600686016020526040902055600282516004811115610490576104906142e7565b146104e25760405162461bcd60e51b815260206004820152602a60248201525f805160206149ae8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105475760405162461bcd60e51b815260206004820152603360248201525f805160206149ae8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104d9565b5f610551846116ab565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561059e5761059e6142e7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106708561171f565b905083606001516001600160401b03168160a001516001600160401b0316116106e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104d9565b5f84606001518260a001516106fc9190614326565b905061070886826117fe565b5f610714878584611846565b5f8c815260058a016020526040902090915061073082826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061075d9085906004016144b1565b6020604051808303815f875af1158015610779573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079d91906142fb565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149ce8339815191529291906108479061434d565b9050118015610879575060035f83815260078301602052604090205460ff166005811115610877576108776142e7565b145b6108dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104d9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144e3565b6020604051808303815f875af1158015610932573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095691906142fb565b505050565b61096481611a63565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061498e833981519152916005600160991b019163ee5b48eb91610916916004016144e3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a11575080546001600160401b03808416911610155b15610a2f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5a8484611b36565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610abc64e8d4a5100083614581565b92915050565b5f610acc82611b50565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205291909120549192505f8051602061498e83398151915291610b259190611edd565b604080830180516001600160a01b03165f908152600784016020529182209190915560608301519051610956916001600160401b031690611f53565b5f8051602061498e8339815191525f610b7984611f76565b90505f80610b8a8360400151612157565b5091509150610b9885612392565b5f8581526004850160205260408120610bb091613fce565b5f610bba8361171f565b9050816001600160401b031681608001516001600160401b03161015610bf25760405162461bcd60e51b81526004016104d990614594565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c375760405162461bcd60e51b81526004016104d9906145d6565b60015f87815260038701602052604090205460ff166004811115610c5d57610c5d6142e7565b14610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104d9565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061461f565b5f610d758261171f565b60a0015192915050565b610d8881612392565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061498e833981519152916005600160991b019163ee5b48eb91610916916004016144e3565b5f8215610e0057610dfd848361140f565b90505b5f610e0a8561246b565b90505f5f8051602061498e833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610e8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb391906142fb565b6040808401516001600160a01b03165f908152600784016020529081208054909190610ee0908490614636565b9091555050505050505050565b5f80610ef88661282e565b9050610f06858286866128db565b9150505b949350505050565b5f8051602061498e8339815191525f610f2a84611f76565b90505f80610f3b8360400151612157565b5091509150610f4985611a63565b5f8581526005850160205260408120610f6191613fce565b5f610f6b8361171f565b9050816001600160401b031681608001516001600160401b03161015610fa35760405162461bcd60e51b81526004016104d990614594565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fe15760405162461bcd60e51b81526004016104d9906145d6565b60035f87815260038701602052604090205460ff166004811115611007576110076142e7565b1461105b5760405162461bcd60e51b815260206004820152603160248201525f805160206149ae8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104d9565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110ff9190611f53565b6111208160200151876006015f8a81526020019081526020015f2054611edd565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f61117c833384612d30565b9392505050565b5f805160206149ce8339815191525f61119b83611f76565b90505f806111ac83604001516130eb565b915091508061120e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104d9565b5f828152600585016020526040812080546112289061434d565b905011801561125a575060015f83815260078601602052604090205460ff166005811115611258576112586142e7565b145b6112765760405162461bcd60e51b81526004016104d990614649565b5f828152600585016020526040812061128e91613fce565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149ce8339815191529291906113889061434d565b90501180156113ba575060015f83815260078301602052604090205460ff1660058111156113b8576113b86142e7565b145b6113d65760405162461bcd60e51b81526004016104d990614649565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144e3565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561145a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611481919081019061469b565b91509150806114e45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104d9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154b91906142fb565b8251146115af5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104d9565b60208201516001600160a01b0316156116255760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104d9565b5f80611634846040015161328c565b915091508187146116a15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104d9565b9695505050505050565b5f8181525f80516020614a0e8339815191526020526040812060030180545f805160206149ce833981519152916001600160401b03909116908190846116f08361476d565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611727614005565b5f8281525f80516020614a0e8339815191526020526040908190208151610100810190925280545f805160206149ce833981519152929190829060ff166005811115611775576117756142e7565b6005811115611786576117866142e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614a0e833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118bf5761187f816001614792565b61188a90600861461f565b5081515f908390839081106118a1576118a16147a5565b60200101906001600160f81b03191690815f1a90535060010161186b565b505f5b6004811015611922576118d6816003614792565b6118e190600861461f565b6001901c60f81b826118f4836002614636565b81518110611904576119046147a5565b60200101906001600160f81b03191690815f1a9053506001016118c2565b505f5b60208110156119845761193981601f614792565b61194490600861461f565b86901c60f81b82611956836006614636565b81518110611966576119666147a5565b60200101906001600160f81b03191690815f1a905350600101611925565b505f5b60088110156119ef5761199b816007614792565b6119a690600861461f565b6001600160401b038616901c60f81b826119c1836026614636565b815181106119d1576119d16147a5565b60200101906001600160f81b03191690815f1a905350600101611987565b505f5b6008811015611a5a57611a06816007614792565b611a1190600861461f565b6001600160401b038516901c60f81b82611a2c83602e614636565b81518110611a3c57611a3c6147a5565b60200101906001600160f81b03191690815f1a9053506001016119f2565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061498e833981519152929190611aab9061434d565b9050118015611add575060035f83815260038301602052604090205460ff166004811115611adb57611adb6142e7565b145b611b325760405162461bcd60e51b815260206004820152603360248201525f805160206149ae83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104d9565b5050565b611b3e613464565b611b47826134af565b611b32816134f5565b611b58614005565b5f805160206149ce8339815191525f611b7084611f76565b90505f80611b8183604001516130eb565b915091508015611be65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104d9565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c1857611c186142e7565b6005811115611c2957611c296142e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cb057611cb06142e7565b1480611cce5750600182516005811115611ccc57611ccc6142e7565b145b611d2d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104d9565b600382516005811115611d4257611d426142e7565b03611d6957505f8381526006860160205260408120600491611d649190613fce565b611d6d565b5060055b6020808301515f90815260088801909152604081205581816005811115611d9657611d966142e7565b90816005811115611da957611da96142e7565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611ddd57611ddd6142e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ea857611ea86142e7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061496e83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611f38575f80fd5b505af1158015611f4a573d5f803e3d5ffd5b50505050505050565b5f8051602061496e83398151915254611b32906001600160a01b03168284613596565b60408051606080820183525f8083526020830181905292820152905f805160206149ce8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611feb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612012919081019061469b565b91509150806120795760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104d9565b82548251146120dc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104d9565b60208201516001600160a01b03161561214f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104d9565b509392505050565b5f805f835160361461217b5760405162461bcd60e51b81526004016104d9906147b9565b5f805b60028110156121ca57612192816001614792565b61219d90600861461f565b61ffff168682815181106121b3576121b36147a5565b016020015160f81c901b919091179060010161217e565b5061ffff8116156121ed5760405162461bcd60e51b81526004016104d990614802565b5f805b600481101561224857612204816003614792565b61220f90600861461f565b63ffffffff1687612221836002614636565b81518110612231576122316147a5565b016020015160f81c901b91909117906001016121f0565b5063ffffffff811660031461226f5760405162461bcd60e51b81526004016104d990614845565b5f805b60208110156122c45761228681601f614792565b61229190600861461f565b8861229d836006614636565b815181106122ad576122ad6147a5565b016020015160f81c901b9190911790600101612272565b505f805b6008811015612323576122dc816007614792565b6122e790600861461f565b6001600160401b0316896122fc836026614636565b8151811061230c5761230c6147a5565b016020015160f81c901b91909117906001016122c8565b505f805b60088110156123825761233b816007614792565b61234690600861461f565b6001600160401b03168a61235b83602e614636565b8151811061236b5761236b6147a5565b016020015160f81c901b9190911790600101612327565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061498e8339815191529291906123da9061434d565b905011801561240c575060015f83815260038301602052604090205460ff16600481111561240a5761240a6142e7565b145b611b325760405162461bcd60e51b815260206004820152603860248201525f805160206149ae83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104d9565b612473614005565b5f8281525f80516020614a0e83398151915260205260408082208151610100810190925280545f805160206149ce83398151915293929190829060ff1660058111156124c1576124c16142e7565b60058111156124d2576124d26142e7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561255a5761255a6142e7565b146125b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104d9565b60408101516001600160a01b0316336001600160a01b0316146126305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104d9565b61263d8160a001516135f5565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612681576126816142e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61274d85612747816116ab565b5f611846565b5f868152600685016020526040902090915061276982826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127969085906004016144b1565b6020604051808303815f875af11580156127b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127d691906142fb565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f5f8051602061498e8339815191528161284784613796565b90505f61285382610aac565b83549091506001600160401b0382161080159061287d57508260010154816001600160401b031611155b610f0a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104d9565b5f6128e46137b9565b5f805160206149ce833981519152426001600160401b03851611801561291e57506001600160401b03841661291c426202a300614636565b115b6129805760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104d9565b856129d75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104d9565b5f86815260088201602052604090205415612a455760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104d9565b8251603014612aac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104d9565b612ab5856135f5565b5f80612afc6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506137f0565b5f82815260058601602052604090209193509150612b1a82826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b479085906004016144b1565b6020604051808303815f875af1158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8791906142fb565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612c0957612c096142e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612cca836116ab565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610f0a60015f805160206149ee83398151915255565b5f612d396137b9565b5f612d466101c284613796565b90505f8051602061498e8339815191525f612d608761171f565b9050600281516005811115612d7757612d776142e7565b14612dd65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104d9565b5f838260a00151612de7919061488c565b9050612df388826117fe565b5f612dfd896116ab565b90505f898983604051602001612e459392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e66866135f5565b5f612e728b8486611846565b5f8381526004880160205260409020909150612e8e82826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ebb9085906004016144b1565b6020604051808303815f875af1158015612ed7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efb91906142fb565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612faa57612faa6142e7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061117c60015f805160206149ee83398151915255565b5f80825160271461310e5760405162461bcd60e51b81526004016104d9906147b9565b5f805b600281101561315d57613125816001614792565b61313090600861461f565b61ffff16858281518110613146576131466147a5565b016020015160f81c901b9190911790600101613111565b5061ffff8116156131805760405162461bcd60e51b81526004016104d990614802565b5f805b60048110156131db57613197816003614792565b6131a290600861461f565b63ffffffff16866131b4836002614636565b815181106131c4576131c46147a5565b016020015160f81c901b9190911790600101613183565b5063ffffffff81166002146132025760405162461bcd60e51b81526004016104d990614845565b5f805b60208110156132575761321981601f614792565b61322490600861461f565b87613230836006614636565b81518110613240576132406147a5565b016020015160f81c901b9190911790600101613205565b505f8660268151811061326c5761326c6147a5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132af5760405162461bcd60e51b81526004016104d9906147b9565b5f805b60028110156132fe576132c6816001614792565b6132d190600861461f565b61ffff168582815181106132e7576132e76147a5565b016020015160f81c901b91909117906001016132b2565b5061ffff8116156133215760405162461bcd60e51b81526004016104d990614802565b5f805b600481101561337c57613338816003614792565b61334390600861461f565b63ffffffff1686613355836002614636565b81518110613365576133656147a5565b016020015160f81c901b9190911790600101613324565b5063ffffffff81166004146133a35760405162461bcd60e51b81526004016104d990614845565b5f805b60208110156133f8576133ba81601f614792565b6133c590600861461f565b876133d1836006614636565b815181106133e1576133e16147a5565b016020015160f81c901b91909117906001016133a6565b505f805b600881101561345757613410816007614792565b61341b90600861461f565b6001600160401b031688613430836026614636565b81518110613440576134406147a5565b016020015160f81c901b91909117906001016133fc565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134ad57604051631afcd79f60e31b815260040160405180910390fd5b565b6134b7613464565b6134c081613ba8565b6134f2606082013560808301356134dd60c0850160a08601614180565b6134ed60e0860160c087016148ac565b613bc9565b50565b6134fd613464565b5f8051602061496e8339815191526001600160a01b0382166135765760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104d9565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261095691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c24565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149ce8339815191529060ff165f03613633575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061367b9083614792565b10613697576001600160401b03841660408301528082526136b6565b83826040018181516136a9919061488c565b6001600160401b03169052505b5f8260200151836040015160646136cd91906148c7565b6136d791906148f2565b600285015490915060ff90811690821611156137525760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104d9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610abc825f8051602061496e833981519152546001600160a01b031690613c85565b5f805160206149ee8339815191528054600119016137ea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461385a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104d9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156138d157613891816001614792565b61389c90600861461f565b5081515f908390839081106138b3576138b36147a5565b60200101906001600160f81b03191690815f1a90535060010161387d565b505f5b600481101561392f576138e8816003614792565b6138f390600861461f565b505f82613901836002614636565b81518110613911576139116147a5565b60200101906001600160f81b03191690815f1a9053506001016138d4565b505f5b602081101561398c578451816020811061394e5761394e6147a5565b1a60f81b8261395e836006614636565b8151811061396e5761396e6147a5565b60200101906001600160f81b03191690815f1a905350600101613932565b505f5b60208110156139ec57846020015181602081106139ae576139ae6147a5565b1a60f81b826139be836026614636565b815181106139ce576139ce6147a5565b60200101906001600160f81b03191690815f1a90535060010161398f565b505f5b6008811015613a6057613a03816007614792565b613a0e90600861461f565b60ff1685604001516001600160401b0316901c60f81b82826046613a329190614636565b81518110613a4257613a426147a5565b60200101906001600160f81b03191690815f1a9053506001016139ef565b505f5b6030811015613acb5784608001518181518110613a8257613a826147a5565b01602001516001600160f81b03191682613a9d83604e614636565b81518110613aad57613aad6147a5565b60200101906001600160f81b03191690815f1a905350600101613a63565b505f5b6008811015613b3d57613ae2816007614792565b613aed90600861461f565b60608601516001600160401b0390811691161c60f81b82613b0f83607e614636565b81518110613b1f57613b1f6147a5565b60200101906001600160f81b03191690815f1a905350600101613ace565b50600281604051613b4e9190614917565b602060405180830381855afa158015613b69573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613b8c91906142fb565b94909350915050565b60015f805160206149ee83398151915255565b613bb0613464565b613bb8613de7565b613bc0613df7565b6134f281613dff565b613bd1613464565b5f5f8051602061498e833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613c386001600160a01b03841683613e6b565b905080515f14158015613c5c575080806020019051810190613c5a9190614932565b155b1561095657604051635274afe760e01b81526001600160a01b03841660048201526024016104d9565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613ccb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cef91906142fb565b9050613d066001600160a01b038516333086613e78565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d6e91906142fb565b9050818111613dd45760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104d9565b613dde8282614792565b95945050505050565b613def613464565b6134ad613eb7565b6134ad613464565b613e07613464565b80355f805160206149ce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e51606083016040840161494d565b600291909101805460ff191660ff90921691909117905550565b606061117c83835f613ebf565b6040516001600160a01b038481166024830152838116604483015260648201839052613eb19186918216906323b872dd906084016135c3565b50505050565b613b95613464565b606081471015613ee45760405163cd78605960e01b81523060048201526024016104d9565b5f80856001600160a01b03168486604051613eff9190614917565b5f6040518083038185875af1925050503d805f8114613f39576040519150601f19603f3d011682016040523d82523d5f602084013e613f3e565b606091505b50915091506116a1868383606082613f5e57613f5982613fa5565b61117c565b8151158015613f7557506001600160a01b0384163b155b15613f9e57604051639996b31560e01b81526001600160a01b03851660048201526024016104d9565b508061117c565b805115613fb55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fda9061434d565b5f825580601f10613fe9575050565b601f0160209004905f5260205f20908101906134f29190614049565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561405d575f815560010161404a565b5090565b80151581146134f2575f80fd5b803563ffffffff81168114614081575f80fd5b919050565b5f805f60608486031215614098575f80fd5b8335925060208401356140aa81614061565b91506140b86040850161406e565b90509250925092565b5f602082840312156140d1575f80fd5b5035919050565b6001600160a01b03811681146134f2575f80fd5b5f808284036101008112156140ff575f80fd5b60e081121561410c575f80fd5b5082915060e083013561411e816140d8565b809150509250929050565b5f60208284031215614139575f80fd5b61117c8261406e565b5f8060408385031215614153575f80fd5b61415c8361406e565b946020939093013593505050565b80356001600160401b0381168114614081575f80fd5b5f60208284031215614190575f80fd5b61117c8261416a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156141cf576141cf614199565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141fd576141fd614199565b604052919050565b5f6001600160401b0382111561421d5761421d614199565b50601f01601f191660200190565b5f805f806080858703121561423e575f80fd5b84359350602085013592506142556040860161416a565b915060608501356001600160401b0381111561426f575f80fd5b8501601f8101871361427f575f80fd5b803561429261428d82614205565b6141d5565b8181528860208385010111156142a6575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142d8575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b5f6020828403121561430b575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561434657614346614312565b5092915050565b600181811c9082168061436157607f821691505b60208210810361437f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561095657805f5260205f20601f840160051c810160208510156143aa5750805b601f840160051c820191505b818110156143c9575f81556001016143b6565b5050505050565b81516001600160401b038111156143e9576143e9614199565b6143fd816143f7845461434d565b84614385565b602080601f831160018114614430575f84156144195750858301515b5f19600386901b1c1916600185901b178555614487565b5f85815260208120601f198616915b8281101561445e5788860151825594840194600190910190840161443f565b508582101561447b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156144a9578181015183820152602001614491565b50505f910152565b602081525f82518060208401526144cf81604085016020870161448f565b601f01601f19169190910160400192915050565b5f60208083525f84546144f58161434d565b806020870152604060018084165f811461451657600181146145325761455f565b60ff19851660408a0152604084151560051b8a0101955061455f565b895f5260205f205f5b858110156145565781548b820186015290830190880161453b565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261458f5761458f61456d565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc614312565b80820180821115610abc57610abc614312565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161408181614061565b5f80604083850312156146ac575f80fd5b82516001600160401b03808211156146c2575f80fd5b90840190606082870312156146d5575f80fd5b6146dd6141ad565b825181526020808401516146f0816140d8565b82820152604084015183811115614705575f80fd5b80850194505087601f850112614719575f80fd5b8351925061472961428d84614205565b838152888285870101111561473c575f80fd5b61474b8483830184880161448f565b80604084015250819550614760818801614690565b9450505050509250929050565b5f6001600160401b0380831681810361478857614788614312565b6001019392505050565b81810381811115610abc57610abc614312565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561434657614346614312565b5f602082840312156148bc575f80fd5b813561117c816140d8565b6001600160401b038181168382160280821691908281146148ea576148ea614312565b505092915050565b5f6001600160401b038084168061490b5761490b61456d565b92169190910492915050565b5f825161492881846020870161448f565b9190910192915050565b5f60208284031215614942575f80fd5b815161117c81614061565b5f6020828403121561495d575f80fd5b813560ff8116811461117c575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index aa09a95c3..caebaf901 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161470438038061470483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145b78061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c70565b610389565b005b348015610134575f80fd5b50610127610143366004613cab565b61046b565b348015610153575f80fd5b50610127610162366004613ce6565b610994565b348015610172575f80fd5b506101b1610181366004613ce6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613ce6565b610af0565b3480156101ee575f80fd5b506102026101fd366004613ce6565b610b5d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613cfd565b610b73565b348015610244575f80fd5b50610127610253366004613d16565b610bf1565b348015610263575f80fd5b506101b1610272366004613d54565b610de2565b348015610282575f80fd5b50610202610291366004613ce6565b610dfb565b3480156102a1575f80fd5b506101276102b0366004613ce6565b610e0f565b3480156102c0575f80fd5b506101276102cf366004613cab565b610e7c565b3480156102df575f80fd5b506101276102ee366004613d16565b610f68565b3480156102fe575f80fd5b5061012761030d366004613cfd565b6111a5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613ce6565b611362565b6101b1610371366004613ce6565b611431565b6101b1610384366004613dff565b61143d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611461565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f8051602061450b833981519152949193919290829060ff1660048111156104d3576104d3613e91565b60048111156104e4576104e4613e91565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561056a576105678386611475565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613ea5565b5f88815260068601602052604090205560028251600481111561062557610625613e91565b146106775760405162461bcd60e51b815260206004820152602a60248201525f8051602061452b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106dc5760405162461bcd60e51b815260206004820152603360248201525f8051602061452b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161066e565b5f6106e684611711565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561073357610733613e91565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61080585611785565b905083606001516001600160401b03168160a001516001600160401b03161161087c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161066e565b5f84606001518260a001516108919190613ed0565b905061089d8682611864565b5f6108a98785846118ac565b5f8c815260058a01602052604090209091506108c58282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906108f2908590600401614055565b6020604051808303815f875af115801561090e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109329190613ea5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061454b8339815191529291906109dc90613ef7565b9050118015610a0e575060035f83815260078301602052604090205460ff166005811115610a0c57610a0c613e91565b145b610a725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161066e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b6020604051808303815f875af1158015610ac7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aeb9190613ea5565b505050565b610af981611ac9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f610b6d64e8d4a5100083614125565b92915050565b5f610b7d82611b9c565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020528251909116815291822091909155606082015190519192505f8051602061450b83398151915291610aeb916001600160401b031690611f29565b5f8051602061450b8339815191525f610c0984611f3c565b90505f80610c1a836040015161211d565b5091509150610c2885612358565b5f8581526004850160205260408120610c4091613bdd565b5f610c4a83611785565b9050816001600160401b031681608001516001600160401b03161015610c825760405162461bcd60e51b815260040161066e90614138565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610cc75760405162461bcd60e51b815260040161066e9061417a565b60015f87815260038701602052604090205460ff166004811115610ced57610ced613e91565b14610d565760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161066e565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b6d6001600160401b03831664e8d4a510006141c3565b5f610e0582611785565b60a0015192915050565b610e1881612358565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f8215610e9057610e8d8483611475565b90505b5f610e9a85612431565b90505f5f8051602061450b833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613ea5565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f8051602061450b8339815191525f610f8084611f3c565b90505f80610f91836040015161211d565b5091509150610f9f85611ac9565b5f8581526005850160205260408120610fb791613bdd565b5f610fc183611785565b9050816001600160401b031681608001516001600160401b03161015610ff95760405162461bcd60e51b815260040161066e90614138565b5f8681526003808701602052604090912001546001600160401b03808416911611156110375760405162461bcd60e51b815260040161066e9061417a565b60035f87815260038701602052604090205460ff16600481111561105d5761105d613e91565b146110b15760405162461bcd60e51b815260206004820152603160248201525f8051602061452b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161066e565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526111559190611f29565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f8051602061454b8339815191525f6111bd83611f3c565b90505f806111ce83604001516127f4565b91509150806112305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161066e565b5f8281526005850160205260408120805461124a90613ef7565b905011801561127c575060015f83815260078601602052604090205460ff16600581111561127a5761127a613e91565b145b6112985760405162461bcd60e51b815260040161066e906141da565b5f82815260058501602052604081206112b091613bdd565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061454b8339815191529291906113aa90613ef7565b90501180156113dc575060015f83815260078301602052604090205460ff1660058111156113da576113da613e91565b145b6113f85760405162461bcd60e51b815260040161066e906141da565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b5f610b6d823334612995565b5f8061144834612d4d565b905061145685828686612df7565b9150505b9392505050565b61146961324c565b61147281613297565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114e79190810190614240565b915091508061154a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161066e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613ea5565b8251146116155760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161066e565b60208201516001600160a01b03161561168b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161066e565b5f8061169a84604001516132da565b915091508187146117075760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161066e565b9695505050505050565b5f8181525f8051602061458b8339815191526020526040812060030180545f8051602061454b833981519152916001600160401b039091169081908461175683614312565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61178d613c14565b5f8281525f8051602061458b8339815191526020526040908190208151610100810190925280545f8051602061454b833981519152929190829060ff1660058111156117db576117db613e91565b60058111156117ec576117ec613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061458b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611925576118e5816001614337565b6118f09060086141c3565b5081515f908390839081106119075761190761434a565b60200101906001600160f81b03191690815f1a9053506001016118d1565b505f5b60048110156119885761193c816003614337565b6119479060086141c3565b6001901c60f81b8261195a83600261435e565b8151811061196a5761196a61434a565b60200101906001600160f81b03191690815f1a905350600101611928565b505f5b60208110156119ea5761199f81601f614337565b6119aa9060086141c3565b86901c60f81b826119bc83600661435e565b815181106119cc576119cc61434a565b60200101906001600160f81b03191690815f1a90535060010161198b565b505f5b6008811015611a5557611a01816007614337565b611a0c9060086141c3565b6001600160401b038616901c60f81b82611a2783602661435e565b81518110611a3757611a3761434a565b60200101906001600160f81b03191690815f1a9053506001016119ed565b505f5b6008811015611ac057611a6c816007614337565b611a779060086141c3565b6001600160401b038516901c60f81b82611a9283602e61435e565b81518110611aa257611aa261434a565b60200101906001600160f81b03191690815f1a905350600101611a58565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061450b833981519152929190611b1190613ef7565b9050118015611b43575060035f83815260038301602052604090205460ff166004811115611b4157611b41613e91565b145b611b985760405162461bcd60e51b815260206004820152603360248201525f8051602061452b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161066e565b5050565b611ba4613c14565b5f8051602061454b8339815191525f611bbc84611f3c565b90505f80611bcd83604001516127f4565b915091508015611c325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161066e565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c6457611c64613e91565b6005811115611c7557611c75613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cfc57611cfc613e91565b1480611d1a5750600182516005811115611d1857611d18613e91565b145b611d795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161066e565b600382516005811115611d8e57611d8e613e91565b03611db557505f8381526006860160205260408120600491611db09190613bdd565b611db9565b5060055b6020808301515f90815260088801909152604081205581816005811115611de257611de2613e91565b90816005811115611df557611df5613e91565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611e2957611e29613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ef457611ef4613e91565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b986001600160a01b038216836134b2565b60408051606080820183525f8083526020830181905292820152905f8051602061454b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fb1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fd89190810190614240565b915091508061203f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161066e565b82548251146120a25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161066e565b60208201516001600160a01b0316156121155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161066e565b509392505050565b5f805f83516036146121415760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561219057612158816001614337565b6121639060086141c3565b61ffff168682815181106121795761217961434a565b016020015160f81c901b9190911790600101612144565b5061ffff8116156121b35760405162461bcd60e51b815260040161066e906143ba565b5f805b600481101561220e576121ca816003614337565b6121d59060086141c3565b63ffffffff16876121e783600261435e565b815181106121f7576121f761434a565b016020015160f81c901b91909117906001016121b6565b5063ffffffff81166003146122355760405162461bcd60e51b815260040161066e906143fd565b5f805b602081101561228a5761224c81601f614337565b6122579060086141c3565b8861226383600661435e565b815181106122735761227361434a565b016020015160f81c901b9190911790600101612238565b505f805b60088110156122e9576122a2816007614337565b6122ad9060086141c3565b6001600160401b0316896122c283602661435e565b815181106122d2576122d261434a565b016020015160f81c901b919091179060010161228e565b505f805b600881101561234857612301816007614337565b61230c9060086141c3565b6001600160401b03168a61232183602e61435e565b815181106123315761233161434a565b016020015160f81c901b91909117906001016122ed565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061450b8339815191529291906123a090613ef7565b90501180156123d2575060015f83815260038301602052604090205460ff1660048111156123d0576123d0613e91565b145b611b985760405162461bcd60e51b815260206004820152603860248201525f8051602061452b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161066e565b612439613c14565b5f8281525f8051602061458b83398151915260205260408082208151610100810190925280545f8051602061454b83398151915293929190829060ff16600581111561248757612487613e91565b600581111561249857612498613e91565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561252057612520613e91565b1461257c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161066e565b60408101516001600160a01b0316336001600160a01b0316146125f65760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161066e565b6126038160a00151613545565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561264757612647613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127138561270d81611711565b5f6118ac565b5f868152600685016020526040902090915061272f8282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061275c908590600401614055565b6020604051808303815f875af1158015612778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061279c9190613ea5565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8082516027146128175760405162461bcd60e51b815260040161066e90614371565b5f805b60028110156128665761282e816001614337565b6128399060086141c3565b61ffff1685828151811061284f5761284f61434a565b016020015160f81c901b919091179060010161281a565b5061ffff8116156128895760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156128e4576128a0816003614337565b6128ab9060086141c3565b63ffffffff16866128bd83600261435e565b815181106128cd576128cd61434a565b016020015160f81c901b919091179060010161288c565b5063ffffffff811660021461290b5760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156129605761292281601f614337565b61292d9060086141c3565b8761293983600661435e565b815181106129495761294961434a565b016020015160f81c901b919091179060010161290e565b505f866026815181106129755761297561434a565b016020015191976001600160f81b03199092161515965090945050505050565b5f61299e6136e6565b5f6129a883610b5d565b90505f8051602061450b8339815191525f6129c287611785565b90506002815160058111156129d9576129d9613e91565b14612a385760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161066e565b5f838260a00151612a499190614444565b9050612a558882611864565b5f612a5f89611711565b90505f898983604051602001612aa79392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612ac886613545565b5f612ad48b84866118ac565b5f8381526004880160205260409020909150612af08282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b1d908590600401614055565b6020604051808303815f875af1158015612b39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5d9190613ea5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c0c57612c0c613e91565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061145a60015f8051602061456b83398151915255565b5f5f8051602061450b8339815191528282612d6782610b5d565b83549091506001600160401b03821610801590612d9157508260010154816001600160401b031611155b612def5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161066e565b949350505050565b5f612e006136e6565b5f8051602061454b833981519152426001600160401b038516118015612e3a57506001600160401b038416612e38426202a30061435e565b115b612e9c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161066e565b85612ef35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161066e565b5f86815260088201602052604090205415612f615760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161066e565b8251603014612fc85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161066e565b612fd185613545565b5f806130186040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613730565b5f828152600586016020526040902091935091506130368282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613063908590600401614055565b6020604051808303815f875af115801561307f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a39190613ea5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561312557613125613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556131e683611711565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612def60015f8051602061456b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661329557604051631afcd79f60e31b815260040160405180910390fd5b565b61329f61324c565b6132a881613ad5565b611472606082013560808301356132c560c0850160a08601613d54565b6132d560e0860160c08701614464565b613af6565b5f808251602e146132fd5760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561334c57613314816001614337565b61331f9060086141c3565b61ffff168582815181106133355761333561434a565b016020015160f81c901b9190911790600101613300565b5061ffff81161561336f5760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156133ca57613386816003614337565b6133919060086141c3565b63ffffffff16866133a383600261435e565b815181106133b3576133b361434a565b016020015160f81c901b9190911790600101613372565b5063ffffffff81166004146133f15760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156134465761340881601f614337565b6134139060086141c3565b8761341f83600661435e565b8151811061342f5761342f61434a565b016020015160f81c901b91909117906001016133f4565b505f805b60088110156134a55761345e816007614337565b6134699060086141c3565b6001600160401b03168861347e83602661435e565b8151811061348e5761348e61434a565b016020015160f81c901b919091179060010161344a565b5090969095509350505050565b804710156134d55760405163cd78605960e01b815230600482015260240161066e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461351e576040519150601f19603f3d011682016040523d82523d5f602084013e613523565b606091505b5050905080610aeb57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061454b8339815191529060ff165f03613583575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135cb9083614337565b106135e7576001600160401b0384166040830152808252613606565b83826040018181516135f99190614444565b6001600160401b03169052505b5f82602001518360400151606461361d919061447f565b61362791906144aa565b600285015490915060ff90811690821611156136a25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161066e565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061456b83398151915280546001190161371757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061456b83398151915255565b5f606082608001515160301461379a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161066e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613811576137d1816001614337565b6137dc9060086141c3565b5081515f908390839081106137f3576137f361434a565b60200101906001600160f81b03191690815f1a9053506001016137bd565b505f5b600481101561386f57613828816003614337565b6138339060086141c3565b505f8261384183600261435e565b815181106138515761385161434a565b60200101906001600160f81b03191690815f1a905350600101613814565b505f5b60208110156138cc578451816020811061388e5761388e61434a565b1a60f81b8261389e83600661435e565b815181106138ae576138ae61434a565b60200101906001600160f81b03191690815f1a905350600101613872565b505f5b602081101561392c57846020015181602081106138ee576138ee61434a565b1a60f81b826138fe83602661435e565b8151811061390e5761390e61434a565b60200101906001600160f81b03191690815f1a9053506001016138cf565b505f5b60088110156139a057613943816007614337565b61394e9060086141c3565b60ff1685604001516001600160401b0316901c60f81b82826046613972919061435e565b815181106139825761398261434a565b60200101906001600160f81b03191690815f1a90535060010161392f565b505f5b6030811015613a0b57846080015181815181106139c2576139c261434a565b01602001516001600160f81b031916826139dd83604e61435e565b815181106139ed576139ed61434a565b60200101906001600160f81b03191690815f1a9053506001016139a3565b505f5b6008811015613a7d57613a22816007614337565b613a2d9060086141c3565b60608601516001600160401b0390811691161c60f81b82613a4f83607e61435e565b81518110613a5f57613a5f61434a565b60200101906001600160f81b03191690815f1a905350600101613a0e565b50600281604051613a8e91906144cf565b602060405180830381855afa158015613aa9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613acc9190613ea5565b94909350915050565b613add61324c565b613ae5613b51565b613aed613b61565b61147281613b69565b613afe61324c565b5f5f8051602061450b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613b5961324c565b613295613bd5565b61329561324c565b613b7161324c565b80355f8051602061454b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bbb60608301604084016144ea565b600291909101805460ff191660ff90921691909117905550565b61371d61324c565b508054613be990613ef7565b5f825580601f10613bf8575050565b601f0160209004905f5260205f20908101906114729190613c58565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c6c575f8155600101613c59565b5090565b5f60e08284031215613c80575f80fd5b50919050565b8015158114611472575f80fd5b803563ffffffff81168114613ca6575f80fd5b919050565b5f805f60608486031215613cbd575f80fd5b833592506020840135613ccf81613c86565b9150613cdd60408501613c93565b90509250925092565b5f60208284031215613cf6575f80fd5b5035919050565b5f60208284031215613d0d575f80fd5b61145a82613c93565b5f8060408385031215613d27575f80fd5b613d3083613c93565b946020939093013593505050565b80356001600160401b0381168114613ca6575f80fd5b5f60208284031215613d64575f80fd5b61145a82613d3e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613da357613da3613d6d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dd157613dd1613d6d565b604052919050565b5f6001600160401b03821115613df157613df1613d6d565b50601f01601f191660200190565b5f805f60608486031215613e11575f80fd5b83359250613e2160208501613d3e565b915060408401356001600160401b03811115613e3b575f80fd5b8401601f81018613613e4b575f80fd5b8035613e5e613e5982613dd9565b613da9565b818152876020838501011115613e72575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613eb5575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ef057613ef0613ebc565b5092915050565b600181811c90821680613f0b57607f821691505b602082108103613c8057634e487b7160e01b5f52602260045260245ffd5b601f821115610aeb57805f5260205f20601f840160051c81016020851015613f4e5750805b601f840160051c820191505b81811015613f6d575f8155600101613f5a565b5050505050565b81516001600160401b03811115613f8d57613f8d613d6d565b613fa181613f9b8454613ef7565b84613f29565b602080601f831160018114613fd4575f8415613fbd5750858301515b5f19600386901b1c1916600185901b17855561402b565b5f85815260208120601f198616915b8281101561400257888601518255948401946001909101908401613fe3565b508582101561401f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561404d578181015183820152602001614035565b50505f910152565b602081525f8251806020840152614073816040850160208701614033565b601f01601f19169190910160400192915050565b5f60208083525f845461409981613ef7565b806020870152604060018084165f81146140ba57600181146140d657614103565b60ff19851660408a0152604084151560051b8a01019550614103565b895f5260205f205f5b858110156140fa5781548b82018601529083019088016140df565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261413357614133614111565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b6d57610b6d613ebc565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611472575f80fd5b8051613ca681613c86565b5f8060408385031215614251575f80fd5b82516001600160401b0380821115614267575f80fd5b908401906060828703121561427a575f80fd5b614282613d81565b8251815260208084015161429581614221565b828201526040840151838111156142aa575f80fd5b80850194505087601f8501126142be575f80fd5b835192506142ce613e5984613dd9565b83815288828587010111156142e1575f80fd5b6142f084838301848801614033565b80604084015250819550614305818801614235565b9450505050509250929050565b5f6001600160401b0380831681810361432d5761432d613ebc565b6001019392505050565b81810381811115610b6d57610b6d613ebc565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b6d57610b6d613ebc565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ef057613ef0613ebc565b5f60208284031215614474575f80fd5b813561145a81614221565b6001600160401b038181168382160280821691908281146144a2576144a2613ebc565b505092915050565b5f6001600160401b03808416806144c3576144c3614111565b92169190910492915050565b5f82516144e0818460208701614033565b9190910192915050565b5f602082840312156144fa575f80fd5b813560ff8116811461145a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161471938038061471983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145cc8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c85565b610389565b005b348015610134575f80fd5b50610127610143366004613cc0565b61046b565b348015610153575f80fd5b50610127610162366004613cfb565b610994565b348015610172575f80fd5b506101b1610181366004613cfb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613cfb565b610af0565b3480156101ee575f80fd5b506102026101fd366004613cfb565b610b5d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613d12565b610b73565b348015610244575f80fd5b50610127610253366004613d2b565b610bf1565b348015610263575f80fd5b506101b1610272366004613d69565b610de2565b348015610282575f80fd5b50610202610291366004613cfb565b610dfb565b3480156102a1575f80fd5b506101276102b0366004613cfb565b610e0f565b3480156102c0575f80fd5b506101276102cf366004613cc0565b610e7c565b3480156102df575f80fd5b506101276102ee366004613d2b565b610f7d565b3480156102fe575f80fd5b5061012761030d366004613d12565b6111ba565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613cfb565b611377565b6101b1610371366004613cfb565b611446565b6101b1610384366004613e14565b611452565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611476565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f80516020614520833981519152949193919290829060ff1660048111156104d3576104d3613ea6565b60048111156104e4576104e4613ea6565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561056a57610567838661148a565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613eba565b5f88815260068601602052604090205560028251600481111561062557610625613ea6565b146106775760405162461bcd60e51b815260206004820152602a60248201525f805160206145408339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106dc5760405162461bcd60e51b815260206004820152603360248201525f805160206145408339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161066e565b5f6106e684611726565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561073357610733613ea6565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6108058561179a565b905083606001516001600160401b03168160a001516001600160401b03161161087c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161066e565b5f84606001518260a001516108919190613ee5565b905061089d8682611879565b5f6108a98785846118c1565b5f8c815260058a01602052604090209091506108c58282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906108f290859060040161406a565b6020604051808303815f875af115801561090e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109329190613eba565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145608339815191529291906109dc90613f0c565b9050118015610a0e575060035f83815260078301602052604090205460ff166005811115610a0c57610a0c613ea6565b145b610a725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161066e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab919060040161409c565b6020604051808303815f875af1158015610ac7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aeb9190613eba565b505050565b610af981611ade565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614520833981519152916005600160991b019163ee5b48eb91610aab9160040161409c565b5f610b6d64e8d4a510008361413a565b92915050565b5f610b7d82611bb1565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020528251909116815291822091909155606082015190519192505f8051602061452083398151915291610aeb916001600160401b031690611f3e565b5f805160206145208339815191525f610c0984611f51565b90505f80610c1a8360400151612132565b5091509150610c288561236d565b5f8581526004850160205260408120610c4091613bf2565b5f610c4a8361179a565b9050816001600160401b031681608001516001600160401b03161015610c825760405162461bcd60e51b815260040161066e9061414d565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610cc75760405162461bcd60e51b815260040161066e9061418f565b60015f87815260038701602052604090205460ff166004811115610ced57610ced613ea6565b14610d565760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161066e565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b6d6001600160401b03831664e8d4a510006141d8565b5f610e058261179a565b60a0015192915050565b610e188161236d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614520833981519152916005600160991b019163ee5b48eb91610aab9160040161409c565b5f8215610e9057610e8d848361148a565b90505b5f610e9a85612446565b90505f5f80516020614520833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613eba565b6040808401516001600160a01b03165f908152600784016020529081208054909190610f709084906141ef565b9091555050505050505050565b5f805160206145208339815191525f610f9584611f51565b90505f80610fa68360400151612132565b5091509150610fb485611ade565b5f8581526005850160205260408120610fcc91613bf2565b5f610fd68361179a565b9050816001600160401b031681608001516001600160401b0316101561100e5760405162461bcd60e51b815260040161066e9061414d565b5f8681526003808701602052604090912001546001600160401b038084169116111561104c5760405162461bcd60e51b815260040161066e9061418f565b60035f87815260038701602052604090205460ff16600481111561107257611072613ea6565b146110c65760405162461bcd60e51b815260206004820152603160248201525f805160206145408339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161066e565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e084015261116a9190611f3e565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f805160206145608339815191525f6111d283611f51565b90505f806111e38360400151612809565b91509150806112455760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161066e565b5f8281526005850160205260408120805461125f90613f0c565b9050118015611291575060015f83815260078601602052604090205460ff16600581111561128f5761128f613ea6565b145b6112ad5760405162461bcd60e51b815260040161066e90614202565b5f82815260058501602052604081206112c591613bf2565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145608339815191529291906113bf90613f0c565b90501180156113f1575060015f83815260078301602052604090205460ff1660058111156113ef576113ef613ea6565b145b61140d5760405162461bcd60e51b815260040161066e90614202565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab919060040161409c565b5f610b6d8233346129aa565b5f8061145d34612d62565b905061146b85828686612e0c565b9150505b9392505050565b61147e613261565b611487816132ac565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114d5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114fc9190810190614268565b915091508061155f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161066e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190613eba565b82511461162a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161066e565b60208201516001600160a01b0316156116a05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161066e565b5f806116af84604001516132ef565b9150915081871461171c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161066e565b9695505050505050565b5f8181525f805160206145a08339815191526020526040812060030180545f80516020614560833981519152916001600160401b039091169081908461176b8361433a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6117a2613c29565b5f8281525f805160206145a08339815191526020526040908190208151610100810190925280545f80516020614560833981519152929190829060ff1660058111156117f0576117f0613ea6565b600581111561180157611801613ea6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145a0833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561193a576118fa81600161435f565b6119059060086141d8565b5081515f9083908390811061191c5761191c614372565b60200101906001600160f81b03191690815f1a9053506001016118e6565b505f5b600481101561199d5761195181600361435f565b61195c9060086141d8565b6001901c60f81b8261196f8360026141ef565b8151811061197f5761197f614372565b60200101906001600160f81b03191690815f1a90535060010161193d565b505f5b60208110156119ff576119b481601f61435f565b6119bf9060086141d8565b86901c60f81b826119d18360066141ef565b815181106119e1576119e1614372565b60200101906001600160f81b03191690815f1a9053506001016119a0565b505f5b6008811015611a6a57611a1681600761435f565b611a219060086141d8565b6001600160401b038616901c60f81b82611a3c8360266141ef565b81518110611a4c57611a4c614372565b60200101906001600160f81b03191690815f1a905350600101611a02565b505f5b6008811015611ad557611a8181600761435f565b611a8c9060086141d8565b6001600160401b038516901c60f81b82611aa783602e6141ef565b81518110611ab757611ab7614372565b60200101906001600160f81b03191690815f1a905350600101611a6d565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614520833981519152929190611b2690613f0c565b9050118015611b58575060035f83815260038301602052604090205460ff166004811115611b5657611b56613ea6565b145b611bad5760405162461bcd60e51b815260206004820152603360248201525f8051602061454083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161066e565b5050565b611bb9613c29565b5f805160206145608339815191525f611bd184611f51565b90505f80611be28360400151612809565b915091508015611c475760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161066e565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c7957611c79613ea6565b6005811115611c8a57611c8a613ea6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d1157611d11613ea6565b1480611d2f5750600182516005811115611d2d57611d2d613ea6565b145b611d8e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161066e565b600382516005811115611da357611da3613ea6565b03611dca57505f8381526006860160205260408120600491611dc59190613bf2565b611dce565b5060055b6020808301515f90815260088801909152604081205581816005811115611df757611df7613ea6565b90816005811115611e0a57611e0a613ea6565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611e3e57611e3e613ea6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f0957611f09613ea6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611bad6001600160a01b038216836134c7565b60408051606080820183525f8083526020830181905292820152905f805160206145608339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fc6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fed9190810190614268565b91509150806120545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161066e565b82548251146120b75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161066e565b60208201516001600160a01b03161561212a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161066e565b509392505050565b5f805f83516036146121565760405162461bcd60e51b815260040161066e90614386565b5f805b60028110156121a55761216d81600161435f565b6121789060086141d8565b61ffff1686828151811061218e5761218e614372565b016020015160f81c901b9190911790600101612159565b5061ffff8116156121c85760405162461bcd60e51b815260040161066e906143cf565b5f805b6004811015612223576121df81600361435f565b6121ea9060086141d8565b63ffffffff16876121fc8360026141ef565b8151811061220c5761220c614372565b016020015160f81c901b91909117906001016121cb565b5063ffffffff811660031461224a5760405162461bcd60e51b815260040161066e90614412565b5f805b602081101561229f5761226181601f61435f565b61226c9060086141d8565b886122788360066141ef565b8151811061228857612288614372565b016020015160f81c901b919091179060010161224d565b505f805b60088110156122fe576122b781600761435f565b6122c29060086141d8565b6001600160401b0316896122d78360266141ef565b815181106122e7576122e7614372565b016020015160f81c901b91909117906001016122a3565b505f805b600881101561235d5761231681600761435f565b6123219060086141d8565b6001600160401b03168a61233683602e6141ef565b8151811061234657612346614372565b016020015160f81c901b9190911790600101612302565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206145208339815191529291906123b590613f0c565b90501180156123e7575060015f83815260038301602052604090205460ff1660048111156123e5576123e5613ea6565b145b611bad5760405162461bcd60e51b815260206004820152603860248201525f8051602061454083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161066e565b61244e613c29565b5f8281525f805160206145a083398151915260205260408082208151610100810190925280545f8051602061456083398151915293929190829060ff16600581111561249c5761249c613ea6565b60058111156124ad576124ad613ea6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561253557612535613ea6565b146125915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161066e565b60408101516001600160a01b0316336001600160a01b03161461260b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161066e565b6126188160a0015161355a565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561265c5761265c613ea6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127288561272281611726565b5f6118c1565b5f86815260068501602052604090209091506127448282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061277190859060040161406a565b6020604051808303815f875af115801561278d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b19190613eba565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80825160271461282c5760405162461bcd60e51b815260040161066e90614386565b5f805b600281101561287b5761284381600161435f565b61284e9060086141d8565b61ffff1685828151811061286457612864614372565b016020015160f81c901b919091179060010161282f565b5061ffff81161561289e5760405162461bcd60e51b815260040161066e906143cf565b5f805b60048110156128f9576128b581600361435f565b6128c09060086141d8565b63ffffffff16866128d28360026141ef565b815181106128e2576128e2614372565b016020015160f81c901b91909117906001016128a1565b5063ffffffff81166002146129205760405162461bcd60e51b815260040161066e90614412565b5f805b60208110156129755761293781601f61435f565b6129429060086141d8565b8761294e8360066141ef565b8151811061295e5761295e614372565b016020015160f81c901b9190911790600101612923565b505f8660268151811061298a5761298a614372565b016020015191976001600160f81b03199092161515965090945050505050565b5f6129b36136fb565b5f6129bd83610b5d565b90505f805160206145208339815191525f6129d78761179a565b90506002815160058111156129ee576129ee613ea6565b14612a4d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161066e565b5f838260a00151612a5e9190614459565b9050612a6a8882611879565b5f612a7489611726565b90505f898983604051602001612abc9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612add8661355a565b5f612ae98b84866118c1565b5f8381526004880160205260409020909150612b058282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3290859060040161406a565b6020604051808303815f875af1158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b729190613eba565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c2157612c21613ea6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061146f60015f8051602061458083398151915255565b5f5f805160206145208339815191528282612d7c82610b5d565b83549091506001600160401b03821610801590612da657508260010154816001600160401b031611155b612e045760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161066e565b949350505050565b5f612e156136fb565b5f80516020614560833981519152426001600160401b038516118015612e4f57506001600160401b038416612e4d426202a3006141ef565b115b612eb15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161066e565b85612f085760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161066e565b5f86815260088201602052604090205415612f765760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161066e565b8251603014612fdd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161066e565b612fe68561355a565b5f8061302d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613745565b5f8281526005860160205260409020919350915061304b8282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061307890859060040161406a565b6020604051808303815f875af1158015613094573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130b89190613eba565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561313a5761313a613ea6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556131fb83611726565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e0460015f8051602061458083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166132aa57604051631afcd79f60e31b815260040160405180910390fd5b565b6132b4613261565b6132bd81613aea565b611487606082013560808301356132da60c0850160a08601613d69565b6132ea60e0860160c08701614479565b613b0b565b5f808251602e146133125760405162461bcd60e51b815260040161066e90614386565b5f805b60028110156133615761332981600161435f565b6133349060086141d8565b61ffff1685828151811061334a5761334a614372565b016020015160f81c901b9190911790600101613315565b5061ffff8116156133845760405162461bcd60e51b815260040161066e906143cf565b5f805b60048110156133df5761339b81600361435f565b6133a69060086141d8565b63ffffffff16866133b88360026141ef565b815181106133c8576133c8614372565b016020015160f81c901b9190911790600101613387565b5063ffffffff81166004146134065760405162461bcd60e51b815260040161066e90614412565b5f805b602081101561345b5761341d81601f61435f565b6134289060086141d8565b876134348360066141ef565b8151811061344457613444614372565b016020015160f81c901b9190911790600101613409565b505f805b60088110156134ba5761347381600761435f565b61347e9060086141d8565b6001600160401b0316886134938360266141ef565b815181106134a3576134a3614372565b016020015160f81c901b919091179060010161345f565b5090969095509350505050565b804710156134ea5760405163cd78605960e01b815230600482015260240161066e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613533576040519150601f19603f3d011682016040523d82523d5f602084013e613538565b606091505b5050905080610aeb57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145608339815191529060ff165f03613598575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135e0908361435f565b106135fc576001600160401b038416604083015280825261361b565b838260400181815161360e9190614459565b6001600160401b03169052505b5f8260200151836040015160646136329190614494565b61363c91906144bf565b600285015490915060ff90811690821611156136b75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161066e565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061458083398151915280546001190161372c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061458083398151915255565b5f60608260800151516030146137af5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161066e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613826576137e681600161435f565b6137f19060086141d8565b5081515f9083908390811061380857613808614372565b60200101906001600160f81b03191690815f1a9053506001016137d2565b505f5b60048110156138845761383d81600361435f565b6138489060086141d8565b505f826138568360026141ef565b8151811061386657613866614372565b60200101906001600160f81b03191690815f1a905350600101613829565b505f5b60208110156138e157845181602081106138a3576138a3614372565b1a60f81b826138b38360066141ef565b815181106138c3576138c3614372565b60200101906001600160f81b03191690815f1a905350600101613887565b505f5b6020811015613941578460200151816020811061390357613903614372565b1a60f81b826139138360266141ef565b8151811061392357613923614372565b60200101906001600160f81b03191690815f1a9053506001016138e4565b505f5b60088110156139b55761395881600761435f565b6139639060086141d8565b60ff1685604001516001600160401b0316901c60f81b8282604661398791906141ef565b8151811061399757613997614372565b60200101906001600160f81b03191690815f1a905350600101613944565b505f5b6030811015613a2057846080015181815181106139d7576139d7614372565b01602001516001600160f81b031916826139f283604e6141ef565b81518110613a0257613a02614372565b60200101906001600160f81b03191690815f1a9053506001016139b8565b505f5b6008811015613a9257613a3781600761435f565b613a429060086141d8565b60608601516001600160401b0390811691161c60f81b82613a6483607e6141ef565b81518110613a7457613a74614372565b60200101906001600160f81b03191690815f1a905350600101613a23565b50600281604051613aa391906144e4565b602060405180830381855afa158015613abe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ae19190613eba565b94909350915050565b613af2613261565b613afa613b66565b613b02613b76565b61148781613b7e565b613b13613261565b5f5f80516020614520833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613b6e613261565b6132aa613bea565b6132aa613261565b613b86613261565b80355f8051602061456083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bd060608301604084016144ff565b600291909101805460ff191660ff90921691909117905550565b613732613261565b508054613bfe90613f0c565b5f825580601f10613c0d575050565b601f0160209004905f5260205f20908101906114879190613c6d565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c81575f8155600101613c6e565b5090565b5f60e08284031215613c95575f80fd5b50919050565b8015158114611487575f80fd5b803563ffffffff81168114613cbb575f80fd5b919050565b5f805f60608486031215613cd2575f80fd5b833592506020840135613ce481613c9b565b9150613cf260408501613ca8565b90509250925092565b5f60208284031215613d0b575f80fd5b5035919050565b5f60208284031215613d22575f80fd5b61146f82613ca8565b5f8060408385031215613d3c575f80fd5b613d4583613ca8565b946020939093013593505050565b80356001600160401b0381168114613cbb575f80fd5b5f60208284031215613d79575f80fd5b61146f82613d53565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613db857613db8613d82565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613de657613de6613d82565b604052919050565b5f6001600160401b03821115613e0657613e06613d82565b50601f01601f191660200190565b5f805f60608486031215613e26575f80fd5b83359250613e3660208501613d53565b915060408401356001600160401b03811115613e50575f80fd5b8401601f81018613613e60575f80fd5b8035613e73613e6e82613dee565b613dbe565b818152876020838501011115613e87575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613eca575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f0557613f05613ed1565b5092915050565b600181811c90821680613f2057607f821691505b602082108103613c9557634e487b7160e01b5f52602260045260245ffd5b601f821115610aeb57805f5260205f20601f840160051c81016020851015613f635750805b601f840160051c820191505b81811015613f82575f8155600101613f6f565b5050505050565b81516001600160401b03811115613fa257613fa2613d82565b613fb681613fb08454613f0c565b84613f3e565b602080601f831160018114613fe9575f8415613fd25750858301515b5f19600386901b1c1916600185901b178555614040565b5f85815260208120601f198616915b8281101561401757888601518255948401946001909101908401613ff8565b508582101561403457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561406257818101518382015260200161404a565b50505f910152565b602081525f8251806020840152614088816040850160208701614048565b601f01601f19169190910160400192915050565b5f60208083525f84546140ae81613f0c565b806020870152604060018084165f81146140cf57600181146140eb57614118565b60ff19851660408a0152604084151560051b8a01019550614118565b895f5260205f205f5b8581101561410f5781548b82018601529083019088016140f4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261414857614148614126565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b6d57610b6d613ed1565b80820180821115610b6d57610b6d613ed1565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611487575f80fd5b8051613cbb81613c9b565b5f8060408385031215614279575f80fd5b82516001600160401b038082111561428f575f80fd5b90840190606082870312156142a2575f80fd5b6142aa613d96565b825181526020808401516142bd81614249565b828201526040840151838111156142d2575f80fd5b80850194505087601f8501126142e6575f80fd5b835192506142f6613e6e84613dee565b8381528882858701011115614309575f80fd5b61431884838301848801614048565b8060408401525081955061432d81880161425d565b9450505050509250929050565b5f6001600160401b0380831681810361435557614355613ed1565b6001019392505050565b81810381811115610b6d57610b6d613ed1565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f0557613f05613ed1565b5f60208284031215614489575f80fd5b813561146f81614249565b6001600160401b038181168382160280821691908281146144b7576144b7613ed1565b505092915050565b5f6001600160401b03808416806144d8576144d8614126565b92169190910492915050565b5f82516144f5818460208701614048565b9190910192915050565b5f6020828403121561450f575f80fd5b813560ff8116811461146f575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index fcd905f54..59857327b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -100,7 +100,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _initializeEndValidation(validationID); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - $._pendingValidatorRewards[validator.owner] = + $._pendingValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward(validator.weight, uptime, 0, 0); } From 6ba67b61e404f1acd7452b6104cac425380c1b37 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 11:17:35 -0400 Subject: [PATCH 06/36] Fixup --- .../staking/tests/NativeTokenStakingManagerTests.t.sol | 2 +- tests/utils/staking.go | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index f32a8f4f6..80a8dfc9b 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -58,7 +58,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { // method and let the implementation in PosValidatorManagerTests do the // test, and remove the `virtual` modifier from that implementation. } - + function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("zero delegation fee")); diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 817359ccd..0c54c81ce 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -158,19 +158,12 @@ func DeployAndInitializeERC20TokenStakingManager( ChurnPeriodSeconds: DefaultChurnPeriodSeconds, MaximumChurnPercentage: DefaultMaxChurnPercentage, }, -<<<<<<< HEAD - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: rewardCalculatorAddress, -======= MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: DefaultMaxStakeMultiplier, - RewardCalculator: common.Address{}, ->>>>>>> staking-contract + RewardCalculator: rewardCalculatorAddress, }, erc20Address, ) From 56304eb85efff09f07602eca664393cf1e8d1aa8 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 11:52:02 -0400 Subject: [PATCH 07/36] Fix tests --- .../tests/PoAValidatorManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 17 ++--------------- .../staking/tests/ValidatorManagerTests.t.sol | 10 +++------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 7ef076bb1..76f6157f5 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -54,7 +54,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(input, weight); } - function _initializeEndValidation(bytes32 validationID) internal virtual override { + function _initializeEndValidation(bytes32 validationID, bool) internal virtual override { return app.initializeEndValidation(validationID); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index f0e9f81b2..cd91bf625 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -158,19 +158,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.initializeEndValidation(validationID, false, 0); } - function testInitializeEndValidation() public override { - _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: false - }); - } - function testInvalidUptimeWarpMessage() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -765,8 +752,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 stakeAmount ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, true, 0); + function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual override { + return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); } function _initializeDelegatorRegistration( diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 2c4843394..180cf70f7 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -144,10 +144,6 @@ abstract contract ValidatorManagerTest is Test { }); } - function testInitializeEndValidationExcessiveChurn() public { - // TODO: implement - } - function testResendEndValidation() public virtual { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, @@ -252,7 +248,7 @@ abstract contract ValidatorManagerTest is Test { // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); - _initializeEndValidation(validationID); + _initializeEndValidation(validationID, false); } function _newNodeID() internal returns (bytes32) { @@ -380,7 +376,7 @@ abstract contract ValidatorManagerTest is Test { vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); - _initializeEndValidation(validationID); + _initializeEndValidation(validationID, includeUptime); } function _testCompleteEndValidation(bytes32 validationID) internal virtual { @@ -444,7 +440,7 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual; + function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; From 08d95b8b2c4d7144b3389e7a7d1c35a78de2bbeb Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 12:18:40 -0400 Subject: [PATCH 08/36] Fix rewards calculator --- .../go/mocks/ExampleERC20/ExampleERC20.go | 2 +- .../ERC20TokenStakingManager.go | 35 +++++++++++- .../ExampleRewardCalculator.go | 28 +++++----- .../NativeTokenStakingManager.go | 35 +++++++++++- contracts/mocks/ExampleERC20.sol | 2 +- contracts/staking/ExampleRewardCalculator.sol | 5 +- contracts/staking/PoSValidatorManager.sol | 53 +++++++++++-------- .../staking/interfaces/IRewardCalculator.sol | 3 +- .../tests/ExamplesRewardCalculatorTests.t.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 5 +- 10 files changed, 125 insertions(+), 47 deletions(-) diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index f3b31c597..2f6a01a04 100644 --- a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go +++ b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go @@ -32,7 +32,7 @@ var ( // ExampleERC20MetaData contains all meta data concerning the ExampleERC20 contract. var ExampleERC20MetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ERC20InsufficientAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InsufficientBalance\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidApprover\",\"inputs\":[{\"name\":\"approver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC20InvalidSpender\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c08061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072c565b60405180910390f35b6101006100fb366004610793565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bb565b6102b6565b604051601281526020016100e4565b610157610152366004610793565b6102d9565b005b6101576101673660046107f4565b610343565b61011461017a36600461080b565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610793565b610350565b6100d7610365565b6101576101bd3660046107f4565b610374565b6101006101d0366004610793565b6103d5565b6101146101e336600461082b565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085c565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085c565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e2565b60019150505b92915050565b5f336102c38582856103f4565b6102ce85858561046f565b506001949350505050565b662386f26fc100008111156103355760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61033f82826104cc565b5050565b61034d3382610500565b50565b61035b8233836103f4565b61033f8282610500565b60606004805461021c9061085c565b662386f26fc100008111156103cb5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032c565b61034d33826104cc565b5f336102aa81858561046f565b6103ef8383836001610534565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610469578181101561045b57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032c565b61046984848484035f610534565b50505050565b6001600160a01b03831661049857604051634b637e8f60e11b81525f600482015260240161032c565b6001600160a01b0382166104c15760405163ec442f0560e01b81525f600482015260240161032c565b6103ef838383610606565b6001600160a01b0382166104f55760405163ec442f0560e01b81525f600482015260240161032c565b61033f5f8383610606565b6001600160a01b03821661052957604051634b637e8f60e11b81525f600482015260240161032c565b61033f825f83610606565b6001600160a01b03841661055d5760405163e602df0560e01b81525f600482015260240161032c565b6001600160a01b03831661058657604051634a1406b160e11b81525f600482015260240161032c565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105f891815260200190565b60405180910390a350505050565b6001600160a01b038316610630578060025f8282546106259190610894565b909155506106a09050565b6001600160a01b0383165f90815260208190526040902054818110156106825760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106bc576002805482900390556106da565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071f91815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156107585785810183015185820160400152820161073c565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461078e575f80fd5b919050565b5f80604083850312156107a4575f80fd5b6107ad83610778565b946020939093013593505050565b5f805f606084860312156107cd575f80fd5b6107d684610778565b92506107e460208501610778565b9150604084013590509250925092565b5f60208284031215610804575f80fd5b5035919050565b5f6020828403121561081b575f80fd5b61082482610778565b9392505050565b5f806040838503121561083c575f80fd5b61084583610778565b915061085360208401610778565b90509250929050565b600181811c9082168061087057607f821691505b60208210810361088e57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c28061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072e565b60405180910390f35b6101006100fb366004610795565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bd565b6102b6565b604051601281526020016100e4565b610157610152366004610795565b6102d9565b005b6101576101673660046107f6565b610344565b61011461017a36600461080d565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610795565b610351565b6100d7610366565b6101576101bd3660046107f6565b610375565b6101006101d0366004610795565b6103d7565b6101146101e336600461082d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085e565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085e565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e4565b60019150505b92915050565b5f336102c38582856103f6565b6102ce858585610471565b506001949350505050565b678ac7230489e800008111156103365760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61034082826104ce565b5050565b61034e3382610502565b50565b61035c8233836103f6565b6103408282610502565b60606004805461021c9061085e565b678ac7230489e800008111156103cd5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032d565b61034e33826104ce565b5f336102aa818585610471565b6103f18383836001610536565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461046b578181101561045d57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032d565b61046b84848484035f610536565b50505050565b6001600160a01b03831661049a57604051634b637e8f60e11b81525f600482015260240161032d565b6001600160a01b0382166104c35760405163ec442f0560e01b81525f600482015260240161032d565b6103f1838383610608565b6001600160a01b0382166104f75760405163ec442f0560e01b81525f600482015260240161032d565b6103405f8383610608565b6001600160a01b03821661052b57604051634b637e8f60e11b81525f600482015260240161032d565b610340825f83610608565b6001600160a01b03841661055f5760405163e602df0560e01b81525f600482015260240161032d565b6001600160a01b03831661058857604051634a1406b160e11b81525f600482015260240161032d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105fa91815260200190565b60405180910390a350505050565b6001600160a01b038316610632578060025f8282546106279190610896565b909155506106a29050565b6001600160a01b0383165f90815260208190526040902054818110156106845760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106be576002805482900390556106dc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161072191815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b8181101561075a5785810183015185820160400152820161073e565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610790575f80fd5b919050565b5f80604083850312156107a6575f80fd5b6107af8361077a565b946020939093013593505050565b5f805f606084860312156107cf575f80fd5b6107d88461077a565b92506107e66020850161077a565b9150604084013590509250925092565b5f60208284031215610806575f80fd5b5035919050565b5f6020828403121561081d575f80fd5b6108268261077a565b9392505050565b5f806040838503121561083e575f80fd5b6108478361077a565b91506108556020840161077a565b90509250929050565b600181811c9082168061087257607f821691505b60208210810361089057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6db31cbaa..a0bb8e748 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -75,8 +75,8 @@ 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161553738038061553783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6153ea8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f3660046148cd565b610357565b005b610154610164366004614908565b610887565b6101a7610177366004614908565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614908565b610a57565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614933565b610a6d565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c366004614971565b610b4c565b61015461024f36600461498a565b610bf0565b6101a76102623660046149c6565b610dc0565b6101e7610275366004614908565b610dd9565b6101546102883660046148cd565b610ded565b61015461029b36600461498a565b610f9b565b6101a76102ae3660046149e1565b6111d9565b6101a76102c1366004614a01565b6111ec565b6101546102d4366004614971565b611218565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614908565b6113d5565b610154610320366004614908565b611662565b6101c2601481565b61034061033b366004614908565b611771565b6040516101b19190614a76565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f8051602061533e833981519152949193919290829060ff1660048111156103bf576103bf614a62565b60048111156103d0576103d0614a62565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f8515610456576104538386611850565b90505b6004848101546060840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156104c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ed9190614b50565b5f88815260098601602052604090205560028251600481111561051257610512614a62565b146105645760405162461bcd60e51b815260206004820152602a60248201525f8051602061535e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105c95760405162461bcd60e51b815260206004820152603360248201525f8051602061535e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161055b565b5f6105d384611aec565b600384526001600160401b0342811660a0860152811660e08501525f8981526006870160205260409020845181549293508592829060ff1916600183600481111561062057610620614a62565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106f285611771565b905083606001516001600160401b03168160a001516001600160401b0316116107695760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161055b565b60028151600581111561077e5761077e614a62565b03610790576107908460600151611b6e565b5f84606001518260a001516107a59190614b7b565b90506107b18682611b7b565b5f6005600160991b0163ee5b48eb6107ca898786611bc3565b6040518263ffffffff1660e01b81526004016107e69190614bbd565b6020604051808303815f875af1158015610802573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108269190614b50565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206153be83398151915260205260408082208151610100810190925280545f8051602061537e83398151915293929190829060ff1660058111156108d5576108d5614a62565b60058111156108e6576108e6614a62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561096b5761096b614a62565b146109d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161055b565b6005600160991b016001600160a01b031663ee5b48eb6109f58584608001515f611bc3565b6040518263ffffffff1660e01b8152600401610a119190614bbd565b6020604051808303815f875af1158015610a2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a519190614b50565b50505050565b5f610a6764e8d4a5100083614bef565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ab6575080546001600160401b03808416911610155b15610ad45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610aff8484611de0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610b5682611dfe565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a60205291909120549192505f8051602061533e83398151915291610baf9190612171565b604080830180516001600160a01b03165f908152600a84016020529182209190915560608301519051610beb916001600160401b0316906121de565b505050565b5f8051602061533e8339815191525f610c0884612201565b90505f80610c1983604001516123e2565b50915091505f610c2883611771565b9050816001600160401b031681608001516001600160401b03161015610c605760405162461bcd60e51b815260040161055b90614c0e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ca55760405162461bcd60e51b815260040161055b90614c50565b60015f87815260068701602052604090205460ff166004811115610ccb57610ccb614a62565b14610d345760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161055b565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a676001600160401b03831664e8d4a51000614c99565b5f610de382611771565b60a0015192915050565b5f8051602061533e8339815191525f610e0585611771565b5f86815260058401602052604090205460c0820151919250610e3791620100009091046001600160401b031690614cb0565b6001600160401b0316421015610eab5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161055b565b5f8415610ebf57610ebc8685611850565b90505b60048381015460a0840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f569190614b50565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610f83908490614cd0565b90915550610f9290508661261d565b50505050505050565b5f8051602061533e8339815191525f610fb384612201565b90505f80610fc483604001516123e2565b50915091505f610fd383611771565b9050816001600160401b031681608001516001600160401b0316101561100b5760405162461bcd60e51b815260040161055b90614c0e565b5f8681526006860160205260409020600301546001600160401b03808416911611156110495760405162461bcd60e51b815260040161055b90614c50565b60035f87815260068701602052604090205460ff16600481111561106f5761106f614a62565b146110c35760405162461bcd60e51b815260206004820152603160248201525f8051602061535e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161055b565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152611168916121de565b6111898160200151876009015f8a81526020019081526020015f2054612171565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f6111e58333846129c6565b9392505050565b5f6111f5612dc4565b611200848484612dfb565b90506111e560015f8051602061539e83398151915255565b5f8051602061537e8339815191525f61123083612201565b90505f806112418360400151613034565b91509150806112a35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161055b565b5f828152600785016020526040812080546112bd90614ce3565b90501180156112ef575060015f83815260088601602052604090205460ff1660058111156112ed576112ed614a62565b145b61130b5760405162461bcd60e51b815260040161055b90614d1b565b5f828152600785016020526040812061132391614815565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061533e83398151915293929190829060ff16600481111561143657611436614a62565b600481111561144757611447614a62565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156114ce576114ce614a62565b14806114ec57506003815160048111156114ea576114ea614a62565b145b6115405760405162461bcd60e51b815260206004820152603260248201525f8051602061535e833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161055b565b5f61154e8260400151611771565b905080608001516001600160401b03165f036115d25760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161055b565b6005600160991b016001600160a01b031663ee5b48eb6115ff846040015184608001518560a00151611bc3565b6040518263ffffffff1660e01b815260040161161b9190614bbd565b6020604051808303815f875af1158015611637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165b9190614b50565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061537e8339815191529291906116aa90614ce3565b90501180156116dc575060015f83815260088301602052604090205460ff1660058111156116da576116da614a62565b145b6116f85760405162461bcd60e51b815260040161055b90614d1b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117319190600401614d62565b6020604051808303815f875af115801561174d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610beb9190614b50565b61177961484c565b5f8281525f805160206153be8339815191526020526040908190208151610100810190925280545f8051602061537e833981519152929190829060ff1660058111156117c7576117c7614a62565b60058111156117d8576117d8614a62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561189b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118c29190810190614e63565b91509150806119255760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161055b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061198c9190614b50565b8251146119f05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161055b565b60208201516001600160a01b031615611a665760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161055b565b5f80611a7584604001516131d5565b91509150818714611ae25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161055b565b9695505050505050565b5f8181525f805160206153be8339815191526020526040812060030180545f8051602061537e833981519152916001600160401b039091169083611b2f83614f4b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611b78815f6133ad565b50565b5f9182525f805160206153be833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611c3c57611bfc816001614f70565b611c07906008614c99565b5081515f90839083908110611c1e57611c1e614f83565b60200101906001600160f81b03191690815f1a905350600101611be8565b505f5b6004811015611c9f57611c53816003614f70565b611c5e906008614c99565b6001901c60f81b82611c71836002614cd0565b81518110611c8157611c81614f83565b60200101906001600160f81b03191690815f1a905350600101611c3f565b505f5b6020811015611d0157611cb681601f614f70565b611cc1906008614c99565b86901c60f81b82611cd3836006614cd0565b81518110611ce357611ce3614f83565b60200101906001600160f81b03191690815f1a905350600101611ca2565b505f5b6008811015611d6c57611d18816007614f70565b611d23906008614c99565b6001600160401b038616901c60f81b82611d3e836026614cd0565b81518110611d4e57611d4e614f83565b60200101906001600160f81b03191690815f1a905350600101611d04565b505f5b6008811015611dd757611d83816007614f70565b611d8e906008614c99565b6001600160401b038516901c60f81b82611da983602e614cd0565b81518110611db957611db9614f83565b60200101906001600160f81b03191690815f1a905350600101611d6f565b50949350505050565b611de8613607565b611df182613652565b611dfa816136be565b5050565b611e0661484c565b5f8051602061537e8339815191525f611e1e84612201565b90505f80611e2f8360400151613034565b915091508015611e945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161055b565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611ec657611ec6614a62565b6005811115611ed757611ed7614a62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611f5e57611f5e614a62565b1480611f7c5750600182516005811115611f7a57611f7a614a62565b145b611fdb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161055b565b600382516005811115611ff057611ff0614a62565b03611ffd57506004612001565b5060055b6020808301515f9081526009880190915260408120558181600581111561202a5761202a614a62565b9081600581111561203d5761203d614a62565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561207157612071614a62565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561213c5761213c614a62565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061531e83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156121cc575f80fd5b505af1158015610f92573d5f803e3d5ffd5b5f8051602061531e83398151915254611dfa906001600160a01b0316828461375f565b60408051606080820183525f8083526020830181905292820152905f8051602061537e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229d9190810190614e63565b91509150806123045760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161055b565b82548251146123675760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161055b565b60208201516001600160a01b0316156123da5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161055b565b509392505050565b5f805f83516036146124065760405162461bcd60e51b815260040161055b90614f97565b5f805b60028110156124555761241d816001614f70565b612428906008614c99565b61ffff1686828151811061243e5761243e614f83565b016020015160f81c901b9190911790600101612409565b5061ffff8116156124785760405162461bcd60e51b815260040161055b90614fe0565b5f805b60048110156124d35761248f816003614f70565b61249a906008614c99565b63ffffffff16876124ac836002614cd0565b815181106124bc576124bc614f83565b016020015160f81c901b919091179060010161247b565b5063ffffffff81166003146124fa5760405162461bcd60e51b815260040161055b90615023565b5f805b602081101561254f5761251181601f614f70565b61251c906008614c99565b88612528836006614cd0565b8151811061253857612538614f83565b016020015160f81c901b91909117906001016124fd565b505f805b60088110156125ae57612567816007614f70565b612572906008614c99565b6001600160401b031689612587836026614cd0565b8151811061259757612597614f83565b016020015160f81c901b9190911790600101612553565b505f805b600881101561260d576125c6816007614f70565b6125d1906008614c99565b6001600160401b03168a6125e683602e614cd0565b815181106125f6576125f6614f83565b016020015160f81c901b91909117906001016125b2565b5091989097509095509350505050565b61262561484c565b5f8281525f805160206153be83398151915260205260408082208151610100810190925280545f8051602061537e83398151915293929190829060ff16600581111561267357612673614a62565b600581111561268457612684614a62565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561270c5761270c614a62565b146127685760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161055b565b60408101516001600160a01b0316336001600160a01b0316146127e25760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161055b565b6127ef8160a00151611b6e565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561283357612833614a62565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128ff856128f981611aec565b5f611bc3565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061292e908590600401614bbd565b6020604051808303815f875af115801561294a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296e9190614b50565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f6129cf612dc4565b5f8051602061533e8339815191525f6129ea6101e2856137be565b90505f6129f687611771565b9050600281516005811115612a0d57612a0d614a62565b14612a6c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161055b565b612a75826137e1565b5f828260a00151612a869190614cb0565b60048501546060840151919250612aa8916001600160401b039091169061506a565b6001600160401b0316816001600160401b03161115612b275760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161055b565b612b318882611b7b565b5f612b3b89611aec565b90505f8982604051602001612b6792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612ba18d8688611bc3565b6040518263ffffffff1660e01b8152600401612bbd9190614bbd565b6020604051808303815f875af1158015612bd9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bfd9190614b50565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612c8557612c85614a62565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450955050505050506111e560015f8051602061539e83398151915255565b5f8051602061539e833981519152805460011901612df557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061533e833981519152906001600160401b0316612e4760408601602087016149c6565b6001600160401b03161015612eb65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161055b565b6003810154612ec860208601866150a4565b61ffff1610158015612eec5750612710612ee560208601866150a4565b61ffff1611155b612f085760405162461bcd60e51b815260040161055b906150bf565b8054831015612f6b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161055b565b8060010154831115612fd25760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161055b565b5f612fdc846137be565b90505f612fe882610a57565b90505f612ff588836137ec565b5f81815260058601602052604090209091508790613013828261510a565b509098975050505050505050565b60015f8051602061539e83398151915255565b5f8082516027146130575760405162461bcd60e51b815260040161055b90614f97565b5f805b60028110156130a65761306e816001614f70565b613079906008614c99565b61ffff1685828151811061308f5761308f614f83565b016020015160f81c901b919091179060010161305a565b5061ffff8116156130c95760405162461bcd60e51b815260040161055b90614fe0565b5f805b6004811015613124576130e0816003614f70565b6130eb906008614c99565b63ffffffff16866130fd836002614cd0565b8151811061310d5761310d614f83565b016020015160f81c901b91909117906001016130cc565b5063ffffffff811660021461314b5760405162461bcd60e51b815260040161055b90615023565b5f805b60208110156131a05761316281601f614f70565b61316d906008614c99565b87613179836006614cd0565b8151811061318957613189614f83565b016020015160f81c901b919091179060010161314e565b505f866026815181106131b5576131b5614f83565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146131f85760405162461bcd60e51b815260040161055b90614f97565b5f805b60028110156132475761320f816001614f70565b61321a906008614c99565b61ffff1685828151811061323057613230614f83565b016020015160f81c901b91909117906001016131fb565b5061ffff81161561326a5760405162461bcd60e51b815260040161055b90614fe0565b5f805b60048110156132c557613281816003614f70565b61328c906008614c99565b63ffffffff168661329e836002614cd0565b815181106132ae576132ae614f83565b016020015160f81c901b919091179060010161326d565b5063ffffffff81166004146132ec5760405162461bcd60e51b815260040161055b90615023565b5f805b60208110156133415761330381601f614f70565b61330e906008614c99565b8761331a836006614cd0565b8151811061332a5761332a614f83565b016020015160f81c901b91909117906001016132ef565b505f805b60088110156133a057613359816007614f70565b613364906008614c99565b6001600160401b031688613379836026614cd0565b8151811061338957613389614f83565b016020015160f81c901b9190911790600101613345565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061537e83398151915291429190158061349357506002830154815161348f916001600160401b031690614cd0565b8210155b156134b9576001600160401b0385166060820152818152604081015160208201526134d8565b84816060018181516134cb9190614cb0565b6001600160401b03169052505b60608101516134e890606461506a565b602082015160028501546001600160401b0392909216916135139190600160401b900460ff16614c99565b10156135775760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161055b565b83156135a057846001600160401b0316816040018181516135989190614cd0565b9052506135bf565b846001600160401b0316816040018181516135bb9190614f70565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661365057604051631afcd79f60e31b815260040160405180910390fd5b565b61365a613607565b61366381613d26565b611b78608082013560a083013561368060e0850160c086016149c6565b613691610100860160e087016150a4565b61ffff166136a761012087016101008801615160565b6136b961014088016101208901615180565b613d47565b6136c6613607565b5f8051602061531e8339815191526001600160a01b03821661373f5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161055b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610beb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f8b565b5f610a67825f8051602061531e833981519152546001600160a01b031690613fec565b611b788160016133ad565b5f5f8051602061537e8339815191524261380c60408601602087016149c6565b6001600160401b03161161387e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161055b565b61388e60408501602086016149c6565b6001600160401b03166138a46202a30042614cd0565b116139175760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161055b565b833561396f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161055b565b83355f908152600982016020526040902054156139df5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161055b565b6139ec604085018561519b565b9050603014613a535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161055b565b613a5c836137e1565b5f80613af66040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613aa191906149c6565b6001600160401b03168152602001613abc60408a018a61519b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061414e565b5f82815260078601602052604090209193509150613b148282615228565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b41908590600401614bbd565b6020604051808303815f875af1158015613b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190614b50565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c0357613c03614a62565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf891908e01908e016149c6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613d2e613607565b613d366144f3565b613d3e614503565b611b788161450b565b613d4f613607565b5f8051602061533e83398151915283613dbb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161055b565b612710841115613ddd5760405162461bcd60e51b815260040161055b906150bf565b85871115613e455760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161055b565b5f8360ff1611613eb25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161055b565b600a60ff84161115613f245760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161055b565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613f9f6001600160a01b038416836146b8565b905080515f14158015613fc3575080806020019051810190613fc191906152e7565b155b15610beb57604051635274afe760e01b81526001600160a01b038416600482015260240161055b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614032573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140569190614b50565b905061406d6001600160a01b0385163330866146c5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156140b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d59190614b50565b905081811161413b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161055b565b6141458282614f70565b95945050505050565b5f60608260800151516030146141b85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161055b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561422f576141ef816001614f70565b6141fa906008614c99565b5081515f9083908390811061421157614211614f83565b60200101906001600160f81b03191690815f1a9053506001016141db565b505f5b600481101561428d57614246816003614f70565b614251906008614c99565b505f8261425f836002614cd0565b8151811061426f5761426f614f83565b60200101906001600160f81b03191690815f1a905350600101614232565b505f5b60208110156142ea57845181602081106142ac576142ac614f83565b1a60f81b826142bc836006614cd0565b815181106142cc576142cc614f83565b60200101906001600160f81b03191690815f1a905350600101614290565b505f5b602081101561434a578460200151816020811061430c5761430c614f83565b1a60f81b8261431c836026614cd0565b8151811061432c5761432c614f83565b60200101906001600160f81b03191690815f1a9053506001016142ed565b505f5b60088110156143be57614361816007614f70565b61436c906008614c99565b60ff1685604001516001600160401b0316901c60f81b828260466143909190614cd0565b815181106143a0576143a0614f83565b60200101906001600160f81b03191690815f1a90535060010161434d565b505f5b603081101561442957846080015181815181106143e0576143e0614f83565b01602001516001600160f81b031916826143fb83604e614cd0565b8151811061440b5761440b614f83565b60200101906001600160f81b03191690815f1a9053506001016143c1565b505f5b600881101561449b57614440816007614f70565b61444b906008614c99565b60608601516001600160401b0390811691161c60f81b8261446d83607e614cd0565b8151811061447d5761447d614f83565b60200101906001600160f81b03191690815f1a90535060010161442c565b506002816040516144ac9190615302565b602060405180830381855afa1580156144c7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144ea9190614b50565b94909350915050565b6144fb613607565b6136506146fe565b613650613607565b614513613607565b80355f8051602061537e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461455f6080840160608501615160565b60ff1611156145cc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161055b565b5f6145dd6080840160608501615160565b60ff16116146455760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161055b565b6146556080830160608401615160565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561468660608301604084016149c6565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b60606111e583835f614706565b6040516001600160a01b038481166024830152838116604483015260648201839052610a519186918216906323b872dd9060840161378c565b613021613607565b60608147101561472b5760405163cd78605960e01b815230600482015260240161055b565b5f80856001600160a01b031684866040516147469190615302565b5f6040518083038185875af1925050503d805f8114614780576040519150601f19603f3d011682016040523d82523d5f602084013e614785565b606091505b5091509150611ae28683836060826147a5576147a0826147ec565b6111e5565b81511580156147bc57506001600160a01b0384163b155b156147e557604051639996b31560e01b81526001600160a01b038516600482015260240161055b565b50806111e5565b8051156147fc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461482190614ce3565b5f825580601f10614830575050565b601f0160209004905f5260205f2090810190611b789190614890565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156148a4575f8155600101614891565b5090565b8015158114611b78575f80fd5b803563ffffffff811681146148c8575f80fd5b919050565b5f805f606084860312156148df575f80fd5b8335925060208401356148f1816148a8565b91506148ff604085016148b5565b90509250925092565b5f60208284031215614918575f80fd5b5035919050565b6001600160a01b0381168114611b78575f80fd5b5f80828403610160811215614946575f80fd5b61014080821215614955575f80fd5b84935083013590506149668161491f565b809150509250929050565b5f60208284031215614981575f80fd5b6111e5826148b5565b5f806040838503121561499b575f80fd5b6149a4836148b5565b946020939093013593505050565b6001600160401b0381168114611b78575f80fd5b5f602082840312156149d6575f80fd5b81356111e5816149b2565b5f80604083850312156149f2575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a14575f80fd5b84356001600160401b03811115614a29575f80fd5b850160608188031215614a3a575f80fd5b93506040601f1982011215614a4d575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614a9a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614ac260408401826001600160a01b03169052565b506060830151614add60608401826001600160401b03169052565b506080830151614af860808401826001600160401b03169052565b5060a0830151614b1360a08401826001600160401b03169052565b5060c0830151614b2e60c08401826001600160401b03169052565b5060e0830151614b4960e08401826001600160401b03169052565b5092915050565b5f60208284031215614b60575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614b4957614b49614b67565b5f5b83811015614bb5578181015183820152602001614b9d565b50505f910152565b602081525f8251806020840152614bdb816040850160208701614b9b565b601f01601f19169190910160400192915050565b5f82614c0957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a6757610a67614b67565b6001600160401b03818116838216019080821115614b4957614b49614b67565b80820180821115610a6757610a67614b67565b600181811c90821680614cf757607f821691505b602082108103614d1557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614d7481614ce3565b806020870152604060018084165f8114614d955760018114614db157614dde565b60ff19851660408a0152604084151560051b8a01019550614dde565b895f5260205f205f5b85811015614dd55781548b8201860152908301908801614dba565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e2257614e22614dec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e5057614e50614dec565b604052919050565b80516148c8816148a8565b5f8060408385031215614e74575f80fd5b82516001600160401b0380821115614e8a575f80fd5b9084019060608287031215614e9d575f80fd5b614ea5614e00565b82518152602080840151614eb88161491f565b82820152604084015183811115614ecd575f80fd5b80850194505087601f850112614ee1575f80fd5b835183811115614ef357614ef3614dec565b614f05601f8201601f19168301614e28565b93508084528882828701011115614f1a575f80fd5b614f2981838601848801614b9b565b50826040830152819550614f3e818801614e58565b9450505050509250929050565b5f6001600160401b03808316818103614f6657614f66614b67565b6001019392505050565b81810381811115610a6757610a67614b67565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461508d5761508d614b67565b505092915050565b61ffff81168114611b78575f80fd5b5f602082840312156150b4575f80fd5b81356111e581615095565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561511581615095565b61ffff8116905081548161ffff1982161783556020840135615136816149b2565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215615170575f80fd5b813560ff811681146111e5575f80fd5b5f60208284031215615190575f80fd5b81356111e58161491f565b5f808335601e198436030181126151b0575f80fd5b8301803591506001600160401b038211156151c9575f80fd5b6020019150368190038213156151dd575f80fd5b9250929050565b601f821115610beb57805f5260205f20601f840160051c810160208510156152095750805b601f840160051c820191505b8181101561165b575f8155600101615215565b81516001600160401b0381111561524157615241614dec565b6152558161524f8454614ce3565b846151e4565b602080601f831160018114615288575f84156152715750858301515b5f19600386901b1c1916600185901b1785556152df565b5f85815260208120601f198616915b828110156152b657888601518255948401946001909101908401615297565b50858210156152d357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156152f7575f80fd5b81516111e5816148a8565b5f8251615313818460208701614b9b565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161560c38038061560c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154bf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a36600461494d565b61036a565b005b61015f61016f366004614988565b610894565b6101b2610182366004614988565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614988565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b3565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f1565b610b59565b61015f61025a366004614a0a565b610bfd565b6101b261026d366004614a46565b610dcd565b6101f2610280366004614988565b610de6565b61015f61029336600461494d565b610dfa565b61015f6102a6366004614a0a565b611019565b6101b26102b9366004614a61565b611257565b6101b26102cc366004614a81565b61126a565b61015f6102df3660046149f1565b611296565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614988565b611453565b61015f610333366004614988565b6116d9565b6101cd601481565b61035361034e366004614988565b6117e8565b6040516101bc9190614af6565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615413833981519152949193919290829060ff1660048111156103d2576103d2614ae2565b60048111156103e3576103e3614ae2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117e8565b90504260028351600481111561047757610477614ae2565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154338339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154338339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118c7565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e8689611949565b6001600160401b03169050605060ff168460c001518461067e9190614be4565b6106889190614c04565b6001600160401b031661069c826064614c2f565b10156106ba5760405162461bcd60e51b81526004016104c090614c46565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614c9b565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614ae2565b0361079b5761079b8460600151611be5565b5f84606001518460a001516107b09190614be4565b90506107bc8682611bf2565b5f6005600160991b0163ee5b48eb6107d5898686611c3a565b6040518263ffffffff1660e01b81526004016107f19190614cd4565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614c9b565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156108e2576108e2614ae2565b60058111156108f3576108f3614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614ae2565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c3a565b6040518263ffffffff1660e01b8152600401610a1e9190614cd4565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614c9b565b50505050565b5f610a7464e8d4a5100083614d06565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e57565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610b6382611e75565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a60205291909120549192505f8051602061541383398151915291610bbc91906121e8565b604080830180516001600160a01b03165f908152600a84016020529182209190915560608301519051610bf8916001600160401b03169061225e565b505050565b5f805160206154138339815191525f610c1584612281565b90505f80610c268360400151612462565b50915091505f610c35836117e8565b9050816001600160401b031681608001516001600160401b03161015610c6d5760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cb25760405162461bcd60e51b81526004016104c090614d67565b60015f87815260068701602052604090205460ff166004811115610cd857610cd8614ae2565b14610d415760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c2f565b5f610df0826117e8565b60a0015192915050565b5f805160206154138339815191525f610e128561269d565b5f86815260058401602052604090205460c0820151919250610e4491620100009091046001600160401b031690614db0565b6001600160401b03168160e001516001600160401b03161015610ec55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611012575f610ed68685611949565b9050605060ff168260c001518360e00151610ef19190614be4565b610efb9190614c04565b6001600160401b0316610f0f826064614c04565b6001600160401b03161015610f365760405162461bcd60e51b81526004016104c090614c46565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610fba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fde9190614c9b565b6040808401516001600160a01b03165f908152600a8601602052908120805490919061100b908490614dd0565b9091555050505b5050505050565b5f805160206154138339815191525f61103184612281565b90505f806110428360400151612462565b50915091505f611051836117e8565b9050816001600160401b031681608001516001600160401b031610156110895760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600301546001600160401b03808416911611156110c75760405162461bcd60e51b81526004016104c090614d67565b60035f87815260068701602052604090205460ff1660048111156110ed576110ed614ae2565b146111415760405162461bcd60e51b815260206004820152603160248201525f805160206154338339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526111e69161225e565b6112078160200151876009015f8a81526020019081526020015f20546121e8565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611263833384612a46565b9392505050565b5f611273612e44565b61127e848484612e7b565b905061126360015f8051602061547383398151915255565b5f805160206154538339815191525f6112ae83612281565b90505f806112bf83604001516130b4565b91509150806113215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133b90614de3565b905011801561136d575060015f83815260088601602052604090205460ff16600581111561136b5761136b614ae2565b145b6113895760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078501602052604081206113a191614895565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061541383398151915293929190829060ff1660048111156114b4576114b4614ae2565b60048111156114c5576114c5614ae2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154c5761154c614ae2565b148061156a575060038151600481111561156857611568614ae2565b145b6115be5760405162461bcd60e51b815260206004820152603260248201525f80516020615433833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cc82604001516117e8565b905080608001516001600160401b03165f036116505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb61167d846040015184608001518560a00151611c3a565b6040518263ffffffff1660e01b81526004016116999190614cd4565b6020604051808303815f875af11580156116b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110129190614c9b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061545383398151915292919061172190614de3565b9050118015611753575060015f83815260088301602052604090205460ff16600581111561175157611751614ae2565b145b61176f5760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117a89190600401614e62565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf89190614c9b565b6117f06148cc565b5f8281525f805160206154938339815191526020526040908190208151610100810190925280545f80516020615453833981519152929190829060ff16600581111561183e5761183e614ae2565b600581111561184f5761184f614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154938339815191526020526040812060030180545f80516020615453833981519152916001600160401b03909116908361190a83614eec565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611994573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119bb9190810190614f88565b9150915080611a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a859190614c9b565b825114611ae95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b5f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b6e8460400151613255565b91509150818714611bdb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bef815f61342d565b50565b5f9182525f80516020615493833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb357611c73816001615070565b611c7e906008614c2f565b5081515f90839083908110611c9557611c95615083565b60200101906001600160f81b03191690815f1a905350600101611c5f565b505f5b6004811015611d1657611cca816003615070565b611cd5906008614c2f565b6001901c60f81b82611ce8836002614dd0565b81518110611cf857611cf8615083565b60200101906001600160f81b03191690815f1a905350600101611cb6565b505f5b6020811015611d7857611d2d81601f615070565b611d38906008614c2f565b86901c60f81b82611d4a836006614dd0565b81518110611d5a57611d5a615083565b60200101906001600160f81b03191690815f1a905350600101611d19565b505f5b6008811015611de357611d8f816007615070565b611d9a906008614c2f565b6001600160401b038616901c60f81b82611db5836026614dd0565b81518110611dc557611dc5615083565b60200101906001600160f81b03191690815f1a905350600101611d7b565b505f5b6008811015611e4e57611dfa816007615070565b611e05906008614c2f565b6001600160401b038516901c60f81b82611e2083602e614dd0565b81518110611e3057611e30615083565b60200101906001600160f81b03191690815f1a905350600101611de6565b50949350505050565b611e5f613687565b611e68826136d2565b611e718161373e565b5050565b611e7d6148cc565b5f805160206154538339815191525f611e9584612281565b90505f80611ea683604001516130b4565b915091508015611f0b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f3d57611f3d614ae2565b6005811115611f4e57611f4e614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd557611fd5614ae2565b1480611ff35750600182516005811115611ff157611ff1614ae2565b145b6120525760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206757612067614ae2565b0361207457506004612078565b5060055b6020808301515f908152600988019091526040812055818160058111156120a1576120a1614ae2565b908160058111156120b4576120b4614ae2565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120e8576120e8614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b3576121b3614ae2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153f383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612243575f80fd5b505af1158015612255573d5f803e3d5ffd5b50505050505050565b5f805160206153f383398151915254611e71906001600160a01b031682846137df565b60408051606080820183525f8083526020830181905292820152905f805160206154538339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261231d9190810190614f88565b91509150806123845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123e75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124865760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156124d55761249d816001615070565b6124a8906008614c2f565b61ffff168682815181106124be576124be615083565b016020015160f81c901b9190911790600101612489565b5061ffff8116156124f85760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156125535761250f816003615070565b61251a906008614c2f565b63ffffffff168761252c836002614dd0565b8151811061253c5761253c615083565b016020015160f81c901b91909117906001016124fb565b5063ffffffff811660031461257a5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156125cf5761259181601f615070565b61259c906008614c2f565b886125a8836006614dd0565b815181106125b8576125b8615083565b016020015160f81c901b919091179060010161257d565b505f805b600881101561262e576125e7816007615070565b6125f2906008614c2f565b6001600160401b031689612607836026614dd0565b8151811061261757612617615083565b016020015160f81c901b91909117906001016125d3565b505f805b600881101561268d57612646816007615070565b612651906008614c2f565b6001600160401b03168a61266683602e614dd0565b8151811061267657612676615083565b016020015160f81c901b9190911790600101612632565b5091989097509095509350505050565b6126a56148cc565b5f8281525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156126f3576126f3614ae2565b600581111561270457612704614ae2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278c5761278c614ae2565b146127e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128625760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61286f8160a00151611be5565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b3576128b3614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61297f85612979816118c7565b5f611c3a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129ae908590600401614cd4565b6020604051808303815f875af11580156129ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ee9190614c9b565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a4f612e44565b5f805160206154138339815191525f612a6a6101ed8561383e565b90505f612a76876117e8565b9050600281516005811115612a8d57612a8d614ae2565b14612aec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af582613861565b5f828260a00151612b069190614db0565b60048501546060840151919250612b28916001600160401b0390911690614c04565b6001600160401b0316816001600160401b03161115612ba75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb18882611bf2565b5f612bbb896118c7565b90505f8982604051602001612be792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c218d8688611c3a565b6040518263ffffffff1660e01b8152600401612c3d9190614cd4565b6020604051808303815f875af1158015612c59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7d9190614c9b565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0557612d05614ae2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126360015f8051602061547383398151915255565b5f80516020615473833981519152805460011901612e7557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615413833981519152906001600160401b0316612ec76040860160208701614a46565b6001600160401b03161015612f365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f486020860186615179565b61ffff1610158015612f6c5750612710612f656020860186615179565b61ffff1611155b612f885760405162461bcd60e51b81526004016104c090615194565b8054831015612feb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130525760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305c8461383e565b90505f61306882610a64565b90505f613075888361386c565b5f8181526005860160205260409020909150879061309382826151df565b509098975050505050505050565b60015f8051602061547383398151915255565b5f8082516027146130d75760405162461bcd60e51b81526004016104c090615097565b5f805b6002811015613126576130ee816001615070565b6130f9906008614c2f565b61ffff1685828151811061310f5761310f615083565b016020015160f81c901b91909117906001016130da565b5061ffff8116156131495760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156131a457613160816003615070565b61316b906008614c2f565b63ffffffff168661317d836002614dd0565b8151811061318d5761318d615083565b016020015160f81c901b919091179060010161314c565b5063ffffffff81166002146131cb5760405162461bcd60e51b81526004016104c090615123565b5f805b6020811015613220576131e281601f615070565b6131ed906008614c2f565b876131f9836006614dd0565b8151811061320957613209615083565b016020015160f81c901b91909117906001016131ce565b505f8660268151811061323557613235615083565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132785760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156132c75761328f816001615070565b61329a906008614c2f565b61ffff168582815181106132b0576132b0615083565b016020015160f81c901b919091179060010161327b565b5061ffff8116156132ea5760405162461bcd60e51b81526004016104c0906150e0565b5f805b600481101561334557613301816003615070565b61330c906008614c2f565b63ffffffff168661331e836002614dd0565b8151811061332e5761332e615083565b016020015160f81c901b91909117906001016132ed565b5063ffffffff811660041461336c5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156133c15761338381601f615070565b61338e906008614c2f565b8761339a836006614dd0565b815181106133aa576133aa615083565b016020015160f81c901b919091179060010161336f565b505f805b6008811015613420576133d9816007615070565b6133e4906008614c2f565b6001600160401b0316886133f9836026614dd0565b8151811061340957613409615083565b016020015160f81c901b91909117906001016133c5565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061545383398151915291429190158061351357506002830154815161350f916001600160401b031690614dd0565b8210155b15613539576001600160401b038516606082015281815260408101516020820152613558565b848160600181815161354b9190614db0565b6001600160401b03169052505b6060810151613568906064614c04565b602082015160028501546001600160401b0392909216916135939190600160401b900460ff16614c2f565b10156135f75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362057846001600160401b0316816040018181516136189190614dd0565b90525061363f565b846001600160401b03168160400181815161363b9190615070565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d057604051631afcd79f60e31b815260040160405180910390fd5b565b6136da613687565b6136e381613da6565b611bef608082013560a083013561370060e0850160c08601614a46565b613711610100860160e08701615179565b61ffff1661372761012087016101008801615235565b61373961014088016101208901615255565b613dc7565b613746613687565b5f805160206153f38339815191526001600160a01b0382166137bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bf891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400b565b5f610a74825f805160206153f3833981519152546001600160a01b03169061406c565b611bef81600161342d565b5f5f805160206154538339815191524261388c6040860160208701614a46565b6001600160401b0316116138fe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b61390e6040850160208601614a46565b6001600160401b03166139246202a30042614dd0565b116139975760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a5f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6c6040850185615270565b9050603014613ad35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adc83613861565b5f80613b766040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b219190614a46565b6001600160401b03168152602001613b3c60408a018a615270565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141ce565b5f82815260078601602052604090209193509150613b9482826152fd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc1908590600401614cd4565b6020604051808303815f875af1158015613bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c019190614c9b565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8357613c83614ae2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7891908e01908e01614a46565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dae613687565b613db6614573565b613dbe614583565b611bef8161458b565b613dcf613687565b5f8051602061541383398151915283613e3b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e5d5760405162461bcd60e51b81526004016104c090615194565b85871115613ec55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f325760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61401f6001600160a01b03841683614738565b905080515f1415801561404357508080602001905181019061404191906153bc565b155b15610bf857604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d69190614c9b565b90506140ed6001600160a01b038516333086614745565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141559190614c9b565b90508181116141bb5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c58282615070565b95945050505050565b5f60608260800151516030146142385760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142af5761426f816001615070565b61427a906008614c2f565b5081515f9083908390811061429157614291615083565b60200101906001600160f81b03191690815f1a90535060010161425b565b505f5b600481101561430d576142c6816003615070565b6142d1906008614c2f565b505f826142df836002614dd0565b815181106142ef576142ef615083565b60200101906001600160f81b03191690815f1a9053506001016142b2565b505f5b602081101561436a578451816020811061432c5761432c615083565b1a60f81b8261433c836006614dd0565b8151811061434c5761434c615083565b60200101906001600160f81b03191690815f1a905350600101614310565b505f5b60208110156143ca578460200151816020811061438c5761438c615083565b1a60f81b8261439c836026614dd0565b815181106143ac576143ac615083565b60200101906001600160f81b03191690815f1a90535060010161436d565b505f5b600881101561443e576143e1816007615070565b6143ec906008614c2f565b60ff1685604001516001600160401b0316901c60f81b828260466144109190614dd0565b8151811061442057614420615083565b60200101906001600160f81b03191690815f1a9053506001016143cd565b505f5b60308110156144a9578460800151818151811061446057614460615083565b01602001516001600160f81b0319168261447b83604e614dd0565b8151811061448b5761448b615083565b60200101906001600160f81b03191690815f1a905350600101614441565b505f5b600881101561451b576144c0816007615070565b6144cb906008614c2f565b60608601516001600160401b0390811691161c60f81b826144ed83607e614dd0565b815181106144fd576144fd615083565b60200101906001600160f81b03191690815f1a9053506001016144ac565b5060028160405161452c91906153d7565b602060405180830381855afa158015614547573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456a9190614c9b565b94909350915050565b61457b613687565b6136d061477e565b6136d0613687565b614593613687565b80355f8051602061545383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145df6080840160608501615235565b60ff16111561464c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61465d6080840160608501615235565b60ff16116146c55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d56080830160608401615235565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147066060830160408401614a46565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126383835f614786565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd9060840161380c565b6130a1613687565b6060814710156147ab5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c691906153d7565b5f6040518083038185875af1925050503d805f8114614800576040519150601f19603f3d011682016040523d82523d5f602084013e614805565b606091505b5091509150611bdb868383606082614825576148208261486c565b611263565b815115801561483c57506001600160a01b0384163b155b1561486557604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611263565b80511561487c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a190614de3565b5f825580601f106148b0575050565b601f0160209004905f5260205f2090810190611bef9190614910565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614924575f8155600101614911565b5090565b8015158114611bef575f80fd5b803563ffffffff81168114614948575f80fd5b919050565b5f805f6060848603121561495f575f80fd5b83359250602084013561497181614928565b915061497f60408501614935565b90509250925092565b5f60208284031215614998575f80fd5b5035919050565b6001600160a01b0381168114611bef575f80fd5b5f808284036101608112156149c6575f80fd5b610140808212156149d5575f80fd5b84935083013590506149e68161499f565b809150509250929050565b5f60208284031215614a01575f80fd5b61126382614935565b5f8060408385031215614a1b575f80fd5b614a2483614935565b946020939093013593505050565b6001600160401b0381168114611bef575f80fd5b5f60208284031215614a56575f80fd5b813561126381614a32565b5f8060408385031215614a72575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a94575f80fd5b84356001600160401b03811115614aa9575f80fd5b850160608188031215614aba575f80fd5b93506040601f1982011215614acd575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4260408401826001600160a01b03169052565b506060830151614b5d60608401826001600160401b03169052565b506080830151614b7860808401826001600160401b03169052565b5060a0830151614b9360a08401826001600160401b03169052565b5060c0830151614bae60c08401826001600160401b03169052565b5060e0830151614bc960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bc957614bc9614bd0565b6001600160401b03818116838216028082169190828114614c2757614c27614bd0565b505092915050565b8082028115828204841417610a7457610a74614bd0565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cab575f80fd5b5051919050565b5f5b83811015614ccc578181015183820152602001614cb4565b50505f910152565b602081525f8251806020840152614cf2816040850160208701614cb2565b601f01601f19169190910160400192915050565b5f82614d2057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bc957614bc9614bd0565b80820180821115610a7457610a74614bd0565b600181811c90821680614df757607f821691505b602082108103614e1557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e7481614de3565b806020870152604060018084165f8114614e955760018114614eb157614ede565b60ff19851660408a0152604084151560051b8a01019550614ede565b895f5260205f205f5b85811015614ed55781548b8201860152908301908801614eba565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f0757614f07614bd0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f4757614f47614f11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f7557614f75614f11565b604052919050565b805161494881614928565b5f8060408385031215614f99575f80fd5b82516001600160401b0380821115614faf575f80fd5b9084019060608287031215614fc2575f80fd5b614fca614f25565b82518152602080840151614fdd8161499f565b82820152604084015183811115614ff2575f80fd5b80850194505087601f850112615006575f80fd5b83518381111561501857615018614f11565b61502a601f8201601f19168301614f4d565b9350808452888282870101111561503f575f80fd5b61504e81838601848801614cb2565b50826040830152819550615063818801614f7d565b9450505050509250929050565b81810381811115610a7457610a74614bd0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bef575f80fd5b5f60208284031215615189575f80fd5b81356112638161516a565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ea8161516a565b61ffff8116905081548161ffff198216178355602084013561520b81614a32565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215615245575f80fd5b813560ff81168114611263575f80fd5b5f60208284031215615265575f80fd5b81356112638161499f565b5f808335601e19843603018112615285575f80fd5b8301803591506001600160401b0382111561529e575f80fd5b6020019150368190038213156152b2575f80fd5b9250929050565b601f821115610bf857805f5260205f20601f840160051c810160208510156152de5750805b601f840160051c820191505b81811015611012575f81556001016152ea565b81516001600160401b0381111561531657615316614f11565b61532a816153248454614de3565b846152b9565b602080601f83116001811461535d575f84156153465750858301515b5f19600386901b1c1916600185901b1785556153b4565b5f85815260208120601f198616915b8281101561538b5788860151825594840194600190910190840161536c565b50858210156153a857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153cc575f80fd5b815161126381614928565b5f82516153e8818460208701614cb2565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,6 +370,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMS return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) } +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go index a464de3c8..a1f6b6cc3 100644 --- a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -31,8 +31,8 @@ var ( // ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. var ExampleRewardCalculatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60a0604052348015600e575f80fd5b50604051610243380380610243833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516101c06100835f395f81816079015260ca01526101c05ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780636588aa7f14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f366004610125565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133808567ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16886100fe919061016b565b610108919061016b565b6101129190610194565b61011c9190610194565b95945050505050565b5f805f8060808587031215610138575f80fd5b84359350602085013567ffffffffffffffff81168114610156575f80fd5b93969395505050506040820135916060013590565b808202811582820484141761018e57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826101ae57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6127106301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -233,12 +233,12 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINY return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) } -// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, uptime, arg2, arg3) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) if err != nil { return *new(*big.Int), err @@ -250,18 +250,18 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o } -// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) } -// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index a6b88d42f..5f9e160de 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,8 @@ 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161510638038061510683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614fb98061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f36600461452c565b61043b565b005b348015610161575f80fd5b50610154610170366004614567565b61096b565b348015610180575f80fd5b506101bf61018f366004614567565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b5061015461021236600461457e565b610b3b565b348015610222575f80fd5b50610236610231366004614567565b610c18565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b50610154610290366004614595565b610c2e565b3480156102a0575f80fd5b506101546102af3660046145ae565b610cb1565b3480156102bf575f80fd5b506101bf6102ce3660046145ea565b610e81565b3480156102de575f80fd5b506102366102ed366004614567565b610e9a565b3480156102fd575f80fd5b5061015461030c36600461452c565b610eae565b6101bf61031f366004614605565b61105c565b34801561032f575f80fd5b5061015461033e3660046145ae565b611088565b34801561034e575f80fd5b5061015461035d366004614595565b6112a5565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae366004614567565b611462565b3480156103be575f80fd5b506101546103cd366004614567565b6116ef565b6101bf6103e0366004614567565b6117fe565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b50610418610413366004614567565b61180a565b6040516101c99190614672565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f0d833981519152949193919290829060ff1660048111156104a3576104a361465e565b60048111156104b4576104b461465e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561053a5761053783866118e9565b90505b6004848101546060840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d1919061474c565b5f8881526009860160205260409020556002825160048111156105f6576105f661465e565b146106485760405162461bcd60e51b815260206004820152602a60248201525f80516020614f2d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106ad5760405162461bcd60e51b815260206004820152603360248201525f80516020614f2d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161063f565b5f6106b784611b85565b600384526001600160401b0342811660a0860152811660e08501525f8981526006870160205260409020845181549293508592829060ff191660018360048111156107045761070461465e565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107d68561180a565b905083606001516001600160401b03168160a001516001600160401b03161161084d5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161063f565b6002815160058111156108625761086261465e565b03610874576108748460600151611c07565b5f84606001518260a001516108899190614777565b90506108958682611c14565b5f6005600160991b0163ee5b48eb6108ae898786611c5c565b6040518263ffffffff1660e01b81526004016108ca91906147b9565b6020604051808303815f875af11580156108e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090a919061474c565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614f8d83398151915260205260408082208151610100810190925280545f80516020614f4d83398151915293929190829060ff1660058111156109b9576109b961465e565b60058111156109ca576109ca61465e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a4f57610a4f61465e565b14610ab45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161063f565b6005600160991b016001600160a01b031663ee5b48eb610ad98584608001515f611c5c565b6040518263ffffffff1660e01b8152600401610af591906147b9565b6020604051808303815f875af1158015610b11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b35919061474c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b84575080546001600160401b03808416911610155b15610ba25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610bcc83611e7b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c2864e8d4a51000836147eb565b92915050565b5f610c3882611e8c565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020528251909116815291822091909155606082015190519192505f80516020614f0d83398151915291610cac916001600160401b031690612203565b505050565b5f80516020614f0d8339815191525f610cc984612216565b90505f80610cda83604001516123f7565b50915091505f610ce98361180a565b9050816001600160401b031681608001516001600160401b03161015610d215760405162461bcd60e51b815260040161063f9061480a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d665760405162461bcd60e51b815260040161063f9061484c565b60015f87815260068701602052604090205460ff166004811115610d8c57610d8c61465e565b14610df55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161063f565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c286001600160401b03831664e8d4a51000614895565b5f610ea48261180a565b60a0015192915050565b5f80516020614f0d8339815191525f610ec68561180a565b5f86815260058401602052604090205460c0820151919250610ef891620100009091046001600160401b0316906148ac565b6001600160401b0316421015610f6c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161063f565b5f8415610f8057610f7d86856118e9565b90505b60048381015460a0840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610ff3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611017919061474c565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110449084906148cc565b90915550611053905086612632565b50505050505050565b5f6110656129db565b611070838334612a12565b9050610c2860015f80516020614f6d83398151915255565b5f80516020614f0d8339815191525f6110a084612216565b90505f806110b183604001516123f7565b50915091505f6110c08361180a565b9050816001600160401b031681608001516001600160401b031610156110f85760405162461bcd60e51b815260040161063f9061480a565b5f8681526006860160205260409020600301546001600160401b03808416911611156111365760405162461bcd60e51b815260040161063f9061484c565b60035f87815260068701602052604090205460ff16600481111561115c5761115c61465e565b146111b05760405162461bcd60e51b815260206004820152603160248201525f80516020614f2d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161063f565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261125591612203565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f80516020614f4d8339815191525f6112bd83612216565b90505f806112ce8360400151612c40565b91509150806113305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161063f565b5f8281526007850160205260408120805461134a906148df565b905011801561137c575060015f83815260088601602052604090205460ff16600581111561137a5761137a61465e565b145b6113985760405162461bcd60e51b815260040161063f90614911565b5f82815260078501602052604081206113b091614474565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f0d83398151915293929190829060ff1660048111156114c3576114c361465e565b60048111156114d4576114d461465e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155b5761155b61465e565b148061157957506003815160048111156115775761157761465e565b145b6115cd5760405162461bcd60e51b815260206004820152603260248201525f80516020614f2d833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161063f565b5f6115db826040015161180a565b905080608001516001600160401b03165f0361165f5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161063f565b6005600160991b016001600160a01b031663ee5b48eb61168c846040015184608001518560a00151611c5c565b6040518263ffffffff1660e01b81526004016116a891906147b9565b6020604051808303815f875af11580156116c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e8919061474c565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614f4d833981519152929190611737906148df565b9050118015611769575060015f83815260088301602052604090205460ff1660058111156117675761176761465e565b145b6117855760405162461bcd60e51b815260040161063f90614911565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117be9190600401614958565b6020604051808303815f875af11580156117da573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cac919061474c565b5f610c28823334612de1565b6118126144ab565b5f8281525f80516020614f8d8339815191526020526040908190208151610100810190925280545f80516020614f4d833981519152929190829060ff1660058111156118605761186061465e565b60058111156118715761187161465e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611934573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261195b9190810190614a6d565b91509150806119be5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161063f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a25919061474c565b825114611a895760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161063f565b60208201516001600160a01b031615611aff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161063f565b5f80611b0e84604001516131dc565b91509150818714611b7b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161063f565b9695505050505050565b5f8181525f80516020614f8d8339815191526020526040812060030180545f80516020614f4d833981519152916001600160401b039091169083611bc883614b55565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611c11815f6133b4565b50565b5f9182525f80516020614f8d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cd557611c95816001614b7a565b611ca0906008614895565b5081515f90839083908110611cb757611cb7614b8d565b60200101906001600160f81b03191690815f1a905350600101611c81565b505f5b6004811015611d3857611cec816003614b7a565b611cf7906008614895565b6001901c60f81b82611d0a8360026148cc565b81518110611d1a57611d1a614b8d565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6020811015611d9a57611d4f81601f614b7a565b611d5a906008614895565b86901c60f81b82611d6c8360066148cc565b81518110611d7c57611d7c614b8d565b60200101906001600160f81b03191690815f1a905350600101611d3b565b505f5b6008811015611e0557611db1816007614b7a565b611dbc906008614895565b6001600160401b038616901c60f81b82611dd78360266148cc565b81518110611de757611de7614b8d565b60200101906001600160f81b03191690815f1a905350600101611d9d565b505f5b6008811015611e7057611e1c816007614b7a565b611e27906008614895565b6001600160401b038516901c60f81b82611e4283602e6148cc565b81518110611e5257611e52614b8d565b60200101906001600160f81b03191690815f1a905350600101611e08565b5090505b9392505050565b611e8361360e565b611c1181613659565b611e946144ab565b5f80516020614f4d8339815191525f611eac84612216565b90505f80611ebd8360400151612c40565b915091508015611f225760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161063f565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5457611f5461465e565b6005811115611f6557611f6561465e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fec57611fec61465e565b148061200a57506001825160058111156120085761200861465e565b145b6120695760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161063f565b60038251600581111561207e5761207e61465e565b0361208b5750600461208f565b5060055b6020808301515f908152600988019091526040812055818160058111156120b8576120b861465e565b908160058111156120cb576120cb61465e565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120ff576120ff61465e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121ca576121ca61465e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6121ff6001600160a01b038216836136c5565b60408051606080820183525f8083526020830181905292820152905f80516020614f4d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561228b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b29190810190614a6d565b91509150806123195760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161063f565b825482511461237c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161063f565b60208201516001600160a01b0316156123ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161063f565b509392505050565b5f805f835160361461241b5760405162461bcd60e51b815260040161063f90614ba1565b5f805b600281101561246a57612432816001614b7a565b61243d906008614895565b61ffff1686828151811061245357612453614b8d565b016020015160f81c901b919091179060010161241e565b5061ffff81161561248d5760405162461bcd60e51b815260040161063f90614bea565b5f805b60048110156124e8576124a4816003614b7a565b6124af906008614895565b63ffffffff16876124c18360026148cc565b815181106124d1576124d1614b8d565b016020015160f81c901b9190911790600101612490565b5063ffffffff811660031461250f5760405162461bcd60e51b815260040161063f90614c2d565b5f805b60208110156125645761252681601f614b7a565b612531906008614895565b8861253d8360066148cc565b8151811061254d5761254d614b8d565b016020015160f81c901b9190911790600101612512565b505f805b60088110156125c35761257c816007614b7a565b612587906008614895565b6001600160401b03168961259c8360266148cc565b815181106125ac576125ac614b8d565b016020015160f81c901b9190911790600101612568565b505f805b6008811015612622576125db816007614b7a565b6125e6906008614895565b6001600160401b03168a6125fb83602e6148cc565b8151811061260b5761260b614b8d565b016020015160f81c901b91909117906001016125c7565b5091989097509095509350505050565b61263a6144ab565b5f8281525f80516020614f8d83398151915260205260408082208151610100810190925280545f80516020614f4d83398151915293929190829060ff1660058111156126885761268861465e565b60058111156126995761269961465e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127215761272161465e565b1461277d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161063f565b60408101516001600160a01b0316336001600160a01b0316146127f75760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161063f565b6128048160a00151611c07565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128485761284861465e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129148561290e81611b85565b5f611c5c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129439085906004016147b9565b6020604051808303815f875af115801561295f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612983919061474c565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614f6d833981519152805460011901612a0c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f0d833981519152906001600160401b0316612a5e60408601602087016145ea565b6001600160401b03161015612acd5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161063f565b6003810154612adf6020860186614c83565b61ffff1610158015612b035750612710612afc6020860186614c83565b61ffff1611155b612b1f5760405162461bcd60e51b815260040161063f90614c9e565b8054831015612b825760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161063f565b8060010154831115612be95760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161063f565b825f612bf482610c18565b90505f612c018883613758565b5f81815260058601602052604090209091508790612c1f8282614ce9565b509098975050505050505050565b60015f80516020614f6d83398151915255565b5f808251602714612c635760405162461bcd60e51b815260040161063f90614ba1565b5f805b6002811015612cb257612c7a816001614b7a565b612c85906008614895565b61ffff16858281518110612c9b57612c9b614b8d565b016020015160f81c901b9190911790600101612c66565b5061ffff811615612cd55760405162461bcd60e51b815260040161063f90614bea565b5f805b6004811015612d3057612cec816003614b7a565b612cf7906008614895565b63ffffffff1686612d098360026148cc565b81518110612d1957612d19614b8d565b016020015160f81c901b9190911790600101612cd8565b5063ffffffff8116600214612d575760405162461bcd60e51b815260040161063f90614c2d565b5f805b6020811015612dac57612d6e81601f614b7a565b612d79906008614895565b87612d858360066148cc565b81518110612d9557612d95614b8d565b016020015160f81c901b9190911790600101612d5a565b505f86602681518110612dc157612dc1614b8d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612dea6129db565b5f80516020614f0d8339815191525f612e0284610c18565b90505f612e0e8761180a565b9050600281516005811115612e2557612e2561465e565b14612e845760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161063f565b612e8d82613c92565b5f828260a00151612e9e91906148ac565b60048501546060840151919250612ec0916001600160401b0390911690614d3f565b6001600160401b0316816001600160401b03161115612f3f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161063f565b612f498882611c14565b5f612f5389611b85565b90505f8982604051602001612f7f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612fb98d8688611c5c565b6040518263ffffffff1660e01b8152600401612fd591906147b9565b6020604051808303815f875af1158015612ff1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613015919061474c565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561309d5761309d61465e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611e7460015f80516020614f6d83398151915255565b5f808251602e146131ff5760405162461bcd60e51b815260040161063f90614ba1565b5f805b600281101561324e57613216816001614b7a565b613221906008614895565b61ffff1685828151811061323757613237614b8d565b016020015160f81c901b9190911790600101613202565b5061ffff8116156132715760405162461bcd60e51b815260040161063f90614bea565b5f805b60048110156132cc57613288816003614b7a565b613293906008614895565b63ffffffff16866132a58360026148cc565b815181106132b5576132b5614b8d565b016020015160f81c901b9190911790600101613274565b5063ffffffff81166004146132f35760405162461bcd60e51b815260040161063f90614c2d565b5f805b60208110156133485761330a81601f614b7a565b613315906008614895565b876133218360066148cc565b8151811061333157613331614b8d565b016020015160f81c901b91909117906001016132f6565b505f805b60088110156133a757613360816007614b7a565b61336b906008614895565b6001600160401b0316886133808360266148cc565b8151811061339057613390614b8d565b016020015160f81c901b919091179060010161334c565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614f4d83398151915291429190158061349a575060028301548151613496916001600160401b0316906148cc565b8210155b156134c0576001600160401b0385166060820152818152604081015160208201526134df565b84816060018181516134d291906148ac565b6001600160401b03169052505b60608101516134ef906064614d3f565b602082015160028501546001600160401b03929092169161351a9190600160401b900460ff16614895565b101561357e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161063f565b83156135a757846001600160401b03168160400181815161359f91906148cc565b9052506135c6565b846001600160401b0316816040018181516135c29190614b7a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661365757604051631afcd79f60e31b815260040160405180910390fd5b565b61366161360e565b61366a81613c9d565b611c11608082013560a083013561368760e0850160c086016145ea565b613698610100860160e08701614c83565b61ffff166136ae61012087016101008801614d6a565b6136c061014088016101208901614d8a565b613cbe565b804710156136e85760405163cd78605960e01b815230600482015260240161063f565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613731576040519150601f19603f3d011682016040523d82523d5f602084013e613736565b606091505b5050905080610cac57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614f4d8339815191524261377860408601602087016145ea565b6001600160401b0316116137ea5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161063f565b6137fa60408501602086016145ea565b6001600160401b03166138106202a300426148cc565b116138835760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161063f565b83356138db5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161063f565b83355f9081526009820160205260409020541561394b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161063f565b6139586040850185614da5565b90506030146139bf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161063f565b6139c883613c92565b5f80613a626040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a0d91906145ea565b6001600160401b03168152602001613a2860408a018a614da5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f02565b5f82815260078601602052604090209193509150613a808282614e32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613aad9085906004016147b9565b6020604051808303815f875af1158015613ac9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613aed919061474c565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613b6f57613b6f61465e565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613c6491908e01908e016145ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c118160016133b4565b613ca561360e565b613cad6142a7565b613cb56142b7565b611c11816142bf565b613cc661360e565b5f80516020614f0d83398151915283613d325760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161063f565b612710841115613d545760405162461bcd60e51b815260040161063f90614c9e565b85871115613dbc5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161063f565b5f8360ff1611613e295760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161063f565b600a60ff84161115613e9b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161063f565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613f6c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161063f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613fe357613fa3816001614b7a565b613fae906008614895565b5081515f90839083908110613fc557613fc5614b8d565b60200101906001600160f81b03191690815f1a905350600101613f8f565b505f5b600481101561404157613ffa816003614b7a565b614005906008614895565b505f826140138360026148cc565b8151811061402357614023614b8d565b60200101906001600160f81b03191690815f1a905350600101613fe6565b505f5b602081101561409e578451816020811061406057614060614b8d565b1a60f81b826140708360066148cc565b8151811061408057614080614b8d565b60200101906001600160f81b03191690815f1a905350600101614044565b505f5b60208110156140fe57846020015181602081106140c0576140c0614b8d565b1a60f81b826140d08360266148cc565b815181106140e0576140e0614b8d565b60200101906001600160f81b03191690815f1a9053506001016140a1565b505f5b600881101561417257614115816007614b7a565b614120906008614895565b60ff1685604001516001600160401b0316901c60f81b8282604661414491906148cc565b8151811061415457614154614b8d565b60200101906001600160f81b03191690815f1a905350600101614101565b505f5b60308110156141dd578460800151818151811061419457614194614b8d565b01602001516001600160f81b031916826141af83604e6148cc565b815181106141bf576141bf614b8d565b60200101906001600160f81b03191690815f1a905350600101614175565b505f5b600881101561424f576141f4816007614b7a565b6141ff906008614895565b60608601516001600160401b0390811691161c60f81b8261422183607e6148cc565b8151811061423157614231614b8d565b60200101906001600160f81b03191690815f1a9053506001016141e0565b506002816040516142609190614ef1565b602060405180830381855afa15801561427b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061429e919061474c565b94909350915050565b6142af61360e565b61365761446c565b61365761360e565b6142c761360e565b80355f80516020614f4d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143136080840160608501614d6a565b60ff1611156143805760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161063f565b5f6143916080840160608501614d6a565b60ff16116143f95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161063f565b6144096080830160608401614d6a565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561443a60608301604084016145ea565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612c2d61360e565b508054614480906148df565b5f825580601f1061448f575050565b601f0160209004905f5260205f2090810190611c1191906144ef565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614503575f81556001016144f0565b5090565b8015158114611c11575f80fd5b803563ffffffff81168114614527575f80fd5b919050565b5f805f6060848603121561453e575f80fd5b83359250602084013561455081614507565b915061455e60408501614514565b90509250925092565b5f60208284031215614577575f80fd5b5035919050565b5f610140828403121561458f575f80fd5b50919050565b5f602082840312156145a5575f80fd5b611e7482614514565b5f80604083850312156145bf575f80fd5b6145c883614514565b946020939093013593505050565b6001600160401b0381168114611c11575f80fd5b5f602082840312156145fa575f80fd5b8135611e74816145d6565b5f808284036060811215614617575f80fd5b83356001600160401b0381111561462c575f80fd5b84016060818703121561463d575f80fd5b92506040601f1982011215614650575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061469657634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516146be60408401826001600160a01b03169052565b5060608301516146d960608401826001600160401b03169052565b5060808301516146f460808401826001600160401b03169052565b5060a083015161470f60a08401826001600160401b03169052565b5060c083015161472a60c08401826001600160401b03169052565b5060e083015161474560e08401826001600160401b03169052565b5092915050565b5f6020828403121561475c575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561474557614745614763565b5f5b838110156147b1578181015183820152602001614799565b50505f910152565b602081525f82518060208401526147d7816040850160208701614797565b601f01601f19169190910160400192915050565b5f8261480557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610c2857610c28614763565b6001600160401b0381811683821601908082111561474557614745614763565b80820180821115610c2857610c28614763565b600181811c908216806148f357607f821691505b60208210810361458f57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461496a816148df565b806020870152604060018084165f811461498b57600181146149a7576149d4565b60ff19851660408a0152604084151560051b8a010195506149d4565b895f5260205f205f5b858110156149cb5781548b82018601529083019088016149b0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a1857614a186149e2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a4657614a466149e2565b604052919050565b6001600160a01b0381168114611c11575f80fd5b805161452781614507565b5f8060408385031215614a7e575f80fd5b82516001600160401b0380821115614a94575f80fd5b9084019060608287031215614aa7575f80fd5b614aaf6149f6565b82518152602080840151614ac281614a4e565b82820152604084015183811115614ad7575f80fd5b80850194505087601f850112614aeb575f80fd5b835183811115614afd57614afd6149e2565b614b0f601f8201601f19168301614a1e565b93508084528882828701011115614b24575f80fd5b614b3381838601848801614797565b50826040830152819550614b48818801614a62565b9450505050509250929050565b5f6001600160401b03808316818103614b7057614b70614763565b6001019392505050565b81810381811115610c2857610c28614763565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c11575f80fd5b5f60208284031215614c93575f80fd5b8135611e7481614c74565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614cf481614c74565b61ffff8116905081548161ffff1982161783556020840135614d15816145d6565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614d6257614d62614763565b505092915050565b5f60208284031215614d7a575f80fd5b813560ff81168114611e74575f80fd5b5f60208284031215614d9a575f80fd5b8135611e7481614a4e565b5f808335601e19843603018112614dba575f80fd5b8301803591506001600160401b03821115614dd3575f80fd5b602001915036819003821315614de7575f80fd5b9250929050565b601f821115610cac57805f5260205f20601f840160051c81016020851015614e135750805b601f840160051c820191505b818110156116e8575f8155600101614e1f565b81516001600160401b03811115614e4b57614e4b6149e2565b614e5f81614e5984546148df565b84614dee565b602080601f831160018114614e92575f8415614e7b5750858301515b5f19600386901b1c1916600185901b178555614ee9565b5f85815260208120601f198616915b82811015614ec057888601518255948401946001909101908401614ea1565b5085821015614edd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614f02818460208701614797565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516151de3803806151de83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150918061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145af565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ea565b610984565b34801561018b575f80fd5b506101ca61019a3660046145ea565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614601565b610b54565b34801561022d575f80fd5b5061024161023c3660046145ea565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614618565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614631565b610cca565b3480156102ca575f80fd5b506101ca6102d936600461466d565b610e9a565b3480156102e9575f80fd5b506102416102f83660046145ea565b610eb3565b348015610308575f80fd5b5061015f6103173660046145af565b610ec7565b6101ca61032a366004614688565b6110e6565b34801561033a575f80fd5b5061015f610349366004614631565b611112565b348015610359575f80fd5b5061015f610368366004614618565b61132f565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ea565b6114ec565b3480156103dd575f80fd5b5061015f6103ec3660046145ea565b611772565b6101ca6103ff3660046145ea565b611881565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ea565b61188d565b6040516101d491906146f5565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614fe5833981519152949193919290829060ff1660048111156104c2576104c26146e1565b60048111156104d3576104d36146e1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188d565b905042600283516004811115610567576105676146e1565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f805160206150058339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f805160206150058339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196c565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e86896119ee565b6001600160401b03169050605060ff168460c001518461076e91906147e3565b6107789190614803565b6001600160401b031661078c82606461482e565b10156107aa5760405162461bcd60e51b81526004016105b090614845565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061489a565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146e1565b0361088b5761088b8460600151611c8a565b5f84606001518460a001516108a091906147e3565b90506108ac8682611c97565b5f6005600160991b0163ee5b48eb6108c5898686611cdf565b6040518263ffffffff1660e01b81526004016108e191906148d3565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610921919061489a565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff1660058111156109d2576109d26146e1565b60058111156109e3576109e36146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146e1565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cdf565b6040518263ffffffff1660e01b8152600401610b0e91906148d3565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e919061489a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611efe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a5100083614905565b92915050565b5f610c5182611f0f565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020528251909116815291822091909155606082015190519192505f80516020614fe583398151915291610cc5916001600160401b031690612286565b505050565b5f80516020614fe58339815191525f610ce284612299565b90505f80610cf3836040015161247a565b50915091505f610d028361188d565b9050816001600160401b031681608001516001600160401b03161015610d3a5760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d7f5760405162461bcd60e51b81526004016105b090614966565b60015f87815260068701602052604090205460ff166004811115610da557610da56146e1565b14610e0e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a5100061482e565b5f610ebd8261188d565b60a0015192915050565b5f80516020614fe58339815191525f610edf856126b5565b5f86815260058401602052604090205460c0820151919250610f1191620100009091046001600160401b0316906149af565b6001600160401b03168160e001516001600160401b03161015610f925760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110df575f610fa386856119ee565b9050605060ff168260c001518360e00151610fbe91906147e3565b610fc89190614803565b6001600160401b0316610fdc826064614803565b6001600160401b031610156110035760405162461bcd60e51b81526004016105b090614845565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ab919061489a565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110d89084906149cf565b9091555050505b5050505050565b5f6110ef612a5e565b6110fa838334612a95565b9050610c4160015f8051602061504583398151915255565b5f80516020614fe58339815191525f61112a84612299565b90505f8061113b836040015161247a565b50915091505f61114a8361188d565b9050816001600160401b031681608001516001600160401b031610156111825760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600301546001600160401b03808416911611156111c05760405162461bcd60e51b81526004016105b090614966565b60035f87815260068701602052604090205460ff1660048111156111e6576111e66146e1565b1461123a5760405162461bcd60e51b815260206004820152603160248201525f805160206150058339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526112df91612286565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f805160206150258339815191525f61134783612299565b90505f806113588360400151612cc3565b91509150806113ba5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d4906149e2565b9050118015611406575060015f83815260088601602052604090205460ff166005811115611404576114046146e1565b145b6114225760405162461bcd60e51b81526004016105b090614a14565b5f828152600785016020526040812061143a916144f7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614fe583398151915293929190829060ff16600481111561154d5761154d6146e1565b600481111561155e5761155e6146e1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e5576115e56146e1565b14806116035750600381516004811115611601576116016146e1565b145b6116575760405162461bcd60e51b815260206004820152603260248201525f80516020615005833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611665826040015161188d565b905080608001516001600160401b03165f036116e95760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611716846040015184608001518560a00151611cdf565b6040518263ffffffff1660e01b815260040161173291906148d3565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110df919061489a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150258339815191529291906117ba906149e2565b90501180156117ec575060015f83815260088301602052604090205460ff1660058111156117ea576117ea6146e1565b145b6118085760405162461bcd60e51b81526004016105b090614a14565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118419190600401614a5b565b6020604051808303815f875af115801561185d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc5919061489a565b5f610c41823334612e64565b61189561452e565b5f8281525f805160206150658339815191526020526040908190208151610100810190925280545f80516020615025833981519152929190829060ff1660058111156118e3576118e36146e1565b60058111156118f4576118f46146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150658339815191526020526040812060030180545f80516020615025833981519152916001600160401b0390911690836119af83614ae5565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a609190810190614b95565b9150915080611ac35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2a919061489a565b825114611b8e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c045760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c13846040015161325f565b91509150818714611c805760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c94815f613437565b50565b5f9182525f80516020615065833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5857611d18816001614c7d565b611d2390600861482e565b5081515f90839083908110611d3a57611d3a614c90565b60200101906001600160f81b03191690815f1a905350600101611d04565b505f5b6004811015611dbb57611d6f816003614c7d565b611d7a90600861482e565b6001901c60f81b82611d8d8360026149cf565b81518110611d9d57611d9d614c90565b60200101906001600160f81b03191690815f1a905350600101611d5b565b505f5b6020811015611e1d57611dd281601f614c7d565b611ddd90600861482e565b86901c60f81b82611def8360066149cf565b81518110611dff57611dff614c90565b60200101906001600160f81b03191690815f1a905350600101611dbe565b505f5b6008811015611e8857611e34816007614c7d565b611e3f90600861482e565b6001600160401b038616901c60f81b82611e5a8360266149cf565b81518110611e6a57611e6a614c90565b60200101906001600160f81b03191690815f1a905350600101611e20565b505f5b6008811015611ef357611e9f816007614c7d565b611eaa90600861482e565b6001600160401b038516901c60f81b82611ec583602e6149cf565b81518110611ed557611ed5614c90565b60200101906001600160f81b03191690815f1a905350600101611e8b565b5090505b9392505050565b611f06613691565b611c94816136dc565b611f1761452e565b5f805160206150258339815191525f611f2f84612299565b90505f80611f408360400151612cc3565b915091508015611fa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd757611fd76146e1565b6005811115611fe857611fe86146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561206f5761206f6146e1565b148061208d575060018251600581111561208b5761208b6146e1565b145b6120ec5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612101576121016146e1565b0361210e57506004612112565b5060055b6020808301515f9081526009880190915260408120558181600581111561213b5761213b6146e1565b9081600581111561214e5761214e6146e1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612182576121826146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224d5761224d6146e1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122826001600160a01b03821683613748565b60408051606080820183525f8083526020830181905292820152905f805160206150258339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123359190810190614b95565b915091508061239c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146123ff5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f835160361461249e5760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156124ed576124b5816001614c7d565b6124c090600861482e565b61ffff168682815181106124d6576124d6614c90565b016020015160f81c901b91909117906001016124a1565b5061ffff8116156125105760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561256b57612527816003614c7d565b61253290600861482e565b63ffffffff16876125448360026149cf565b8151811061255457612554614c90565b016020015160f81c901b9190911790600101612513565b5063ffffffff81166003146125925760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156125e7576125a981601f614c7d565b6125b490600861482e565b886125c08360066149cf565b815181106125d0576125d0614c90565b016020015160f81c901b9190911790600101612595565b505f805b6008811015612646576125ff816007614c7d565b61260a90600861482e565b6001600160401b03168961261f8360266149cf565b8151811061262f5761262f614c90565b016020015160f81c901b91909117906001016125eb565b505f805b60088110156126a55761265e816007614c7d565b61266990600861482e565b6001600160401b03168a61267e83602e6149cf565b8151811061268e5761268e614c90565b016020015160f81c901b919091179060010161264a565b5091989097509095509350505050565b6126bd61452e565b5f8281525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff16600581111561270b5761270b6146e1565b600581111561271c5761271c6146e1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a4576127a46146e1565b146128005760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128878160a00151611c8a565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cb576128cb6146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612997856129918161196c565b5f611cdf565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c69085906004016148d3565b6020604051808303815f875af11580156129e2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a06919061489a565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020615045833981519152805460011901612a8f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614fe5833981519152906001600160401b0316612ae1604086016020870161466d565b6001600160401b03161015612b505760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b626020860186614d86565b61ffff1610158015612b865750612710612b7f6020860186614d86565b61ffff1611155b612ba25760405162461bcd60e51b81526004016105b090614da1565b8054831015612c055760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7782610c31565b90505f612c8488836137db565b5f81815260058601602052604090209091508790612ca28282614dec565b509098975050505050505050565b60015f8051602061504583398151915255565b5f808251602714612ce65760405162461bcd60e51b81526004016105b090614ca4565b5f805b6002811015612d3557612cfd816001614c7d565b612d0890600861482e565b61ffff16858281518110612d1e57612d1e614c90565b016020015160f81c901b9190911790600101612ce9565b5061ffff811615612d585760405162461bcd60e51b81526004016105b090614ced565b5f805b6004811015612db357612d6f816003614c7d565b612d7a90600861482e565b63ffffffff1686612d8c8360026149cf565b81518110612d9c57612d9c614c90565b016020015160f81c901b9190911790600101612d5b565b5063ffffffff8116600214612dda5760405162461bcd60e51b81526004016105b090614d30565b5f805b6020811015612e2f57612df181601f614c7d565b612dfc90600861482e565b87612e088360066149cf565b81518110612e1857612e18614c90565b016020015160f81c901b9190911790600101612ddd565b505f86602681518110612e4457612e44614c90565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6d612a5e565b5f80516020614fe58339815191525f612e8584610c31565b90505f612e918761188d565b9050600281516005811115612ea857612ea86146e1565b14612f075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1082613d15565b5f828260a00151612f2191906149af565b60048501546060840151919250612f43916001600160401b0390911690614803565b6001600160401b0316816001600160401b03161115612fc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fcc8882611c97565b5f612fd68961196c565b90505f898260405160200161300292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303c8d8688611cdf565b6040518263ffffffff1660e01b815260040161305891906148d3565b6020604051808303815f875af1158015613074573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613098919061489a565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613120576131206146e1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef760015f8051602061504583398151915255565b5f808251602e146132825760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156132d157613299816001614c7d565b6132a490600861482e565b61ffff168582815181106132ba576132ba614c90565b016020015160f81c901b9190911790600101613285565b5061ffff8116156132f45760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561334f5761330b816003614c7d565b61331690600861482e565b63ffffffff16866133288360026149cf565b8151811061333857613338614c90565b016020015160f81c901b91909117906001016132f7565b5063ffffffff81166004146133765760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156133cb5761338d81601f614c7d565b61339890600861482e565b876133a48360066149cf565b815181106133b4576133b4614c90565b016020015160f81c901b9190911790600101613379565b505f805b600881101561342a576133e3816007614c7d565b6133ee90600861482e565b6001600160401b0316886134038360266149cf565b8151811061341357613413614c90565b016020015160f81c901b91909117906001016133cf565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061502583398151915291429190158061351d575060028301548151613519916001600160401b0316906149cf565b8210155b15613543576001600160401b038516606082015281815260408101516020820152613562565b848160600181815161355591906149af565b6001600160401b03169052505b6060810151613572906064614803565b602082015160028501546001600160401b03929092169161359d9190600160401b900460ff1661482e565b10156136015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362a57846001600160401b03168160400181815161362291906149cf565b905250613649565b846001600160401b0316816040018181516136459190614c7d565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136da57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e4613691565b6136ed81613d20565b611c94608082013560a083013561370a60e0850160c0860161466d565b61371b610100860160e08701614d86565b61ffff1661373161012087016101008801614e42565b61374361014088016101208901614e62565b613d41565b8047101561376b5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b4576040519150601f19603f3d011682016040523d82523d5f602084013e6137b9565b606091505b5050905080610cc557604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020615025833981519152426137fb604086016020870161466d565b6001600160401b03161161386d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387d604085016020860161466d565b6001600160401b03166138936202a300426149cf565b116139065760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b833561395e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139ce5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139db6040850185614e7d565b9050603014613a425760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4b83613d15565b5f80613ae56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a90919061466d565b6001600160401b03168152602001613aab60408a018a614e7d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f85565b5f82815260078601602052604090209193509150613b038282614f0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b309085906004016148d3565b6020604051808303815f875af1158015613b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b70919061489a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf257613bf26146e1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce791908e01908e0161466d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c94816001613437565b613d28613691565b613d3061432a565b613d3861433a565b611c9481614342565b613d49613691565b5f80516020614fe583398151915283613db55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd75760405162461bcd60e51b81526004016105b090614da1565b85871115613e3f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f1e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613fef5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406657614026816001614c7d565b61403190600861482e565b5081515f9083908390811061404857614048614c90565b60200101906001600160f81b03191690815f1a905350600101614012565b505f5b60048110156140c45761407d816003614c7d565b61408890600861482e565b505f826140968360026149cf565b815181106140a6576140a6614c90565b60200101906001600160f81b03191690815f1a905350600101614069565b505f5b602081101561412157845181602081106140e3576140e3614c90565b1a60f81b826140f38360066149cf565b8151811061410357614103614c90565b60200101906001600160f81b03191690815f1a9053506001016140c7565b505f5b6020811015614181578460200151816020811061414357614143614c90565b1a60f81b826141538360266149cf565b8151811061416357614163614c90565b60200101906001600160f81b03191690815f1a905350600101614124565b505f5b60088110156141f557614198816007614c7d565b6141a390600861482e565b60ff1685604001516001600160401b0316901c60f81b828260466141c791906149cf565b815181106141d7576141d7614c90565b60200101906001600160f81b03191690815f1a905350600101614184565b505f5b6030811015614260578460800151818151811061421757614217614c90565b01602001516001600160f81b0319168261423283604e6149cf565b8151811061424257614242614c90565b60200101906001600160f81b03191690815f1a9053506001016141f8565b505f5b60088110156142d257614277816007614c7d565b61428290600861482e565b60608601516001600160401b0390811691161c60f81b826142a483607e6149cf565b815181106142b4576142b4614c90565b60200101906001600160f81b03191690815f1a905350600101614263565b506002816040516142e39190614fc9565b602060405180830381855afa1580156142fe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614321919061489a565b94909350915050565b614332613691565b6136da6144ef565b6136da613691565b61434a613691565b80355f8051602061502583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143966080840160608501614e42565b60ff1611156144035760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144146080840160608501614e42565b60ff161161447c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448c6080830160608401614e42565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bd606083016040840161466d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb0613691565b508054614503906149e2565b5f825580601f10614512575050565b601f0160209004905f5260205f2090810190611c949190614572565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614586575f8155600101614573565b5090565b8015158114611c94575f80fd5b803563ffffffff811681146145aa575f80fd5b919050565b5f805f606084860312156145c1575f80fd5b8335925060208401356145d38161458a565b91506145e160408501614597565b90509250925092565b5f602082840312156145fa575f80fd5b5035919050565b5f6101408284031215614612575f80fd5b50919050565b5f60208284031215614628575f80fd5b611ef782614597565b5f8060408385031215614642575f80fd5b61464b83614597565b946020939093013593505050565b6001600160401b0381168114611c94575f80fd5b5f6020828403121561467d575f80fd5b8135611ef781614659565b5f80828403606081121561469a575f80fd5b83356001600160401b038111156146af575f80fd5b8401606081870312156146c0575f80fd5b92506040601f19820112156146d3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474160408401826001600160a01b03169052565b50606083015161475c60608401826001600160401b03169052565b50608083015161477760808401826001600160401b03169052565b5060a083015161479260a08401826001600160401b03169052565b5060c08301516147ad60c08401826001600160401b03169052565b5060e08301516147c860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147c8576147c86147cf565b6001600160401b03818116838216028082169190828114614826576148266147cf565b505092915050565b8082028115828204841417610c4157610c416147cf565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148aa575f80fd5b5051919050565b5f5b838110156148cb5781810151838201526020016148b3565b50505f910152565b602081525f82518060208401526148f18160408501602087016148b1565b601f01601f19169190910160400192915050565b5f8261491f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147c8576147c86147cf565b80820180821115610c4157610c416147cf565b600181811c908216806149f657607f821691505b60208210810361461257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a6d816149e2565b806020870152604060018084165f8114614a8e5760018114614aaa57614ad7565b60ff19851660408a0152604084151560051b8a01019550614ad7565b895f5260205f205f5b85811015614ace5781548b8201860152908301908801614ab3565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b0057614b006147cf565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b4057614b40614b0a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6e57614b6e614b0a565b604052919050565b6001600160a01b0381168114611c94575f80fd5b80516145aa8161458a565b5f8060408385031215614ba6575f80fd5b82516001600160401b0380821115614bbc575f80fd5b9084019060608287031215614bcf575f80fd5b614bd7614b1e565b82518152602080840151614bea81614b76565b82820152604084015183811115614bff575f80fd5b80850194505087601f850112614c13575f80fd5b835183811115614c2557614c25614b0a565b614c37601f8201601f19168301614b46565b93508084528882828701011115614c4c575f80fd5b614c5b818386018488016148b1565b50826040830152819550614c70818801614b8a565b9450505050509250929050565b81810381811115610c4157610c416147cf565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c94575f80fd5b5f60208284031215614d96575f80fd5b8135611ef781614d77565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614df781614d77565b61ffff8116905081548161ffff1982161783556020840135614e1881614659565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e52575f80fd5b813560ff81168114611ef7575f80fd5b5f60208284031215614e72575f80fd5b8135611ef781614b76565b5f808335601e19843603018112614e92575f80fd5b8301803591506001600160401b03821115614eab575f80fd5b602001915036819003821315614ebf575f80fd5b9250929050565b601f821115610cc557805f5260205f20601f840160051c81016020851015614eeb5750805b601f840160051c820191505b818110156110df575f8155600101614ef7565b81516001600160401b03811115614f2357614f23614b0a565b614f3781614f3184546149e2565b84614ec6565b602080601f831160018114614f6a575f8415614f535750858301515b5f19600386901b1c1916600185901b178555614fc1565b5f85815260208120601f198616915b82811015614f9857888601518255948401946001909101908401614f79565b5085821015614fb557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614fda8184602087016148b1565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,6 +370,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) } +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index a17f2f49d..0e5987584 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -19,7 +19,7 @@ contract ExampleERC20 is ERC20Burnable, IERC20Mintable { string private constant _TOKEN_NAME = "Mock Token"; string private constant _TOKEN_SYMBOL = "EXMP"; - uint256 private constant _MAX_MINT = 1e16; + uint256 private constant _MAX_MINT = 1e19; constructor() ERC20(_TOKEN_NAME, _TOKEN_SYMBOL) { _mint(msg.sender, 1e28); diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 752069164..39e84a194 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -21,10 +21,11 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 uptime, + uint64 startTime, + uint64 endTime, uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return (stakeAmount * rewardBasisPoints * uptime) / SECONDS_IN_YEAR / 1000; + return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 10000; } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index ac5967aff..1282c87ad 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -68,6 +68,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; + uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; + uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; // solhint-disable ordering @@ -137,24 +139,28 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Validator memory validator = _initializeEndValidation(validationID); + // Check that minimum stake duration has passed - Validator memory validator = getValidator(validationID); require( - block.timestamp + validator.endedAt >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, "PoSValidatorManager: minimum stake duration not met" ); - uint64 uptime; if (includeUptimeProof) { - uptime = _getUptime(validationID, messageIndex); + uint64 uptime = _getUptime(validationID, messageIndex); + require( + uptime * 100 + >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, + "PoSValidatorManager: minimum uptime threshold not met" + ); + + $._pendingValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( + validator.weight, validator.startedAt, validator.endedAt, 0, 0 + ); } - - // TODO check if above 80% uptime - $._pendingValidatorRewards[validator.owner] += - $._rewardCalculator.calculateReward(validator.weight, uptime, 0, 0); - - _initializeEndValidation(validationID); } function completeEndValidation(uint32 messageIndex) external { @@ -347,13 +353,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bytes32 validationID = $._delegatorStakes[delegationID].validationID; Delegator memory delegator = $._delegatorStakes[delegationID]; - - uint64 uptime; - if (includeUptimeProof) { - uptime = _getUptime(validationID, messageIndex); - } - $._pendingDelegatorRewards[delegationID] = - $._rewardCalculator.calculateReward(delegator.weight, uptime, 0, 0); + Validator memory validator = getValidator(validationID); + uint64 currentTime = uint64(block.timestamp); // Ensure the delegator is active require( @@ -369,13 +370,23 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // the complete step, even if the delivered nonce is greater than the nonce used to // initialize the removal. delegator.status = DelegatorStatus.PendingRemoved; - delegator.endedAt = uint64(block.timestamp); + delegator.endedAt = currentTime; delegator.endingNonce = nonce; $._delegatorStakes[delegationID] = delegator; - Validator memory validator = getValidator(validationID); - require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); + if (includeUptimeProof) { + uint256 uptime = _getUptime(validationID, messageIndex); + require( + uptime * 100 + >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, + "PoSValidatorManager: minimum uptime threshold not met" + ); + + $._pendingDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( + delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 + ); + } // Check that removing this delegator would not exceed the maximum churn rate. // We only need to check this is the validator is still active. If the validator ends its validation @@ -400,7 +411,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validationID: validationID, nonce: nonce, validatorWeight: newValidatorWeight, - endTime: block.timestamp, + endTime: currentTime, setWeightMessageID: messageID }); } diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index c06bf3bec..51fffb6a7 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -8,7 +8,8 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( uint256 stakeAmount, - uint64 uptime, + uint64 startTime, + uint64 endTime, uint256 initialSupply, uint256 endSupply ) external view returns (uint256); diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index b51a699f0..22a41368c 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -22,8 +22,8 @@ contract ExampleRewardCalculatorTest is Test { function testRewardCalculation() public view { uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, DEFAULT_END_TIME - DEFAULT_START_TIME, 0, 0 + DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 ); - assertEq(output, 42e9); + assertEq(output, 42e8); } } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index cd91bf625..bbf60c1db 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -752,7 +752,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 stakeAmount ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual override { + function _initializeEndValidation( + bytes32 validationID, + bool includeUptime + ) internal virtual override { return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); } From f2c13d530640a3a5dfdb5876ad6ee0c8a06eb47b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 12:33:50 -0400 Subject: [PATCH 09/36] Fixups --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 45 ++++++------------- 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a0bb8e748..6b453d2dd 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161560c38038061560c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154bf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a36600461494d565b61036a565b005b61015f61016f366004614988565b610894565b6101b2610182366004614988565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614988565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b3565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f1565b610b59565b61015f61025a366004614a0a565b610bfd565b6101b261026d366004614a46565b610dcd565b6101f2610280366004614988565b610de6565b61015f61029336600461494d565b610dfa565b61015f6102a6366004614a0a565b611019565b6101b26102b9366004614a61565b611257565b6101b26102cc366004614a81565b61126a565b61015f6102df3660046149f1565b611296565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614988565b611453565b61015f610333366004614988565b6116d9565b6101cd601481565b61035361034e366004614988565b6117e8565b6040516101bc9190614af6565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615413833981519152949193919290829060ff1660048111156103d2576103d2614ae2565b60048111156103e3576103e3614ae2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117e8565b90504260028351600481111561047757610477614ae2565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154338339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154338339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118c7565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e8689611949565b6001600160401b03169050605060ff168460c001518461067e9190614be4565b6106889190614c04565b6001600160401b031661069c826064614c2f565b10156106ba5760405162461bcd60e51b81526004016104c090614c46565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614c9b565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614ae2565b0361079b5761079b8460600151611be5565b5f84606001518460a001516107b09190614be4565b90506107bc8682611bf2565b5f6005600160991b0163ee5b48eb6107d5898686611c3a565b6040518263ffffffff1660e01b81526004016107f19190614cd4565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614c9b565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156108e2576108e2614ae2565b60058111156108f3576108f3614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614ae2565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c3a565b6040518263ffffffff1660e01b8152600401610a1e9190614cd4565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614c9b565b50505050565b5f610a7464e8d4a5100083614d06565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e57565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610b6382611e75565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a60205291909120549192505f8051602061541383398151915291610bbc91906121e8565b604080830180516001600160a01b03165f908152600a84016020529182209190915560608301519051610bf8916001600160401b03169061225e565b505050565b5f805160206154138339815191525f610c1584612281565b90505f80610c268360400151612462565b50915091505f610c35836117e8565b9050816001600160401b031681608001516001600160401b03161015610c6d5760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cb25760405162461bcd60e51b81526004016104c090614d67565b60015f87815260068701602052604090205460ff166004811115610cd857610cd8614ae2565b14610d415760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c2f565b5f610df0826117e8565b60a0015192915050565b5f805160206154138339815191525f610e128561269d565b5f86815260058401602052604090205460c0820151919250610e4491620100009091046001600160401b031690614db0565b6001600160401b03168160e001516001600160401b03161015610ec55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611012575f610ed68685611949565b9050605060ff168260c001518360e00151610ef19190614be4565b610efb9190614c04565b6001600160401b0316610f0f826064614c04565b6001600160401b03161015610f365760405162461bcd60e51b81526004016104c090614c46565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610fba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fde9190614c9b565b6040808401516001600160a01b03165f908152600a8601602052908120805490919061100b908490614dd0565b9091555050505b5050505050565b5f805160206154138339815191525f61103184612281565b90505f806110428360400151612462565b50915091505f611051836117e8565b9050816001600160401b031681608001516001600160401b031610156110895760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600301546001600160401b03808416911611156110c75760405162461bcd60e51b81526004016104c090614d67565b60035f87815260068701602052604090205460ff1660048111156110ed576110ed614ae2565b146111415760405162461bcd60e51b815260206004820152603160248201525f805160206154338339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526111e69161225e565b6112078160200151876009015f8a81526020019081526020015f20546121e8565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611263833384612a46565b9392505050565b5f611273612e44565b61127e848484612e7b565b905061126360015f8051602061547383398151915255565b5f805160206154538339815191525f6112ae83612281565b90505f806112bf83604001516130b4565b91509150806113215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133b90614de3565b905011801561136d575060015f83815260088601602052604090205460ff16600581111561136b5761136b614ae2565b145b6113895760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078501602052604081206113a191614895565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061541383398151915293929190829060ff1660048111156114b4576114b4614ae2565b60048111156114c5576114c5614ae2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154c5761154c614ae2565b148061156a575060038151600481111561156857611568614ae2565b145b6115be5760405162461bcd60e51b815260206004820152603260248201525f80516020615433833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cc82604001516117e8565b905080608001516001600160401b03165f036116505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb61167d846040015184608001518560a00151611c3a565b6040518263ffffffff1660e01b81526004016116999190614cd4565b6020604051808303815f875af11580156116b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110129190614c9b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061545383398151915292919061172190614de3565b9050118015611753575060015f83815260088301602052604090205460ff16600581111561175157611751614ae2565b145b61176f5760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117a89190600401614e62565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf89190614c9b565b6117f06148cc565b5f8281525f805160206154938339815191526020526040908190208151610100810190925280545f80516020615453833981519152929190829060ff16600581111561183e5761183e614ae2565b600581111561184f5761184f614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154938339815191526020526040812060030180545f80516020615453833981519152916001600160401b03909116908361190a83614eec565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611994573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119bb9190810190614f88565b9150915080611a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a859190614c9b565b825114611ae95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b5f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b6e8460400151613255565b91509150818714611bdb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bef815f61342d565b50565b5f9182525f80516020615493833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb357611c73816001615070565b611c7e906008614c2f565b5081515f90839083908110611c9557611c95615083565b60200101906001600160f81b03191690815f1a905350600101611c5f565b505f5b6004811015611d1657611cca816003615070565b611cd5906008614c2f565b6001901c60f81b82611ce8836002614dd0565b81518110611cf857611cf8615083565b60200101906001600160f81b03191690815f1a905350600101611cb6565b505f5b6020811015611d7857611d2d81601f615070565b611d38906008614c2f565b86901c60f81b82611d4a836006614dd0565b81518110611d5a57611d5a615083565b60200101906001600160f81b03191690815f1a905350600101611d19565b505f5b6008811015611de357611d8f816007615070565b611d9a906008614c2f565b6001600160401b038616901c60f81b82611db5836026614dd0565b81518110611dc557611dc5615083565b60200101906001600160f81b03191690815f1a905350600101611d7b565b505f5b6008811015611e4e57611dfa816007615070565b611e05906008614c2f565b6001600160401b038516901c60f81b82611e2083602e614dd0565b81518110611e3057611e30615083565b60200101906001600160f81b03191690815f1a905350600101611de6565b50949350505050565b611e5f613687565b611e68826136d2565b611e718161373e565b5050565b611e7d6148cc565b5f805160206154538339815191525f611e9584612281565b90505f80611ea683604001516130b4565b915091508015611f0b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f3d57611f3d614ae2565b6005811115611f4e57611f4e614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd557611fd5614ae2565b1480611ff35750600182516005811115611ff157611ff1614ae2565b145b6120525760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206757612067614ae2565b0361207457506004612078565b5060055b6020808301515f908152600988019091526040812055818160058111156120a1576120a1614ae2565b908160058111156120b4576120b4614ae2565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120e8576120e8614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b3576121b3614ae2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153f383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612243575f80fd5b505af1158015612255573d5f803e3d5ffd5b50505050505050565b5f805160206153f383398151915254611e71906001600160a01b031682846137df565b60408051606080820183525f8083526020830181905292820152905f805160206154538339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261231d9190810190614f88565b91509150806123845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123e75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124865760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156124d55761249d816001615070565b6124a8906008614c2f565b61ffff168682815181106124be576124be615083565b016020015160f81c901b9190911790600101612489565b5061ffff8116156124f85760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156125535761250f816003615070565b61251a906008614c2f565b63ffffffff168761252c836002614dd0565b8151811061253c5761253c615083565b016020015160f81c901b91909117906001016124fb565b5063ffffffff811660031461257a5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156125cf5761259181601f615070565b61259c906008614c2f565b886125a8836006614dd0565b815181106125b8576125b8615083565b016020015160f81c901b919091179060010161257d565b505f805b600881101561262e576125e7816007615070565b6125f2906008614c2f565b6001600160401b031689612607836026614dd0565b8151811061261757612617615083565b016020015160f81c901b91909117906001016125d3565b505f805b600881101561268d57612646816007615070565b612651906008614c2f565b6001600160401b03168a61266683602e614dd0565b8151811061267657612676615083565b016020015160f81c901b9190911790600101612632565b5091989097509095509350505050565b6126a56148cc565b5f8281525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156126f3576126f3614ae2565b600581111561270457612704614ae2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278c5761278c614ae2565b146127e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128625760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61286f8160a00151611be5565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b3576128b3614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61297f85612979816118c7565b5f611c3a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129ae908590600401614cd4565b6020604051808303815f875af11580156129ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ee9190614c9b565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a4f612e44565b5f805160206154138339815191525f612a6a6101ed8561383e565b90505f612a76876117e8565b9050600281516005811115612a8d57612a8d614ae2565b14612aec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af582613861565b5f828260a00151612b069190614db0565b60048501546060840151919250612b28916001600160401b0390911690614c04565b6001600160401b0316816001600160401b03161115612ba75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb18882611bf2565b5f612bbb896118c7565b90505f8982604051602001612be792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c218d8688611c3a565b6040518263ffffffff1660e01b8152600401612c3d9190614cd4565b6020604051808303815f875af1158015612c59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7d9190614c9b565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0557612d05614ae2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126360015f8051602061547383398151915255565b5f80516020615473833981519152805460011901612e7557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615413833981519152906001600160401b0316612ec76040860160208701614a46565b6001600160401b03161015612f365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f486020860186615179565b61ffff1610158015612f6c5750612710612f656020860186615179565b61ffff1611155b612f885760405162461bcd60e51b81526004016104c090615194565b8054831015612feb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130525760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305c8461383e565b90505f61306882610a64565b90505f613075888361386c565b5f8181526005860160205260409020909150879061309382826151df565b509098975050505050505050565b60015f8051602061547383398151915255565b5f8082516027146130d75760405162461bcd60e51b81526004016104c090615097565b5f805b6002811015613126576130ee816001615070565b6130f9906008614c2f565b61ffff1685828151811061310f5761310f615083565b016020015160f81c901b91909117906001016130da565b5061ffff8116156131495760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156131a457613160816003615070565b61316b906008614c2f565b63ffffffff168661317d836002614dd0565b8151811061318d5761318d615083565b016020015160f81c901b919091179060010161314c565b5063ffffffff81166002146131cb5760405162461bcd60e51b81526004016104c090615123565b5f805b6020811015613220576131e281601f615070565b6131ed906008614c2f565b876131f9836006614dd0565b8151811061320957613209615083565b016020015160f81c901b91909117906001016131ce565b505f8660268151811061323557613235615083565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132785760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156132c75761328f816001615070565b61329a906008614c2f565b61ffff168582815181106132b0576132b0615083565b016020015160f81c901b919091179060010161327b565b5061ffff8116156132ea5760405162461bcd60e51b81526004016104c0906150e0565b5f805b600481101561334557613301816003615070565b61330c906008614c2f565b63ffffffff168661331e836002614dd0565b8151811061332e5761332e615083565b016020015160f81c901b91909117906001016132ed565b5063ffffffff811660041461336c5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156133c15761338381601f615070565b61338e906008614c2f565b8761339a836006614dd0565b815181106133aa576133aa615083565b016020015160f81c901b919091179060010161336f565b505f805b6008811015613420576133d9816007615070565b6133e4906008614c2f565b6001600160401b0316886133f9836026614dd0565b8151811061340957613409615083565b016020015160f81c901b91909117906001016133c5565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061545383398151915291429190158061351357506002830154815161350f916001600160401b031690614dd0565b8210155b15613539576001600160401b038516606082015281815260408101516020820152613558565b848160600181815161354b9190614db0565b6001600160401b03169052505b6060810151613568906064614c04565b602082015160028501546001600160401b0392909216916135939190600160401b900460ff16614c2f565b10156135f75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362057846001600160401b0316816040018181516136189190614dd0565b90525061363f565b846001600160401b03168160400181815161363b9190615070565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d057604051631afcd79f60e31b815260040160405180910390fd5b565b6136da613687565b6136e381613da6565b611bef608082013560a083013561370060e0850160c08601614a46565b613711610100860160e08701615179565b61ffff1661372761012087016101008801615235565b61373961014088016101208901615255565b613dc7565b613746613687565b5f805160206153f38339815191526001600160a01b0382166137bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bf891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400b565b5f610a74825f805160206153f3833981519152546001600160a01b03169061406c565b611bef81600161342d565b5f5f805160206154538339815191524261388c6040860160208701614a46565b6001600160401b0316116138fe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b61390e6040850160208601614a46565b6001600160401b03166139246202a30042614dd0565b116139975760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a5f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6c6040850185615270565b9050603014613ad35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adc83613861565b5f80613b766040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b219190614a46565b6001600160401b03168152602001613b3c60408a018a615270565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141ce565b5f82815260078601602052604090209193509150613b9482826152fd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc1908590600401614cd4565b6020604051808303815f875af1158015613bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c019190614c9b565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8357613c83614ae2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7891908e01908e01614a46565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dae613687565b613db6614573565b613dbe614583565b611bef8161458b565b613dcf613687565b5f8051602061541383398151915283613e3b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e5d5760405162461bcd60e51b81526004016104c090615194565b85871115613ec55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f325760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61401f6001600160a01b03841683614738565b905080515f1415801561404357508080602001905181019061404191906153bc565b155b15610bf857604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d69190614c9b565b90506140ed6001600160a01b038516333086614745565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141559190614c9b565b90508181116141bb5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c58282615070565b95945050505050565b5f60608260800151516030146142385760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142af5761426f816001615070565b61427a906008614c2f565b5081515f9083908390811061429157614291615083565b60200101906001600160f81b03191690815f1a90535060010161425b565b505f5b600481101561430d576142c6816003615070565b6142d1906008614c2f565b505f826142df836002614dd0565b815181106142ef576142ef615083565b60200101906001600160f81b03191690815f1a9053506001016142b2565b505f5b602081101561436a578451816020811061432c5761432c615083565b1a60f81b8261433c836006614dd0565b8151811061434c5761434c615083565b60200101906001600160f81b03191690815f1a905350600101614310565b505f5b60208110156143ca578460200151816020811061438c5761438c615083565b1a60f81b8261439c836026614dd0565b815181106143ac576143ac615083565b60200101906001600160f81b03191690815f1a90535060010161436d565b505f5b600881101561443e576143e1816007615070565b6143ec906008614c2f565b60ff1685604001516001600160401b0316901c60f81b828260466144109190614dd0565b8151811061442057614420615083565b60200101906001600160f81b03191690815f1a9053506001016143cd565b505f5b60308110156144a9578460800151818151811061446057614460615083565b01602001516001600160f81b0319168261447b83604e614dd0565b8151811061448b5761448b615083565b60200101906001600160f81b03191690815f1a905350600101614441565b505f5b600881101561451b576144c0816007615070565b6144cb906008614c2f565b60608601516001600160401b0390811691161c60f81b826144ed83607e614dd0565b815181106144fd576144fd615083565b60200101906001600160f81b03191690815f1a9053506001016144ac565b5060028160405161452c91906153d7565b602060405180830381855afa158015614547573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456a9190614c9b565b94909350915050565b61457b613687565b6136d061477e565b6136d0613687565b614593613687565b80355f8051602061545383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145df6080840160608501615235565b60ff16111561464c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61465d6080840160608501615235565b60ff16116146c55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d56080830160608401615235565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147066060830160408401614a46565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126383835f614786565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd9060840161380c565b6130a1613687565b6060814710156147ab5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c691906153d7565b5f6040518083038185875af1925050503d805f8114614800576040519150601f19603f3d011682016040523d82523d5f602084013e614805565b606091505b5091509150611bdb868383606082614825576148208261486c565b611263565b815115801561483c57506001600160a01b0384163b155b1561486557604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611263565b80511561487c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a190614de3565b5f825580601f106148b0575050565b601f0160209004905f5260205f2090810190611bef9190614910565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614924575f8155600101614911565b5090565b8015158114611bef575f80fd5b803563ffffffff81168114614948575f80fd5b919050565b5f805f6060848603121561495f575f80fd5b83359250602084013561497181614928565b915061497f60408501614935565b90509250925092565b5f60208284031215614998575f80fd5b5035919050565b6001600160a01b0381168114611bef575f80fd5b5f808284036101608112156149c6575f80fd5b610140808212156149d5575f80fd5b84935083013590506149e68161499f565b809150509250929050565b5f60208284031215614a01575f80fd5b61126382614935565b5f8060408385031215614a1b575f80fd5b614a2483614935565b946020939093013593505050565b6001600160401b0381168114611bef575f80fd5b5f60208284031215614a56575f80fd5b813561126381614a32565b5f8060408385031215614a72575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a94575f80fd5b84356001600160401b03811115614aa9575f80fd5b850160608188031215614aba575f80fd5b93506040601f1982011215614acd575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4260408401826001600160a01b03169052565b506060830151614b5d60608401826001600160401b03169052565b506080830151614b7860808401826001600160401b03169052565b5060a0830151614b9360a08401826001600160401b03169052565b5060c0830151614bae60c08401826001600160401b03169052565b5060e0830151614bc960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bc957614bc9614bd0565b6001600160401b03818116838216028082169190828114614c2757614c27614bd0565b505092915050565b8082028115828204841417610a7457610a74614bd0565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cab575f80fd5b5051919050565b5f5b83811015614ccc578181015183820152602001614cb4565b50505f910152565b602081525f8251806020840152614cf2816040850160208701614cb2565b601f01601f19169190910160400192915050565b5f82614d2057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bc957614bc9614bd0565b80820180821115610a7457610a74614bd0565b600181811c90821680614df757607f821691505b602082108103614e1557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e7481614de3565b806020870152604060018084165f8114614e955760018114614eb157614ede565b60ff19851660408a0152604084151560051b8a01019550614ede565b895f5260205f205f5b85811015614ed55781548b8201860152908301908801614eba565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f0757614f07614bd0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f4757614f47614f11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f7557614f75614f11565b604052919050565b805161494881614928565b5f8060408385031215614f99575f80fd5b82516001600160401b0380821115614faf575f80fd5b9084019060608287031215614fc2575f80fd5b614fca614f25565b82518152602080840151614fdd8161499f565b82820152604084015183811115614ff2575f80fd5b80850194505087601f850112615006575f80fd5b83518381111561501857615018614f11565b61502a601f8201601f19168301614f4d565b9350808452888282870101111561503f575f80fd5b61504e81838601848801614cb2565b50826040830152819550615063818801614f7d565b9450505050509250929050565b81810381811115610a7457610a74614bd0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bef575f80fd5b5f60208284031215615189575f80fd5b81356112638161516a565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ea8161516a565b61ffff8116905081548161ffff198216178355602084013561520b81614a32565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215615245575f80fd5b813560ff81168114611263575f80fd5b5f60208284031215615265575f80fd5b81356112638161499f565b5f808335601e19843603018112615285575f80fd5b8301803591506001600160401b0382111561529e575f80fd5b6020019150368190038213156152b2575f80fd5b9250929050565b601f821115610bf857805f5260205f20601f840160051c810160208510156152de5750805b601f840160051c820191505b81811015611012575f81556001016152ea565b81516001600160401b0381111561531657615316614f11565b61532a816153248454614de3565b846152b9565b602080601f83116001811461535d575f84156153465750858301515b5f19600386901b1c1916600185901b1785556153b4565b5f85815260208120601f198616915b8281101561538b5788860151825594840194600190910190840161536c565b50858210156153a857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153cc575f80fd5b815161126381614928565b5f82516153e8818460208701614cb2565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161562138038061562183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154d48061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614962565b61036a565b005b61015f61016f36600461499d565b610894565b6101b261018236600461499d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461499d565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149c8565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a06565b610b59565b61015f61025a366004614a1f565b610bde565b6101b261026d366004614a5b565b610dae565b6101f261028036600461499d565b610dc7565b61015f610293366004614962565b610ddb565b61015f6102a6366004614a1f565b610ffa565b6101b26102b9366004614a76565b61126c565b6101b26102cc366004614a96565b61127f565b61015f6102df366004614a06565b6112ab565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461499d565b611468565b61015f61033336600461499d565b6116ee565b6101cd601481565b61035361034e36600461499d565b6117fd565b6040516101bc9190614b0b565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615428833981519152949193919290829060ff1660048111156103d2576103d2614af7565b60048111156103e3576103e3614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117fd565b90504260028351600481111561047757610477614af7565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154488339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154488339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118dc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614af7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e868961195e565b6001600160401b03169050605060ff168460c001518461067e9190614bf9565b6106889190614c19565b6001600160401b031661069c826064614c44565b10156106ba5760405162461bcd60e51b81526004016104c090614c5b565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614cb0565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614af7565b0361079b5761079b8460600151611bfa565b5f84606001518460a001516107b09190614bf9565b90506107bc8682611c07565b5f6005600160991b0163ee5b48eb6107d5898686611c4f565b6040518263ffffffff1660e01b81526004016107f19190614ce9565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614cb0565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff1660058111156108e2576108e2614af7565b60058111156108f3576108f3614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614af7565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c4f565b6040518263ffffffff1660e01b8152600401610a1e9190614ce9565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614cb0565b50505050565b5f610a7464e8d4a5100083614d1b565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e6c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206154288339815191525f610b7183611e8a565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9d916121fd565b604080820180516001600160a01b03165f908152600a85016020529182209190915560608201519051610bd9916001600160401b031690612273565b505050565b5f805160206154288339815191525f610bf684612296565b90505f80610c078360400151612477565b50915091505f610c16836117fd565b9050816001600160401b031681608001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016104c090614d3a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b81526004016104c090614d7c565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9614af7565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c44565b5f610dd1826117fd565b60a0015192915050565b5f805160206154288339815191525f610df3856126b2565b5f86815260058401602052604090205460c0820151919250610e2591620100009091046001600160401b031690614dc5565b6001600160401b03168160e001516001600160401b03161015610ea65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610ff3575f610eb7868561195e565b9050605060ff168260c001518360e00151610ed29190614bf9565b610edc9190614c19565b6001600160401b0316610ef0826064614c19565b6001600160401b03161015610f175760405162461bcd60e51b81526004016104c090614c5b565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbf9190614cb0565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fec908490614de5565b9091555050505b5050505050565b5f805160206154288339815191525f61101284612296565b90505f806110238360400151612477565b50915091505f611032836117fd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106c5761106c614af7565b600481111561107d5761107d614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561111c5760405162461bcd60e51b81526004016104c090614d3a565b5f8781526006870160205260409020600301546001600160401b038085169116111561115a5760405162461bcd60e51b81526004016104c090614d7c565b60038151600481111561116f5761116f614af7565b146111c35760405162461bcd60e51b815260206004820152603160248201525f805160206154488339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f991906121fd565b856009015f8881526020019081526020015f205f905561122a81606001516001600160401b03168260200151612273565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611278833384612a5b565b9392505050565b5f611288612e59565b611293848484612e90565b905061127860015f8051602061548883398151915255565b5f805160206154688339815191525f6112c383612296565b90505f806112d483604001516130c9565b91509150806113365760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135090614df8565b9050118015611382575060015f83815260088601602052604090205460ff16600581111561138057611380614af7565b145b61139e5760405162461bcd60e51b81526004016104c090614e30565b5f82815260078501602052604081206113b6916148aa565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061542883398151915293929190829060ff1660048111156114c9576114c9614af7565b60048111156114da576114da614af7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156157611561614af7565b148061157f575060038151600481111561157d5761157d614af7565b145b6115d35760405162461bcd60e51b815260206004820152603260248201525f80516020615448833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e182604001516117fd565b905080608001516001600160401b03165f036116655760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611692846040015184608001518560a00151611c4f565b6040518263ffffffff1660e01b81526004016116ae9190614ce9565b6020604051808303815f875af11580156116ca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff39190614cb0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061546883398151915292919061173690614df8565b9050118015611768575060015f83815260088301602052604090205460ff16600581111561176657611766614af7565b145b6117845760405162461bcd60e51b81526004016104c090614e30565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117bd9190600401614e77565b6020604051808303815f875af11580156117d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd99190614cb0565b6118056148e1565b5f8281525f805160206154a88339815191526020526040908190208151610100810190925280545f80516020615468833981519152929190829060ff16600581111561185357611853614af7565b600581111561186457611864614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154a88339815191526020526040812060030180545f80516020615468833981519152916001600160401b03909116908361191f83614f01565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d09190810190614f9d565b9150915080611a335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9a9190614cb0565b825114611afe5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b745760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b83846040015161326a565b91509150818714611bf05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c04815f613442565b50565b5f9182525f805160206154a8833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cc857611c88816001615085565b611c93906008614c44565b5081515f90839083908110611caa57611caa615098565b60200101906001600160f81b03191690815f1a905350600101611c74565b505f5b6004811015611d2b57611cdf816003615085565b611cea906008614c44565b6001901c60f81b82611cfd836002614de5565b81518110611d0d57611d0d615098565b60200101906001600160f81b03191690815f1a905350600101611ccb565b505f5b6020811015611d8d57611d4281601f615085565b611d4d906008614c44565b86901c60f81b82611d5f836006614de5565b81518110611d6f57611d6f615098565b60200101906001600160f81b03191690815f1a905350600101611d2e565b505f5b6008811015611df857611da4816007615085565b611daf906008614c44565b6001600160401b038616901c60f81b82611dca836026614de5565b81518110611dda57611dda615098565b60200101906001600160f81b03191690815f1a905350600101611d90565b505f5b6008811015611e6357611e0f816007615085565b611e1a906008614c44565b6001600160401b038516901c60f81b82611e3583602e614de5565b81518110611e4557611e45615098565b60200101906001600160f81b03191690815f1a905350600101611dfb565b50949350505050565b611e7461369c565b611e7d826136e7565b611e8681613753565b5050565b611e926148e1565b5f805160206154688339815191525f611eaa84612296565b90505f80611ebb83604001516130c9565b915091508015611f205760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5257611f52614af7565b6005811115611f6357611f63614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fea57611fea614af7565b1480612008575060018251600581111561200657612006614af7565b145b6120675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207c5761207c614af7565b036120895750600461208d565b5060055b6020808301515f908152600988019091526040812055818160058111156120b6576120b6614af7565b908160058111156120c9576120c9614af7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120fd576120fd614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121c8576121c8614af7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061540883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612258575f80fd5b505af115801561226a573d5f803e3d5ffd5b50505050505050565b5f8051602061540883398151915254611e86906001600160a01b031682846137f4565b60408051606080820183525f8083526020830181905292820152905f805160206154688339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123329190810190614f9d565b91509150806123995760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123fc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561246f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f835160361461249b5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156124ea576124b2816001615085565b6124bd906008614c44565b61ffff168682815181106124d3576124d3615098565b016020015160f81c901b919091179060010161249e565b5061ffff81161561250d5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561256857612524816003615085565b61252f906008614c44565b63ffffffff1687612541836002614de5565b8151811061255157612551615098565b016020015160f81c901b9190911790600101612510565b5063ffffffff811660031461258f5760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156125e4576125a681601f615085565b6125b1906008614c44565b886125bd836006614de5565b815181106125cd576125cd615098565b016020015160f81c901b9190911790600101612592565b505f805b6008811015612643576125fc816007615085565b612607906008614c44565b6001600160401b03168961261c836026614de5565b8151811061262c5761262c615098565b016020015160f81c901b91909117906001016125e8565b505f805b60088110156126a25761265b816007615085565b612666906008614c44565b6001600160401b03168a61267b83602e614de5565b8151811061268b5761268b615098565b016020015160f81c901b9190911790600101612647565b5091989097509095509350505050565b6126ba6148e1565b5f8281525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff16600581111561270857612708614af7565b600581111561271957612719614af7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a1576127a1614af7565b146127fd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128775760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128848160a00151611bfa565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128c8576128c8614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129948561298e816118dc565b5f611c4f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c3908590600401614ce9565b6020604051808303815f875af11580156129df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a039190614cb0565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a64612e59565b5f805160206154288339815191525f612a7f6101ed85613853565b90505f612a8b876117fd565b9050600281516005811115612aa257612aa2614af7565b14612b015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b0a82613876565b5f828260a00151612b1b9190614dc5565b60048501546060840151919250612b3d916001600160401b0390911690614c19565b6001600160401b0316816001600160401b03161115612bbc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bc68882611c07565b5f612bd0896118dc565b90505f8982604051602001612bfc92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c368d8688611c4f565b6040518263ffffffff1660e01b8152600401612c529190614ce9565b6020604051808303815f875af1158015612c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c929190614cb0565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1a57612d1a614af7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127860015f8051602061548883398151915255565b5f80516020615488833981519152805460011901612e8a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615428833981519152906001600160401b0316612edc6040860160208701614a5b565b6001600160401b03161015612f4b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f5d602086018661518e565b61ffff1610158015612f815750612710612f7a602086018661518e565b61ffff1611155b612f9d5760405162461bcd60e51b81526004016104c0906151a9565b80548310156130005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130675760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307184613853565b90505f61307d82610a64565b90505f61308a8883613881565b5f818152600586016020526040902090915087906130a882826151f4565b509098975050505050505050565b60015f8051602061548883398151915255565b5f8082516027146130ec5760405162461bcd60e51b81526004016104c0906150ac565b5f805b600281101561313b57613103816001615085565b61310e906008614c44565b61ffff1685828151811061312457613124615098565b016020015160f81c901b91909117906001016130ef565b5061ffff81161561315e5760405162461bcd60e51b81526004016104c0906150f5565b5f805b60048110156131b957613175816003615085565b613180906008614c44565b63ffffffff1686613192836002614de5565b815181106131a2576131a2615098565b016020015160f81c901b9190911790600101613161565b5063ffffffff81166002146131e05760405162461bcd60e51b81526004016104c090615138565b5f805b6020811015613235576131f781601f615085565b613202906008614c44565b8761320e836006614de5565b8151811061321e5761321e615098565b016020015160f81c901b91909117906001016131e3565b505f8660268151811061324a5761324a615098565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461328d5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156132dc576132a4816001615085565b6132af906008614c44565b61ffff168582815181106132c5576132c5615098565b016020015160f81c901b9190911790600101613290565b5061ffff8116156132ff5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561335a57613316816003615085565b613321906008614c44565b63ffffffff1686613333836002614de5565b8151811061334357613343615098565b016020015160f81c901b9190911790600101613302565b5063ffffffff81166004146133815760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156133d65761339881601f615085565b6133a3906008614c44565b876133af836006614de5565b815181106133bf576133bf615098565b016020015160f81c901b9190911790600101613384565b505f805b6008811015613435576133ee816007615085565b6133f9906008614c44565b6001600160401b03168861340e836026614de5565b8151811061341e5761341e615098565b016020015160f81c901b91909117906001016133da565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615468833981519152914291901580613528575060028301548151613524916001600160401b031690614de5565b8210155b1561354e576001600160401b03851660608201528181526040810151602082015261356d565b84816060018181516135609190614dc5565b6001600160401b03169052505b606081015161357d906064614c19565b602082015160028501546001600160401b0392909216916135a89190600160401b900460ff16614c44565b101561360c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363557846001600160401b03168160400181815161362d9190614de5565b905250613654565b846001600160401b0316816040018181516136509190615085565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e557604051631afcd79f60e31b815260040160405180910390fd5b565b6136ef61369c565b6136f881613dbb565b611c04608082013560a083013561371560e0850160c08601614a5b565b613726610100860160e0870161518e565b61ffff1661373c6101208701610100880161524a565b61374e6101408801610120890161526a565b613ddc565b61375b61369c565b5f805160206154088339815191526001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614020565b5f610a74825f80516020615408833981519152546001600160a01b031690614081565b611c04816001613442565b5f5f80516020615468833981519152426138a16040860160208701614a5b565b6001600160401b0316116139135760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139236040850160208601614a5b565b6001600160401b03166139396202a30042614de5565b116139ac5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a045760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a816040850185615285565b9050603014613ae85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af183613876565b5f80613b8b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b369190614a5b565b6001600160401b03168152602001613b5160408a018a615285565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e3565b5f82815260078601602052604090209193509150613ba98282615312565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bd6908590600401614ce9565b6020604051808303815f875af1158015613bf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c169190614cb0565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9857613c98614af7565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8d91908e01908e01614a5b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc361369c565b613dcb614588565b613dd3614598565b611c04816145a0565b613de461369c565b5f8051602061542883398151915283613e505760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e725760405162461bcd60e51b81526004016104c0906151a9565b85871115613eda5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f475760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fb95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140346001600160a01b0384168361474d565b905080515f1415801561405857508080602001905181019061405691906153d1565b155b15610bd957604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140eb9190614cb0565b90506141026001600160a01b03851633308661475a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614146573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416a9190614cb0565b90508181116141d05760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141da8282615085565b95945050505050565b5f606082608001515160301461424d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142c457614284816001615085565b61428f906008614c44565b5081515f908390839081106142a6576142a6615098565b60200101906001600160f81b03191690815f1a905350600101614270565b505f5b6004811015614322576142db816003615085565b6142e6906008614c44565b505f826142f4836002614de5565b8151811061430457614304615098565b60200101906001600160f81b03191690815f1a9053506001016142c7565b505f5b602081101561437f578451816020811061434157614341615098565b1a60f81b82614351836006614de5565b8151811061436157614361615098565b60200101906001600160f81b03191690815f1a905350600101614325565b505f5b60208110156143df57846020015181602081106143a1576143a1615098565b1a60f81b826143b1836026614de5565b815181106143c1576143c1615098565b60200101906001600160f81b03191690815f1a905350600101614382565b505f5b6008811015614453576143f6816007615085565b614401906008614c44565b60ff1685604001516001600160401b0316901c60f81b828260466144259190614de5565b8151811061443557614435615098565b60200101906001600160f81b03191690815f1a9053506001016143e2565b505f5b60308110156144be578460800151818151811061447557614475615098565b01602001516001600160f81b0319168261449083604e614de5565b815181106144a0576144a0615098565b60200101906001600160f81b03191690815f1a905350600101614456565b505f5b6008811015614530576144d5816007615085565b6144e0906008614c44565b60608601516001600160401b0390811691161c60f81b8261450283607e614de5565b8151811061451257614512615098565b60200101906001600160f81b03191690815f1a9053506001016144c1565b5060028160405161454191906153ec565b602060405180830381855afa15801561455c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061457f9190614cb0565b94909350915050565b61459061369c565b6136e5614793565b6136e561369c565b6145a861369c565b80355f8051602061546883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145f4608084016060850161524a565b60ff1611156146615760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f614672608084016060850161524a565b60ff16116146da5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146ea608083016060840161524a565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561471b6060830160408401614a5b565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127883835f61479b565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd90608401613821565b6130b661369c565b6060814710156147c05760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147db91906153ec565b5f6040518083038185875af1925050503d805f8114614815576040519150601f19603f3d011682016040523d82523d5f602084013e61481a565b606091505b5091509150611bf086838360608261483a5761483582614881565b611278565b815115801561485157506001600160a01b0384163b155b1561487a57604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611278565b8051156148915780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148b690614df8565b5f825580601f106148c5575050565b601f0160209004905f5260205f2090810190611c049190614925565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614939575f8155600101614926565b5090565b8015158114611c04575f80fd5b803563ffffffff8116811461495d575f80fd5b919050565b5f805f60608486031215614974575f80fd5b8335925060208401356149868161493d565b91506149946040850161494a565b90509250925092565b5f602082840312156149ad575f80fd5b5035919050565b6001600160a01b0381168114611c04575f80fd5b5f808284036101608112156149db575f80fd5b610140808212156149ea575f80fd5b84935083013590506149fb816149b4565b809150509250929050565b5f60208284031215614a16575f80fd5b6112788261494a565b5f8060408385031215614a30575f80fd5b614a398361494a565b946020939093013593505050565b6001600160401b0381168114611c04575f80fd5b5f60208284031215614a6b575f80fd5b813561127881614a47565b5f8060408385031215614a87575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aa9575f80fd5b84356001600160401b03811115614abe575f80fd5b850160608188031215614acf575f80fd5b93506040601f1982011215614ae2575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5760408401826001600160a01b03169052565b506060830151614b7260608401826001600160401b03169052565b506080830151614b8d60808401826001600160401b03169052565b5060a0830151614ba860a08401826001600160401b03169052565b5060c0830151614bc360c08401826001600160401b03169052565b5060e0830151614bde60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bde57614bde614be5565b6001600160401b03818116838216028082169190828114614c3c57614c3c614be5565b505092915050565b8082028115828204841417610a7457610a74614be5565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cc0575f80fd5b5051919050565b5f5b83811015614ce1578181015183820152602001614cc9565b50505f910152565b602081525f8251806020840152614d07816040850160208701614cc7565b601f01601f19169190910160400192915050565b5f82614d3557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bde57614bde614be5565b80820180821115610a7457610a74614be5565b600181811c90821680614e0c57607f821691505b602082108103614e2a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e8981614df8565b806020870152604060018084165f8114614eaa5760018114614ec657614ef3565b60ff19851660408a0152604084151560051b8a01019550614ef3565b895f5260205f205f5b85811015614eea5781548b8201860152908301908801614ecf565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f1c57614f1c614be5565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f5c57614f5c614f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f8a57614f8a614f26565b604052919050565b805161495d8161493d565b5f8060408385031215614fae575f80fd5b82516001600160401b0380821115614fc4575f80fd5b9084019060608287031215614fd7575f80fd5b614fdf614f3a565b82518152602080840151614ff2816149b4565b82820152604084015183811115615007575f80fd5b80850194505087601f85011261501b575f80fd5b83518381111561502d5761502d614f26565b61503f601f8201601f19168301614f62565b93508084528882828701011115615054575f80fd5b61506381838601848801614cc7565b50826040830152819550615078818801614f92565b9450505050509250929050565b81810381811115610a7457610a74614be5565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c04575f80fd5b5f6020828403121561519e575f80fd5b81356112788161517f565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ff8161517f565b61ffff8116905081548161ffff198216178355602084013561522081614a47565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561525a575f80fd5b813560ff81168114611278575f80fd5b5f6020828403121561527a575f80fd5b8135611278816149b4565b5f808335601e1984360301811261529a575f80fd5b8301803591506001600160401b038211156152b3575f80fd5b6020019150368190038213156152c7575f80fd5b9250929050565b601f821115610bd957805f5260205f20601f840160051c810160208510156152f35750805b601f840160051c820191505b81811015610ff3575f81556001016152ff565b81516001600160401b0381111561532b5761532b614f26565b61533f816153398454614df8565b846152ce565b602080601f831160018114615372575f841561535b5750858301515b5f19600386901b1c1916600185901b1785556153c9565b5f85815260208120601f198616915b828110156153a057888601518255948401946001909101908401615381565b50858210156153bd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153e1575f80fd5b81516112788161493d565b5f82516153fd818460208701614cc7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 5f9e160de..dc5a43a78 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516151de3803806151de83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150918061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145af565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ea565b610984565b34801561018b575f80fd5b506101ca61019a3660046145ea565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614601565b610b54565b34801561022d575f80fd5b5061024161023c3660046145ea565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614618565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614631565b610cca565b3480156102ca575f80fd5b506101ca6102d936600461466d565b610e9a565b3480156102e9575f80fd5b506102416102f83660046145ea565b610eb3565b348015610308575f80fd5b5061015f6103173660046145af565b610ec7565b6101ca61032a366004614688565b6110e6565b34801561033a575f80fd5b5061015f610349366004614631565b611112565b348015610359575f80fd5b5061015f610368366004614618565b61132f565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ea565b6114ec565b3480156103dd575f80fd5b5061015f6103ec3660046145ea565b611772565b6101ca6103ff3660046145ea565b611881565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ea565b61188d565b6040516101d491906146f5565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614fe5833981519152949193919290829060ff1660048111156104c2576104c26146e1565b60048111156104d3576104d36146e1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188d565b905042600283516004811115610567576105676146e1565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f805160206150058339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f805160206150058339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196c565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e86896119ee565b6001600160401b03169050605060ff168460c001518461076e91906147e3565b6107789190614803565b6001600160401b031661078c82606461482e565b10156107aa5760405162461bcd60e51b81526004016105b090614845565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061489a565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146e1565b0361088b5761088b8460600151611c8a565b5f84606001518460a001516108a091906147e3565b90506108ac8682611c97565b5f6005600160991b0163ee5b48eb6108c5898686611cdf565b6040518263ffffffff1660e01b81526004016108e191906148d3565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610921919061489a565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff1660058111156109d2576109d26146e1565b60058111156109e3576109e36146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146e1565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cdf565b6040518263ffffffff1660e01b8152600401610b0e91906148d3565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e919061489a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611efe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a5100083614905565b92915050565b5f610c5182611f0f565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020528251909116815291822091909155606082015190519192505f80516020614fe583398151915291610cc5916001600160401b031690612286565b505050565b5f80516020614fe58339815191525f610ce284612299565b90505f80610cf3836040015161247a565b50915091505f610d028361188d565b9050816001600160401b031681608001516001600160401b03161015610d3a5760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d7f5760405162461bcd60e51b81526004016105b090614966565b60015f87815260068701602052604090205460ff166004811115610da557610da56146e1565b14610e0e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a5100061482e565b5f610ebd8261188d565b60a0015192915050565b5f80516020614fe58339815191525f610edf856126b5565b5f86815260058401602052604090205460c0820151919250610f1191620100009091046001600160401b0316906149af565b6001600160401b03168160e001516001600160401b03161015610f925760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110df575f610fa386856119ee565b9050605060ff168260c001518360e00151610fbe91906147e3565b610fc89190614803565b6001600160401b0316610fdc826064614803565b6001600160401b031610156110035760405162461bcd60e51b81526004016105b090614845565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ab919061489a565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110d89084906149cf565b9091555050505b5050505050565b5f6110ef612a5e565b6110fa838334612a95565b9050610c4160015f8051602061504583398151915255565b5f80516020614fe58339815191525f61112a84612299565b90505f8061113b836040015161247a565b50915091505f61114a8361188d565b9050816001600160401b031681608001516001600160401b031610156111825760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600301546001600160401b03808416911611156111c05760405162461bcd60e51b81526004016105b090614966565b60035f87815260068701602052604090205460ff1660048111156111e6576111e66146e1565b1461123a5760405162461bcd60e51b815260206004820152603160248201525f805160206150058339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526112df91612286565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f805160206150258339815191525f61134783612299565b90505f806113588360400151612cc3565b91509150806113ba5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d4906149e2565b9050118015611406575060015f83815260088601602052604090205460ff166005811115611404576114046146e1565b145b6114225760405162461bcd60e51b81526004016105b090614a14565b5f828152600785016020526040812061143a916144f7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614fe583398151915293929190829060ff16600481111561154d5761154d6146e1565b600481111561155e5761155e6146e1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e5576115e56146e1565b14806116035750600381516004811115611601576116016146e1565b145b6116575760405162461bcd60e51b815260206004820152603260248201525f80516020615005833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611665826040015161188d565b905080608001516001600160401b03165f036116e95760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611716846040015184608001518560a00151611cdf565b6040518263ffffffff1660e01b815260040161173291906148d3565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110df919061489a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150258339815191529291906117ba906149e2565b90501180156117ec575060015f83815260088301602052604090205460ff1660058111156117ea576117ea6146e1565b145b6118085760405162461bcd60e51b81526004016105b090614a14565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118419190600401614a5b565b6020604051808303815f875af115801561185d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc5919061489a565b5f610c41823334612e64565b61189561452e565b5f8281525f805160206150658339815191526020526040908190208151610100810190925280545f80516020615025833981519152929190829060ff1660058111156118e3576118e36146e1565b60058111156118f4576118f46146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150658339815191526020526040812060030180545f80516020615025833981519152916001600160401b0390911690836119af83614ae5565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a609190810190614b95565b9150915080611ac35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2a919061489a565b825114611b8e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c045760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c13846040015161325f565b91509150818714611c805760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c94815f613437565b50565b5f9182525f80516020615065833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5857611d18816001614c7d565b611d2390600861482e565b5081515f90839083908110611d3a57611d3a614c90565b60200101906001600160f81b03191690815f1a905350600101611d04565b505f5b6004811015611dbb57611d6f816003614c7d565b611d7a90600861482e565b6001901c60f81b82611d8d8360026149cf565b81518110611d9d57611d9d614c90565b60200101906001600160f81b03191690815f1a905350600101611d5b565b505f5b6020811015611e1d57611dd281601f614c7d565b611ddd90600861482e565b86901c60f81b82611def8360066149cf565b81518110611dff57611dff614c90565b60200101906001600160f81b03191690815f1a905350600101611dbe565b505f5b6008811015611e8857611e34816007614c7d565b611e3f90600861482e565b6001600160401b038616901c60f81b82611e5a8360266149cf565b81518110611e6a57611e6a614c90565b60200101906001600160f81b03191690815f1a905350600101611e20565b505f5b6008811015611ef357611e9f816007614c7d565b611eaa90600861482e565b6001600160401b038516901c60f81b82611ec583602e6149cf565b81518110611ed557611ed5614c90565b60200101906001600160f81b03191690815f1a905350600101611e8b565b5090505b9392505050565b611f06613691565b611c94816136dc565b611f1761452e565b5f805160206150258339815191525f611f2f84612299565b90505f80611f408360400151612cc3565b915091508015611fa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd757611fd76146e1565b6005811115611fe857611fe86146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561206f5761206f6146e1565b148061208d575060018251600581111561208b5761208b6146e1565b145b6120ec5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612101576121016146e1565b0361210e57506004612112565b5060055b6020808301515f9081526009880190915260408120558181600581111561213b5761213b6146e1565b9081600581111561214e5761214e6146e1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612182576121826146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224d5761224d6146e1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122826001600160a01b03821683613748565b60408051606080820183525f8083526020830181905292820152905f805160206150258339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123359190810190614b95565b915091508061239c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146123ff5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f835160361461249e5760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156124ed576124b5816001614c7d565b6124c090600861482e565b61ffff168682815181106124d6576124d6614c90565b016020015160f81c901b91909117906001016124a1565b5061ffff8116156125105760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561256b57612527816003614c7d565b61253290600861482e565b63ffffffff16876125448360026149cf565b8151811061255457612554614c90565b016020015160f81c901b9190911790600101612513565b5063ffffffff81166003146125925760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156125e7576125a981601f614c7d565b6125b490600861482e565b886125c08360066149cf565b815181106125d0576125d0614c90565b016020015160f81c901b9190911790600101612595565b505f805b6008811015612646576125ff816007614c7d565b61260a90600861482e565b6001600160401b03168961261f8360266149cf565b8151811061262f5761262f614c90565b016020015160f81c901b91909117906001016125eb565b505f805b60088110156126a55761265e816007614c7d565b61266990600861482e565b6001600160401b03168a61267e83602e6149cf565b8151811061268e5761268e614c90565b016020015160f81c901b919091179060010161264a565b5091989097509095509350505050565b6126bd61452e565b5f8281525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff16600581111561270b5761270b6146e1565b600581111561271c5761271c6146e1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a4576127a46146e1565b146128005760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128878160a00151611c8a565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cb576128cb6146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612997856129918161196c565b5f611cdf565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c69085906004016148d3565b6020604051808303815f875af11580156129e2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a06919061489a565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020615045833981519152805460011901612a8f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614fe5833981519152906001600160401b0316612ae1604086016020870161466d565b6001600160401b03161015612b505760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b626020860186614d86565b61ffff1610158015612b865750612710612b7f6020860186614d86565b61ffff1611155b612ba25760405162461bcd60e51b81526004016105b090614da1565b8054831015612c055760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7782610c31565b90505f612c8488836137db565b5f81815260058601602052604090209091508790612ca28282614dec565b509098975050505050505050565b60015f8051602061504583398151915255565b5f808251602714612ce65760405162461bcd60e51b81526004016105b090614ca4565b5f805b6002811015612d3557612cfd816001614c7d565b612d0890600861482e565b61ffff16858281518110612d1e57612d1e614c90565b016020015160f81c901b9190911790600101612ce9565b5061ffff811615612d585760405162461bcd60e51b81526004016105b090614ced565b5f805b6004811015612db357612d6f816003614c7d565b612d7a90600861482e565b63ffffffff1686612d8c8360026149cf565b81518110612d9c57612d9c614c90565b016020015160f81c901b9190911790600101612d5b565b5063ffffffff8116600214612dda5760405162461bcd60e51b81526004016105b090614d30565b5f805b6020811015612e2f57612df181601f614c7d565b612dfc90600861482e565b87612e088360066149cf565b81518110612e1857612e18614c90565b016020015160f81c901b9190911790600101612ddd565b505f86602681518110612e4457612e44614c90565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6d612a5e565b5f80516020614fe58339815191525f612e8584610c31565b90505f612e918761188d565b9050600281516005811115612ea857612ea86146e1565b14612f075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1082613d15565b5f828260a00151612f2191906149af565b60048501546060840151919250612f43916001600160401b0390911690614803565b6001600160401b0316816001600160401b03161115612fc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fcc8882611c97565b5f612fd68961196c565b90505f898260405160200161300292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303c8d8688611cdf565b6040518263ffffffff1660e01b815260040161305891906148d3565b6020604051808303815f875af1158015613074573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613098919061489a565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613120576131206146e1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef760015f8051602061504583398151915255565b5f808251602e146132825760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156132d157613299816001614c7d565b6132a490600861482e565b61ffff168582815181106132ba576132ba614c90565b016020015160f81c901b9190911790600101613285565b5061ffff8116156132f45760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561334f5761330b816003614c7d565b61331690600861482e565b63ffffffff16866133288360026149cf565b8151811061333857613338614c90565b016020015160f81c901b91909117906001016132f7565b5063ffffffff81166004146133765760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156133cb5761338d81601f614c7d565b61339890600861482e565b876133a48360066149cf565b815181106133b4576133b4614c90565b016020015160f81c901b9190911790600101613379565b505f805b600881101561342a576133e3816007614c7d565b6133ee90600861482e565b6001600160401b0316886134038360266149cf565b8151811061341357613413614c90565b016020015160f81c901b91909117906001016133cf565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061502583398151915291429190158061351d575060028301548151613519916001600160401b0316906149cf565b8210155b15613543576001600160401b038516606082015281815260408101516020820152613562565b848160600181815161355591906149af565b6001600160401b03169052505b6060810151613572906064614803565b602082015160028501546001600160401b03929092169161359d9190600160401b900460ff1661482e565b10156136015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362a57846001600160401b03168160400181815161362291906149cf565b905250613649565b846001600160401b0316816040018181516136459190614c7d565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136da57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e4613691565b6136ed81613d20565b611c94608082013560a083013561370a60e0850160c0860161466d565b61371b610100860160e08701614d86565b61ffff1661373161012087016101008801614e42565b61374361014088016101208901614e62565b613d41565b8047101561376b5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b4576040519150601f19603f3d011682016040523d82523d5f602084013e6137b9565b606091505b5050905080610cc557604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020615025833981519152426137fb604086016020870161466d565b6001600160401b03161161386d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387d604085016020860161466d565b6001600160401b03166138936202a300426149cf565b116139065760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b833561395e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139ce5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139db6040850185614e7d565b9050603014613a425760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4b83613d15565b5f80613ae56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a90919061466d565b6001600160401b03168152602001613aab60408a018a614e7d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f85565b5f82815260078601602052604090209193509150613b038282614f0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b309085906004016148d3565b6020604051808303815f875af1158015613b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b70919061489a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf257613bf26146e1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce791908e01908e0161466d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c94816001613437565b613d28613691565b613d3061432a565b613d3861433a565b611c9481614342565b613d49613691565b5f80516020614fe583398151915283613db55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd75760405162461bcd60e51b81526004016105b090614da1565b85871115613e3f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f1e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613fef5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406657614026816001614c7d565b61403190600861482e565b5081515f9083908390811061404857614048614c90565b60200101906001600160f81b03191690815f1a905350600101614012565b505f5b60048110156140c45761407d816003614c7d565b61408890600861482e565b505f826140968360026149cf565b815181106140a6576140a6614c90565b60200101906001600160f81b03191690815f1a905350600101614069565b505f5b602081101561412157845181602081106140e3576140e3614c90565b1a60f81b826140f38360066149cf565b8151811061410357614103614c90565b60200101906001600160f81b03191690815f1a9053506001016140c7565b505f5b6020811015614181578460200151816020811061414357614143614c90565b1a60f81b826141538360266149cf565b8151811061416357614163614c90565b60200101906001600160f81b03191690815f1a905350600101614124565b505f5b60088110156141f557614198816007614c7d565b6141a390600861482e565b60ff1685604001516001600160401b0316901c60f81b828260466141c791906149cf565b815181106141d7576141d7614c90565b60200101906001600160f81b03191690815f1a905350600101614184565b505f5b6030811015614260578460800151818151811061421757614217614c90565b01602001516001600160f81b0319168261423283604e6149cf565b8151811061424257614242614c90565b60200101906001600160f81b03191690815f1a9053506001016141f8565b505f5b60088110156142d257614277816007614c7d565b61428290600861482e565b60608601516001600160401b0390811691161c60f81b826142a483607e6149cf565b815181106142b4576142b4614c90565b60200101906001600160f81b03191690815f1a905350600101614263565b506002816040516142e39190614fc9565b602060405180830381855afa1580156142fe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614321919061489a565b94909350915050565b614332613691565b6136da6144ef565b6136da613691565b61434a613691565b80355f8051602061502583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143966080840160608501614e42565b60ff1611156144035760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144146080840160608501614e42565b60ff161161447c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448c6080830160608401614e42565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bd606083016040840161466d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb0613691565b508054614503906149e2565b5f825580601f10614512575050565b601f0160209004905f5260205f2090810190611c949190614572565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614586575f8155600101614573565b5090565b8015158114611c94575f80fd5b803563ffffffff811681146145aa575f80fd5b919050565b5f805f606084860312156145c1575f80fd5b8335925060208401356145d38161458a565b91506145e160408501614597565b90509250925092565b5f602082840312156145fa575f80fd5b5035919050565b5f6101408284031215614612575f80fd5b50919050565b5f60208284031215614628575f80fd5b611ef782614597565b5f8060408385031215614642575f80fd5b61464b83614597565b946020939093013593505050565b6001600160401b0381168114611c94575f80fd5b5f6020828403121561467d575f80fd5b8135611ef781614659565b5f80828403606081121561469a575f80fd5b83356001600160401b038111156146af575f80fd5b8401606081870312156146c0575f80fd5b92506040601f19820112156146d3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474160408401826001600160a01b03169052565b50606083015161475c60608401826001600160401b03169052565b50608083015161477760808401826001600160401b03169052565b5060a083015161479260a08401826001600160401b03169052565b5060c08301516147ad60c08401826001600160401b03169052565b5060e08301516147c860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147c8576147c86147cf565b6001600160401b03818116838216028082169190828114614826576148266147cf565b505092915050565b8082028115828204841417610c4157610c416147cf565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148aa575f80fd5b5051919050565b5f5b838110156148cb5781810151838201526020016148b3565b50505f910152565b602081525f82518060208401526148f18160408501602087016148b1565b601f01601f19169190910160400192915050565b5f8261491f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147c8576147c86147cf565b80820180821115610c4157610c416147cf565b600181811c908216806149f657607f821691505b60208210810361461257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a6d816149e2565b806020870152604060018084165f8114614a8e5760018114614aaa57614ad7565b60ff19851660408a0152604084151560051b8a01019550614ad7565b895f5260205f205f5b85811015614ace5781548b8201860152908301908801614ab3565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b0057614b006147cf565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b4057614b40614b0a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6e57614b6e614b0a565b604052919050565b6001600160a01b0381168114611c94575f80fd5b80516145aa8161458a565b5f8060408385031215614ba6575f80fd5b82516001600160401b0380821115614bbc575f80fd5b9084019060608287031215614bcf575f80fd5b614bd7614b1e565b82518152602080840151614bea81614b76565b82820152604084015183811115614bff575f80fd5b80850194505087601f850112614c13575f80fd5b835183811115614c2557614c25614b0a565b614c37601f8201601f19168301614b46565b93508084528882828701011115614c4c575f80fd5b614c5b818386018488016148b1565b50826040830152819550614c70818801614b8a565b9450505050509250929050565b81810381811115610c4157610c416147cf565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c94575f80fd5b5f60208284031215614d96575f80fd5b8135611ef781614d77565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614df781614d77565b61ffff8116905081548161ffff1982161783556020840135614e1881614659565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e52575f80fd5b813560ff81168114611ef7575f80fd5b5f60208284031215614e72575f80fd5b8135611ef781614b76565b5f808335601e19843603018112614e92575f80fd5b8301803591506001600160401b03821115614eab575f80fd5b602001915036819003821315614ebf575f80fd5b9250929050565b601f821115610cc557805f5260205f20601f840160051c81016020851015614eeb5750805b601f840160051c820191505b818110156110df575f8155600101614ef7565b81516001600160401b03811115614f2357614f23614b0a565b614f3781614f3184546149e2565b84614ec6565b602080601f831160018114614f6a575f8415614f535750858301515b5f19600386901b1c1916600185901b178555614fc1565b5f85815260208120601f198616915b82811015614f9857888601518255948401946001909101908401614f79565b5085821015614fb557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614fda8184602087016148b1565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516151f53803806151f583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150a88061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145c6565b61045a565b005b34801561016c575f80fd5b5061015f61017b366004614601565b610984565b34801561018b575f80fd5b506101ca61019a366004614601565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614618565b610b54565b34801561022d575f80fd5b5061024161023c366004614601565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461462f565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614648565b610cae565b3480156102ca575f80fd5b506101ca6102d9366004614684565b610e7e565b3480156102e9575f80fd5b506102416102f8366004614601565b610e97565b348015610308575f80fd5b5061015f6103173660046145c6565b610eab565b6101ca61032a36600461469f565b6110ca565b34801561033a575f80fd5b5061015f610349366004614648565b6110f6565b348015610359575f80fd5b5061015f61036836600461462f565b611346565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd366004614601565b611503565b3480156103dd575f80fd5b5061015f6103ec366004614601565b611789565b6101ca6103ff366004614601565b611898565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b50610437610432366004614601565b6118a4565b6040516101d4919061470c565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614ffc833981519152949193919290829060ff1660048111156104c2576104c26146f8565b60048111156104d3576104d36146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f836118a4565b905042600283516004811115610567576105676146f8565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f8051602061501c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f8051602061501c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611983565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146f8565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e8689611a05565b6001600160401b03169050605060ff168460c001518461076e91906147fa565b610778919061481a565b6001600160401b031661078c826064614845565b10156107aa5760405162461bcd60e51b81526004016105b09061485c565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906148b1565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146f8565b0361088b5761088b8460600151611ca1565b5f84606001518460a001516108a091906147fa565b90506108ac8682611cae565b5f6005600160991b0163ee5b48eb6108c5898686611cf6565b6040518263ffffffff1660e01b81526004016108e191906148ea565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092191906148b1565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff1660058111156109d2576109d26146f8565b60058111156109e3576109e36146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146f8565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cf6565b6040518263ffffffff1660e01b8152600401610b0e91906148ea565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e91906148b1565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611f15565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a510008361491c565b92915050565b5f80516020614ffc8339815191525f610c5f83611f26565b604081810180516001600160a01b039081165f908152600a8701602052825190911681529182209190915560608201519051919250610ca9916001600160401b039091169061229d565b505050565b5f80516020614ffc8339815191525f610cc6846122b0565b90505f80610cd78360400151612491565b50915091505f610ce6836118a4565b9050816001600160401b031681608001516001600160401b03161015610d1e5760405162461bcd60e51b81526004016105b09061493b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d635760405162461bcd60e51b81526004016105b09061497d565b60015f87815260068701602052604090205460ff166004811115610d8957610d896146f8565b14610df25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a51000614845565b5f610ea1826118a4565b60a0015192915050565b5f80516020614ffc8339815191525f610ec3856126cc565b5f86815260058401602052604090205460c0820151919250610ef591620100009091046001600160401b0316906149c6565b6001600160401b03168160e001516001600160401b03161015610f765760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110c3575f610f878685611a05565b9050605060ff168260c001518360e00151610fa291906147fa565b610fac919061481a565b6001600160401b0316610fc082606461481a565b6001600160401b03161015610fe75760405162461bcd60e51b81526004016105b09061485c565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561106b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108f91906148b1565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110bc9084906149e6565b9091555050505b5050505050565b5f6110d3612a75565b6110de838334612aac565b9050610c4160015f8051602061505c83398151915255565b5f80516020614ffc8339815191525f61110e846122b0565b90505f8061111f8360400151612491565b50915091505f61112e836118a4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611168576111686146f8565b6004811115611179576111796146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112185760405162461bcd60e51b81526004016105b09061493b565b5f8781526006870160205260409020600301546001600160401b03808516911611156112565760405162461bcd60e51b81526004016105b09061497d565b60038151600481111561126b5761126b6146f8565b146112bf5760405162461bcd60e51b815260206004820152603160248201525f8051602061501c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff19166004179055600989018252822091909155606082015190820151611304916001600160401b03169061229d565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061503c8339815191525f61135e836122b0565b90505f8061136f8360400151612cda565b91509150806113d15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113eb906149f9565b905011801561141d575060015f83815260088601602052604090205460ff16600581111561141b5761141b6146f8565b145b6114395760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078501602052604081206114519161450e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614ffc83398151915293929190829060ff166004811115611564576115646146f8565b6004811115611575576115756146f8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115fc576115fc6146f8565b148061161a5750600381516004811115611618576116186146f8565b145b61166e5760405162461bcd60e51b815260206004820152603260248201525f8051602061501c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61167c82604001516118a4565b905080608001516001600160401b03165f036117005760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb61172d846040015184608001518560a00151611cf6565b6040518263ffffffff1660e01b815260040161174991906148ea565b6020604051808303815f875af1158015611765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c391906148b1565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061503c8339815191529291906117d1906149f9565b9050118015611803575060015f83815260088301602052604090205460ff166005811115611801576118016146f8565b145b61181f5760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118589190600401614a72565b6020604051808303815f875af1158015611874573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca991906148b1565b5f610c41823334612e7b565b6118ac614545565b5f8281525f8051602061507c8339815191526020526040908190208151610100810190925280545f8051602061503c833981519152929190829060ff1660058111156118fa576118fa6146f8565b600581111561190b5761190b6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061507c8339815191526020526040812060030180545f8051602061503c833981519152916001600160401b0390911690836119c683614afc565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a779190810190614bac565b9150915080611ada5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4191906148b1565b825114611ba55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c1b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c2a8460400151613276565b91509150818714611c975760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611cab815f61344e565b50565b5f9182525f8051602061507c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6f57611d2f816001614c94565b611d3a906008614845565b5081515f90839083908110611d5157611d51614ca7565b60200101906001600160f81b03191690815f1a905350600101611d1b565b505f5b6004811015611dd257611d86816003614c94565b611d91906008614845565b6001901c60f81b82611da48360026149e6565b81518110611db457611db4614ca7565b60200101906001600160f81b03191690815f1a905350600101611d72565b505f5b6020811015611e3457611de981601f614c94565b611df4906008614845565b86901c60f81b82611e068360066149e6565b81518110611e1657611e16614ca7565b60200101906001600160f81b03191690815f1a905350600101611dd5565b505f5b6008811015611e9f57611e4b816007614c94565b611e56906008614845565b6001600160401b038616901c60f81b82611e718360266149e6565b81518110611e8157611e81614ca7565b60200101906001600160f81b03191690815f1a905350600101611e37565b505f5b6008811015611f0a57611eb6816007614c94565b611ec1906008614845565b6001600160401b038516901c60f81b82611edc83602e6149e6565b81518110611eec57611eec614ca7565b60200101906001600160f81b03191690815f1a905350600101611ea2565b5090505b9392505050565b611f1d6136a8565b611cab816136f3565b611f2e614545565b5f8051602061503c8339815191525f611f46846122b0565b90505f80611f578360400151612cda565b915091508015611fbc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fee57611fee6146f8565b6005811115611fff57611fff6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612086576120866146f8565b14806120a457506001825160058111156120a2576120a26146f8565b145b6121035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612118576121186146f8565b0361212557506004612129565b5060055b6020808301515f90815260098801909152604081205581816005811115612152576121526146f8565b90816005811115612165576121656146f8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612199576121996146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612264576122646146f8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122996001600160a01b0382168361375f565b60408051606080820183525f8083526020830181905292820152905f8051602061503c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612325573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261234c9190810190614bac565b91509150806123b35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124165760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124895760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124b55760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612504576124cc816001614c94565b6124d7906008614845565b61ffff168682815181106124ed576124ed614ca7565b016020015160f81c901b91909117906001016124b8565b5061ffff8116156125275760405162461bcd60e51b81526004016105b090614d04565b5f805b60048110156125825761253e816003614c94565b612549906008614845565b63ffffffff168761255b8360026149e6565b8151811061256b5761256b614ca7565b016020015160f81c901b919091179060010161252a565b5063ffffffff81166003146125a95760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156125fe576125c081601f614c94565b6125cb906008614845565b886125d78360066149e6565b815181106125e7576125e7614ca7565b016020015160f81c901b91909117906001016125ac565b505f805b600881101561265d57612616816007614c94565b612621906008614845565b6001600160401b0316896126368360266149e6565b8151811061264657612646614ca7565b016020015160f81c901b9190911790600101612602565b505f805b60088110156126bc57612675816007614c94565b612680906008614845565b6001600160401b03168a61269583602e6149e6565b815181106126a5576126a5614ca7565b016020015160f81c901b9190911790600101612661565b5091989097509095509350505050565b6126d4614545565b5f8281525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff166005811115612722576127226146f8565b6005811115612733576127336146f8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127bb576127bb6146f8565b146128175760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128915760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b61289e8160a00151611ca1565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128e2576128e26146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129ae856129a881611983565b5f611cf6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129dd9085906004016148ea565b6020604051808303815f875af11580156129f9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1d91906148b1565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8051602061505c833981519152805460011901612aa657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ffc833981519152906001600160401b0316612af86040860160208701614684565b6001600160401b03161015612b675760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b796020860186614d9d565b61ffff1610158015612b9d5750612710612b966020860186614d9d565b61ffff1611155b612bb95760405162461bcd60e51b81526004016105b090614db8565b8054831015612c1c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c835760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8e82610c31565b90505f612c9b88836137f2565b5f81815260058601602052604090209091508790612cb98282614e03565b509098975050505050505050565b60015f8051602061505c83398151915255565b5f808251602714612cfd5760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612d4c57612d14816001614c94565b612d1f906008614845565b61ffff16858281518110612d3557612d35614ca7565b016020015160f81c901b9190911790600101612d00565b5061ffff811615612d6f5760405162461bcd60e51b81526004016105b090614d04565b5f805b6004811015612dca57612d86816003614c94565b612d91906008614845565b63ffffffff1686612da38360026149e6565b81518110612db357612db3614ca7565b016020015160f81c901b9190911790600101612d72565b5063ffffffff8116600214612df15760405162461bcd60e51b81526004016105b090614d47565b5f805b6020811015612e4657612e0881601f614c94565b612e13906008614845565b87612e1f8360066149e6565b81518110612e2f57612e2f614ca7565b016020015160f81c901b9190911790600101612df4565b505f86602681518110612e5b57612e5b614ca7565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e84612a75565b5f80516020614ffc8339815191525f612e9c84610c31565b90505f612ea8876118a4565b9050600281516005811115612ebf57612ebf6146f8565b14612f1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f2782613d2c565b5f828260a00151612f3891906149c6565b60048501546060840151919250612f5a916001600160401b039091169061481a565b6001600160401b0316816001600160401b03161115612fd95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fe38882611cae565b5f612fed89611983565b90505f898260405160200161301992919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130538d8688611cf6565b6040518263ffffffff1660e01b815260040161306f91906148ea565b6020604051808303815f875af115801561308b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130af91906148b1565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613137576131376146f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0e60015f8051602061505c83398151915255565b5f808251602e146132995760405162461bcd60e51b81526004016105b090614cbb565b5f805b60028110156132e8576132b0816001614c94565b6132bb906008614845565b61ffff168582815181106132d1576132d1614ca7565b016020015160f81c901b919091179060010161329c565b5061ffff81161561330b5760405162461bcd60e51b81526004016105b090614d04565b5f805b600481101561336657613322816003614c94565b61332d906008614845565b63ffffffff168661333f8360026149e6565b8151811061334f5761334f614ca7565b016020015160f81c901b919091179060010161330e565b5063ffffffff811660041461338d5760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156133e2576133a481601f614c94565b6133af906008614845565b876133bb8360066149e6565b815181106133cb576133cb614ca7565b016020015160f81c901b9190911790600101613390565b505f805b6008811015613441576133fa816007614c94565b613405906008614845565b6001600160401b03168861341a8360266149e6565b8151811061342a5761342a614ca7565b016020015160f81c901b91909117906001016133e6565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061503c833981519152914291901580613534575060028301548151613530916001600160401b0316906149e6565b8210155b1561355a576001600160401b038516606082015281815260408101516020820152613579565b848160600181815161356c91906149c6565b6001600160401b03169052505b606081015161358990606461481a565b602082015160028501546001600160401b0392909216916135b49190600160401b900460ff16614845565b10156136185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561364157846001600160401b03168160400181815161363991906149e6565b905250613660565b846001600160401b03168160400181815161365c9190614c94565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136f157604051631afcd79f60e31b815260040160405180910390fd5b565b6136fb6136a8565b61370481613d37565b611cab608082013560a083013561372160e0850160c08601614684565b613732610100860160e08701614d9d565b61ffff1661374861012087016101008801614e59565b61375a61014088016101208901614e79565b613d58565b804710156137825760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137cb576040519150601f19603f3d011682016040523d82523d5f602084013e6137d0565b606091505b5050905080610ca957604051630a12f52160e11b815260040160405180910390fd5b5f5f8051602061503c833981519152426138126040860160208701614684565b6001600160401b0316116138845760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138946040850160208601614684565b6001600160401b03166138aa6202a300426149e6565b1161391d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139755760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139e55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139f26040850185614e94565b9050603014613a595760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a6283613d2c565b5f80613afc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613aa79190614684565b6001600160401b03168152602001613ac260408a018a614e94565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f9c565b5f82815260078601602052604090209193509150613b1a8282614f21565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b479085906004016148ea565b6020604051808303815f875af1158015613b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8791906148b1565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c0957613c096146f8565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cfe91908e01908e01614684565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611cab81600161344e565b613d3f6136a8565b613d47614341565b613d4f614351565b611cab81614359565b613d606136a8565b5f80516020614ffc83398151915283613dcc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dee5760405162461bcd60e51b81526004016105b090614db8565b85871115613e565760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613ec35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140065760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407d5761403d816001614c94565b614048906008614845565b5081515f9083908390811061405f5761405f614ca7565b60200101906001600160f81b03191690815f1a905350600101614029565b505f5b60048110156140db57614094816003614c94565b61409f906008614845565b505f826140ad8360026149e6565b815181106140bd576140bd614ca7565b60200101906001600160f81b03191690815f1a905350600101614080565b505f5b602081101561413857845181602081106140fa576140fa614ca7565b1a60f81b8261410a8360066149e6565b8151811061411a5761411a614ca7565b60200101906001600160f81b03191690815f1a9053506001016140de565b505f5b6020811015614198578460200151816020811061415a5761415a614ca7565b1a60f81b8261416a8360266149e6565b8151811061417a5761417a614ca7565b60200101906001600160f81b03191690815f1a90535060010161413b565b505f5b600881101561420c576141af816007614c94565b6141ba906008614845565b60ff1685604001516001600160401b0316901c60f81b828260466141de91906149e6565b815181106141ee576141ee614ca7565b60200101906001600160f81b03191690815f1a90535060010161419b565b505f5b6030811015614277578460800151818151811061422e5761422e614ca7565b01602001516001600160f81b0319168261424983604e6149e6565b8151811061425957614259614ca7565b60200101906001600160f81b03191690815f1a90535060010161420f565b505f5b60088110156142e95761428e816007614c94565b614299906008614845565b60608601516001600160401b0390811691161c60f81b826142bb83607e6149e6565b815181106142cb576142cb614ca7565b60200101906001600160f81b03191690815f1a90535060010161427a565b506002816040516142fa9190614fe0565b602060405180830381855afa158015614315573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061433891906148b1565b94909350915050565b6143496136a8565b6136f1614506565b6136f16136a8565b6143616136a8565b80355f8051602061503c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143ad6080840160608501614e59565b60ff16111561441a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61442b6080840160608501614e59565b60ff16116144935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144a36080830160608401614e59565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144d46060830160408401614684565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cc76136a8565b50805461451a906149f9565b5f825580601f10614529575050565b601f0160209004905f5260205f2090810190611cab9190614589565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561459d575f815560010161458a565b5090565b8015158114611cab575f80fd5b803563ffffffff811681146145c1575f80fd5b919050565b5f805f606084860312156145d8575f80fd5b8335925060208401356145ea816145a1565b91506145f8604085016145ae565b90509250925092565b5f60208284031215614611575f80fd5b5035919050565b5f6101408284031215614629575f80fd5b50919050565b5f6020828403121561463f575f80fd5b611f0e826145ae565b5f8060408385031215614659575f80fd5b614662836145ae565b946020939093013593505050565b6001600160401b0381168114611cab575f80fd5b5f60208284031215614694575f80fd5b8135611f0e81614670565b5f8082840360608112156146b1575f80fd5b83356001600160401b038111156146c6575f80fd5b8401606081870312156146d7575f80fd5b92506040601f19820112156146ea575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061473057634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161475860408401826001600160a01b03169052565b50606083015161477360608401826001600160401b03169052565b50608083015161478e60808401826001600160401b03169052565b5060a08301516147a960a08401826001600160401b03169052565b5060c08301516147c460c08401826001600160401b03169052565b5060e08301516147df60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147df576147df6147e6565b6001600160401b0381811683821602808216919082811461483d5761483d6147e6565b505092915050565b8082028115828204841417610c4157610c416147e6565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148c1575f80fd5b5051919050565b5f5b838110156148e25781810151838201526020016148ca565b50505f910152565b602081525f82518060208401526149088160408501602087016148c8565b601f01601f19169190910160400192915050565b5f8261493657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147df576147df6147e6565b80820180821115610c4157610c416147e6565b600181811c90821680614a0d57607f821691505b60208210810361462957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a84816149f9565b806020870152604060018084165f8114614aa55760018114614ac157614aee565b60ff19851660408a0152604084151560051b8a01019550614aee565b895f5260205f205f5b85811015614ae55781548b8201860152908301908801614aca565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b1757614b176147e6565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5757614b57614b21565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8557614b85614b21565b604052919050565b6001600160a01b0381168114611cab575f80fd5b80516145c1816145a1565b5f8060408385031215614bbd575f80fd5b82516001600160401b0380821115614bd3575f80fd5b9084019060608287031215614be6575f80fd5b614bee614b35565b82518152602080840151614c0181614b8d565b82820152604084015183811115614c16575f80fd5b80850194505087601f850112614c2a575f80fd5b835183811115614c3c57614c3c614b21565b614c4e601f8201601f19168301614b5d565b93508084528882828701011115614c63575f80fd5b614c72818386018488016148c8565b50826040830152819550614c87818801614ba1565b9450505050509250929050565b81810381811115610c4157610c416147e6565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611cab575f80fd5b5f60208284031215614dad575f80fd5b8135611f0e81614d8e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e0e81614d8e565b61ffff8116905081548161ffff1982161783556020840135614e2f81614670565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e69575f80fd5b813560ff81168114611f0e575f80fd5b5f60208284031215614e89575f80fd5b8135611f0e81614b8d565b5f808335601e19843603018112614ea9575f80fd5b8301803591506001600160401b03821115614ec2575f80fd5b602001915036819003821315614ed6575f80fd5b9250929050565b601f821115610ca957805f5260205f20601f840160051c81016020851015614f025750805b601f840160051c820191505b818110156110c3575f8155600101614f0e565b81516001600160401b03811115614f3a57614f3a614b21565b614f4e81614f4884546149f9565b84614edd565b602080601f831160018114614f81575f8415614f6a5750858301515b5f19600386901b1c1916600185901b178555614fd8565b5f85815260208120601f198616915b82811015614faf57888601518255948401946001909101908401614f90565b5085821015614fcc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614ff18184602087016148c8565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 1282c87ad..be4a4cbcf 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -55,9 +55,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice Maps the delegationID to pending end delegator messages. mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; /// @notice Maps the delegationID to its pending staking rewards. - mapping(bytes32 delegationID => uint256) _pendingDelegatorRewards; + mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; /// @notice Maps the validator owner address to its pending staking rewards. - mapping(address validatorOwner => uint256) _pendingValidatorRewards; + mapping(address validatorOwner => uint256) _redeemableValidatorRewards; } // solhint-enable private-vars-leading-underscore @@ -157,19 +157,19 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: minimum uptime threshold not met" ); - $._pendingValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( + $._redeemableValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( validator.weight, validator.startedAt, validator.endedAt, 0, 0 ); } } function completeEndValidation(uint32 messageIndex) external { - Validator memory validator = _completeEndValidation(messageIndex); - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - _reward(validator.owner, $._pendingValidatorRewards[validator.owner]); - delete $._pendingValidatorRewards[validator.owner]; + Validator memory validator = _completeEndValidation(messageIndex); + + _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); + delete $._redeemableValidatorRewards[validator.owner]; _unlock(validator.startingWeight, validator.owner); } @@ -383,7 +383,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: minimum uptime threshold not met" ); - $._pendingDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 ); } @@ -452,6 +452,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); Validator memory validator = getValidator(validationID); + Delegator memory delegator = $._delegatorStakes[delegationID]; + // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update // on the P-Chain. @@ -470,39 +472,20 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // end delegation has been initialized, we need to make sure that this function is only // callable after that has been done. require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, + delegator.status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegation not pending added" ); // Update the delegator status $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; - Delegator memory delegator = $._delegatorStakes[delegationID]; + _reward(delegator.owner, $._redeemableDelegatorRewards[delegationID]); + delete $._redeemableDelegatorRewards[delegationID]; _unlock(delegator.weight, delegator.owner); - - _reward(delegator.owner, $._pendingDelegatorRewards[delegationID]); - delete $._pendingDelegatorRewards[delegationID]; + // TODO can we remove the delegation from _delegatorStakes here? emit DelegationEnded(delegationID, validationID, nonce); } - function _checkPendingEndDelegatorMessage(bytes32 delegationID) private view { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingEndDelegatorMessages[delegationID].length > 0 - && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegation removal not pending" - ); - } - - function _checkPendingRegisterDelegatorMessages(bytes32 delegationID) private view { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingRegisterDelegatorMessages[delegationID].length > 0 - && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegation registration not pending" - ); - } - function _reward(address account, uint256 amount) internal virtual; } From 267d92eb8e93580495776e72068470de5a3bb6ce Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 14:03:37 -0400 Subject: [PATCH 10/36] Fixups --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../staking/ERC20TokenStakingManager.sol | 2 +- .../staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/PoSValidatorManager.sol | 38 +++++++++---------- .../tests/PoSValidatorManagerTests.t.sol | 31 ++++++++------- 6 files changed, 41 insertions(+), 36 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6b453d2dd..dd3700e72 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161562138038061562183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154d48061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614962565b61036a565b005b61015f61016f36600461499d565b610894565b6101b261018236600461499d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461499d565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149c8565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a06565b610b59565b61015f61025a366004614a1f565b610bde565b6101b261026d366004614a5b565b610dae565b6101f261028036600461499d565b610dc7565b61015f610293366004614962565b610ddb565b61015f6102a6366004614a1f565b610ffa565b6101b26102b9366004614a76565b61126c565b6101b26102cc366004614a96565b61127f565b61015f6102df366004614a06565b6112ab565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461499d565b611468565b61015f61033336600461499d565b6116ee565b6101cd601481565b61035361034e36600461499d565b6117fd565b6040516101bc9190614b0b565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615428833981519152949193919290829060ff1660048111156103d2576103d2614af7565b60048111156103e3576103e3614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117fd565b90504260028351600481111561047757610477614af7565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154488339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154488339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118dc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614af7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e868961195e565b6001600160401b03169050605060ff168460c001518461067e9190614bf9565b6106889190614c19565b6001600160401b031661069c826064614c44565b10156106ba5760405162461bcd60e51b81526004016104c090614c5b565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614cb0565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614af7565b0361079b5761079b8460600151611bfa565b5f84606001518460a001516107b09190614bf9565b90506107bc8682611c07565b5f6005600160991b0163ee5b48eb6107d5898686611c4f565b6040518263ffffffff1660e01b81526004016107f19190614ce9565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614cb0565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff1660058111156108e2576108e2614af7565b60058111156108f3576108f3614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614af7565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c4f565b6040518263ffffffff1660e01b8152600401610a1e9190614ce9565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614cb0565b50505050565b5f610a7464e8d4a5100083614d1b565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e6c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206154288339815191525f610b7183611e8a565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9d916121fd565b604080820180516001600160a01b03165f908152600a85016020529182209190915560608201519051610bd9916001600160401b031690612273565b505050565b5f805160206154288339815191525f610bf684612296565b90505f80610c078360400151612477565b50915091505f610c16836117fd565b9050816001600160401b031681608001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016104c090614d3a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b81526004016104c090614d7c565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9614af7565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c44565b5f610dd1826117fd565b60a0015192915050565b5f805160206154288339815191525f610df3856126b2565b5f86815260058401602052604090205460c0820151919250610e2591620100009091046001600160401b031690614dc5565b6001600160401b03168160e001516001600160401b03161015610ea65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610ff3575f610eb7868561195e565b9050605060ff168260c001518360e00151610ed29190614bf9565b610edc9190614c19565b6001600160401b0316610ef0826064614c19565b6001600160401b03161015610f175760405162461bcd60e51b81526004016104c090614c5b565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbf9190614cb0565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fec908490614de5565b9091555050505b5050505050565b5f805160206154288339815191525f61101284612296565b90505f806110238360400151612477565b50915091505f611032836117fd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106c5761106c614af7565b600481111561107d5761107d614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561111c5760405162461bcd60e51b81526004016104c090614d3a565b5f8781526006870160205260409020600301546001600160401b038085169116111561115a5760405162461bcd60e51b81526004016104c090614d7c565b60038151600481111561116f5761116f614af7565b146111c35760405162461bcd60e51b815260206004820152603160248201525f805160206154488339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f991906121fd565b856009015f8881526020019081526020015f205f905561122a81606001516001600160401b03168260200151612273565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611278833384612a5b565b9392505050565b5f611288612e59565b611293848484612e90565b905061127860015f8051602061548883398151915255565b5f805160206154688339815191525f6112c383612296565b90505f806112d483604001516130c9565b91509150806113365760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135090614df8565b9050118015611382575060015f83815260088601602052604090205460ff16600581111561138057611380614af7565b145b61139e5760405162461bcd60e51b81526004016104c090614e30565b5f82815260078501602052604081206113b6916148aa565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061542883398151915293929190829060ff1660048111156114c9576114c9614af7565b60048111156114da576114da614af7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156157611561614af7565b148061157f575060038151600481111561157d5761157d614af7565b145b6115d35760405162461bcd60e51b815260206004820152603260248201525f80516020615448833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e182604001516117fd565b905080608001516001600160401b03165f036116655760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611692846040015184608001518560a00151611c4f565b6040518263ffffffff1660e01b81526004016116ae9190614ce9565b6020604051808303815f875af11580156116ca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff39190614cb0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061546883398151915292919061173690614df8565b9050118015611768575060015f83815260088301602052604090205460ff16600581111561176657611766614af7565b145b6117845760405162461bcd60e51b81526004016104c090614e30565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117bd9190600401614e77565b6020604051808303815f875af11580156117d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd99190614cb0565b6118056148e1565b5f8281525f805160206154a88339815191526020526040908190208151610100810190925280545f80516020615468833981519152929190829060ff16600581111561185357611853614af7565b600581111561186457611864614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154a88339815191526020526040812060030180545f80516020615468833981519152916001600160401b03909116908361191f83614f01565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d09190810190614f9d565b9150915080611a335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9a9190614cb0565b825114611afe5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b745760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b83846040015161326a565b91509150818714611bf05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c04815f613442565b50565b5f9182525f805160206154a8833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cc857611c88816001615085565b611c93906008614c44565b5081515f90839083908110611caa57611caa615098565b60200101906001600160f81b03191690815f1a905350600101611c74565b505f5b6004811015611d2b57611cdf816003615085565b611cea906008614c44565b6001901c60f81b82611cfd836002614de5565b81518110611d0d57611d0d615098565b60200101906001600160f81b03191690815f1a905350600101611ccb565b505f5b6020811015611d8d57611d4281601f615085565b611d4d906008614c44565b86901c60f81b82611d5f836006614de5565b81518110611d6f57611d6f615098565b60200101906001600160f81b03191690815f1a905350600101611d2e565b505f5b6008811015611df857611da4816007615085565b611daf906008614c44565b6001600160401b038616901c60f81b82611dca836026614de5565b81518110611dda57611dda615098565b60200101906001600160f81b03191690815f1a905350600101611d90565b505f5b6008811015611e6357611e0f816007615085565b611e1a906008614c44565b6001600160401b038516901c60f81b82611e3583602e614de5565b81518110611e4557611e45615098565b60200101906001600160f81b03191690815f1a905350600101611dfb565b50949350505050565b611e7461369c565b611e7d826136e7565b611e8681613753565b5050565b611e926148e1565b5f805160206154688339815191525f611eaa84612296565b90505f80611ebb83604001516130c9565b915091508015611f205760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5257611f52614af7565b6005811115611f6357611f63614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fea57611fea614af7565b1480612008575060018251600581111561200657612006614af7565b145b6120675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207c5761207c614af7565b036120895750600461208d565b5060055b6020808301515f908152600988019091526040812055818160058111156120b6576120b6614af7565b908160058111156120c9576120c9614af7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120fd576120fd614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121c8576121c8614af7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061540883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612258575f80fd5b505af115801561226a573d5f803e3d5ffd5b50505050505050565b5f8051602061540883398151915254611e86906001600160a01b031682846137f4565b60408051606080820183525f8083526020830181905292820152905f805160206154688339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123329190810190614f9d565b91509150806123995760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123fc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561246f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f835160361461249b5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156124ea576124b2816001615085565b6124bd906008614c44565b61ffff168682815181106124d3576124d3615098565b016020015160f81c901b919091179060010161249e565b5061ffff81161561250d5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561256857612524816003615085565b61252f906008614c44565b63ffffffff1687612541836002614de5565b8151811061255157612551615098565b016020015160f81c901b9190911790600101612510565b5063ffffffff811660031461258f5760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156125e4576125a681601f615085565b6125b1906008614c44565b886125bd836006614de5565b815181106125cd576125cd615098565b016020015160f81c901b9190911790600101612592565b505f805b6008811015612643576125fc816007615085565b612607906008614c44565b6001600160401b03168961261c836026614de5565b8151811061262c5761262c615098565b016020015160f81c901b91909117906001016125e8565b505f805b60088110156126a25761265b816007615085565b612666906008614c44565b6001600160401b03168a61267b83602e614de5565b8151811061268b5761268b615098565b016020015160f81c901b9190911790600101612647565b5091989097509095509350505050565b6126ba6148e1565b5f8281525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff16600581111561270857612708614af7565b600581111561271957612719614af7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a1576127a1614af7565b146127fd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128775760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128848160a00151611bfa565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128c8576128c8614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129948561298e816118dc565b5f611c4f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c3908590600401614ce9565b6020604051808303815f875af11580156129df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a039190614cb0565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a64612e59565b5f805160206154288339815191525f612a7f6101ed85613853565b90505f612a8b876117fd565b9050600281516005811115612aa257612aa2614af7565b14612b015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b0a82613876565b5f828260a00151612b1b9190614dc5565b60048501546060840151919250612b3d916001600160401b0390911690614c19565b6001600160401b0316816001600160401b03161115612bbc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bc68882611c07565b5f612bd0896118dc565b90505f8982604051602001612bfc92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c368d8688611c4f565b6040518263ffffffff1660e01b8152600401612c529190614ce9565b6020604051808303815f875af1158015612c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c929190614cb0565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1a57612d1a614af7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127860015f8051602061548883398151915255565b5f80516020615488833981519152805460011901612e8a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615428833981519152906001600160401b0316612edc6040860160208701614a5b565b6001600160401b03161015612f4b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f5d602086018661518e565b61ffff1610158015612f815750612710612f7a602086018661518e565b61ffff1611155b612f9d5760405162461bcd60e51b81526004016104c0906151a9565b80548310156130005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130675760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307184613853565b90505f61307d82610a64565b90505f61308a8883613881565b5f818152600586016020526040902090915087906130a882826151f4565b509098975050505050505050565b60015f8051602061548883398151915255565b5f8082516027146130ec5760405162461bcd60e51b81526004016104c0906150ac565b5f805b600281101561313b57613103816001615085565b61310e906008614c44565b61ffff1685828151811061312457613124615098565b016020015160f81c901b91909117906001016130ef565b5061ffff81161561315e5760405162461bcd60e51b81526004016104c0906150f5565b5f805b60048110156131b957613175816003615085565b613180906008614c44565b63ffffffff1686613192836002614de5565b815181106131a2576131a2615098565b016020015160f81c901b9190911790600101613161565b5063ffffffff81166002146131e05760405162461bcd60e51b81526004016104c090615138565b5f805b6020811015613235576131f781601f615085565b613202906008614c44565b8761320e836006614de5565b8151811061321e5761321e615098565b016020015160f81c901b91909117906001016131e3565b505f8660268151811061324a5761324a615098565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461328d5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156132dc576132a4816001615085565b6132af906008614c44565b61ffff168582815181106132c5576132c5615098565b016020015160f81c901b9190911790600101613290565b5061ffff8116156132ff5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561335a57613316816003615085565b613321906008614c44565b63ffffffff1686613333836002614de5565b8151811061334357613343615098565b016020015160f81c901b9190911790600101613302565b5063ffffffff81166004146133815760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156133d65761339881601f615085565b6133a3906008614c44565b876133af836006614de5565b815181106133bf576133bf615098565b016020015160f81c901b9190911790600101613384565b505f805b6008811015613435576133ee816007615085565b6133f9906008614c44565b6001600160401b03168861340e836026614de5565b8151811061341e5761341e615098565b016020015160f81c901b91909117906001016133da565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615468833981519152914291901580613528575060028301548151613524916001600160401b031690614de5565b8210155b1561354e576001600160401b03851660608201528181526040810151602082015261356d565b84816060018181516135609190614dc5565b6001600160401b03169052505b606081015161357d906064614c19565b602082015160028501546001600160401b0392909216916135a89190600160401b900460ff16614c44565b101561360c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363557846001600160401b03168160400181815161362d9190614de5565b905250613654565b846001600160401b0316816040018181516136509190615085565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e557604051631afcd79f60e31b815260040160405180910390fd5b565b6136ef61369c565b6136f881613dbb565b611c04608082013560a083013561371560e0850160c08601614a5b565b613726610100860160e0870161518e565b61ffff1661373c6101208701610100880161524a565b61374e6101408801610120890161526a565b613ddc565b61375b61369c565b5f805160206154088339815191526001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614020565b5f610a74825f80516020615408833981519152546001600160a01b031690614081565b611c04816001613442565b5f5f80516020615468833981519152426138a16040860160208701614a5b565b6001600160401b0316116139135760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139236040850160208601614a5b565b6001600160401b03166139396202a30042614de5565b116139ac5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a045760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a816040850185615285565b9050603014613ae85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af183613876565b5f80613b8b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b369190614a5b565b6001600160401b03168152602001613b5160408a018a615285565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e3565b5f82815260078601602052604090209193509150613ba98282615312565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bd6908590600401614ce9565b6020604051808303815f875af1158015613bf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c169190614cb0565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9857613c98614af7565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8d91908e01908e01614a5b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc361369c565b613dcb614588565b613dd3614598565b611c04816145a0565b613de461369c565b5f8051602061542883398151915283613e505760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e725760405162461bcd60e51b81526004016104c0906151a9565b85871115613eda5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f475760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fb95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140346001600160a01b0384168361474d565b905080515f1415801561405857508080602001905181019061405691906153d1565b155b15610bd957604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140eb9190614cb0565b90506141026001600160a01b03851633308661475a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614146573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416a9190614cb0565b90508181116141d05760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141da8282615085565b95945050505050565b5f606082608001515160301461424d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142c457614284816001615085565b61428f906008614c44565b5081515f908390839081106142a6576142a6615098565b60200101906001600160f81b03191690815f1a905350600101614270565b505f5b6004811015614322576142db816003615085565b6142e6906008614c44565b505f826142f4836002614de5565b8151811061430457614304615098565b60200101906001600160f81b03191690815f1a9053506001016142c7565b505f5b602081101561437f578451816020811061434157614341615098565b1a60f81b82614351836006614de5565b8151811061436157614361615098565b60200101906001600160f81b03191690815f1a905350600101614325565b505f5b60208110156143df57846020015181602081106143a1576143a1615098565b1a60f81b826143b1836026614de5565b815181106143c1576143c1615098565b60200101906001600160f81b03191690815f1a905350600101614382565b505f5b6008811015614453576143f6816007615085565b614401906008614c44565b60ff1685604001516001600160401b0316901c60f81b828260466144259190614de5565b8151811061443557614435615098565b60200101906001600160f81b03191690815f1a9053506001016143e2565b505f5b60308110156144be578460800151818151811061447557614475615098565b01602001516001600160f81b0319168261449083604e614de5565b815181106144a0576144a0615098565b60200101906001600160f81b03191690815f1a905350600101614456565b505f5b6008811015614530576144d5816007615085565b6144e0906008614c44565b60608601516001600160401b0390811691161c60f81b8261450283607e614de5565b8151811061451257614512615098565b60200101906001600160f81b03191690815f1a9053506001016144c1565b5060028160405161454191906153ec565b602060405180830381855afa15801561455c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061457f9190614cb0565b94909350915050565b61459061369c565b6136e5614793565b6136e561369c565b6145a861369c565b80355f8051602061546883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145f4608084016060850161524a565b60ff1611156146615760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f614672608084016060850161524a565b60ff16116146da5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146ea608083016060840161524a565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561471b6060830160408401614a5b565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127883835f61479b565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd90608401613821565b6130b661369c565b6060814710156147c05760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147db91906153ec565b5f6040518083038185875af1925050503d805f8114614815576040519150601f19603f3d011682016040523d82523d5f602084013e61481a565b606091505b5091509150611bf086838360608261483a5761483582614881565b611278565b815115801561485157506001600160a01b0384163b155b1561487a57604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611278565b8051156148915780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148b690614df8565b5f825580601f106148c5575050565b601f0160209004905f5260205f2090810190611c049190614925565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614939575f8155600101614926565b5090565b8015158114611c04575f80fd5b803563ffffffff8116811461495d575f80fd5b919050565b5f805f60608486031215614974575f80fd5b8335925060208401356149868161493d565b91506149946040850161494a565b90509250925092565b5f602082840312156149ad575f80fd5b5035919050565b6001600160a01b0381168114611c04575f80fd5b5f808284036101608112156149db575f80fd5b610140808212156149ea575f80fd5b84935083013590506149fb816149b4565b809150509250929050565b5f60208284031215614a16575f80fd5b6112788261494a565b5f8060408385031215614a30575f80fd5b614a398361494a565b946020939093013593505050565b6001600160401b0381168114611c04575f80fd5b5f60208284031215614a6b575f80fd5b813561127881614a47565b5f8060408385031215614a87575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aa9575f80fd5b84356001600160401b03811115614abe575f80fd5b850160608188031215614acf575f80fd5b93506040601f1982011215614ae2575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5760408401826001600160a01b03169052565b506060830151614b7260608401826001600160401b03169052565b506080830151614b8d60808401826001600160401b03169052565b5060a0830151614ba860a08401826001600160401b03169052565b5060c0830151614bc360c08401826001600160401b03169052565b5060e0830151614bde60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bde57614bde614be5565b6001600160401b03818116838216028082169190828114614c3c57614c3c614be5565b505092915050565b8082028115828204841417610a7457610a74614be5565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cc0575f80fd5b5051919050565b5f5b83811015614ce1578181015183820152602001614cc9565b50505f910152565b602081525f8251806020840152614d07816040850160208701614cc7565b601f01601f19169190910160400192915050565b5f82614d3557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bde57614bde614be5565b80820180821115610a7457610a74614be5565b600181811c90821680614e0c57607f821691505b602082108103614e2a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e8981614df8565b806020870152604060018084165f8114614eaa5760018114614ec657614ef3565b60ff19851660408a0152604084151560051b8a01019550614ef3565b895f5260205f205f5b85811015614eea5781548b8201860152908301908801614ecf565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f1c57614f1c614be5565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f5c57614f5c614f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f8a57614f8a614f26565b604052919050565b805161495d8161493d565b5f8060408385031215614fae575f80fd5b82516001600160401b0380821115614fc4575f80fd5b9084019060608287031215614fd7575f80fd5b614fdf614f3a565b82518152602080840151614ff2816149b4565b82820152604084015183811115615007575f80fd5b80850194505087601f85011261501b575f80fd5b83518381111561502d5761502d614f26565b61503f601f8201601f19168301614f62565b93508084528882828701011115615054575f80fd5b61506381838601848801614cc7565b50826040830152819550615078818801614f92565b9450505050509250929050565b81810381811115610a7457610a74614be5565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c04575f80fd5b5f6020828403121561519e575f80fd5b81356112788161517f565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ff8161517f565b61ffff8116905081548161ffff198216178355602084013561522081614a47565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561525a575f80fd5b813560ff81168114611278575f80fd5b5f6020828403121561527a575f80fd5b8135611278816149b4565b5f808335601e1984360301811261529a575f80fd5b8301803591506001600160401b038211156152b3575f80fd5b6020019150368190038213156152c7575f80fd5b9250929050565b601f821115610bd957805f5260205f20601f840160051c810160208510156152f35750805b601f840160051c820191505b81811015610ff3575f81556001016152ff565b81516001600160401b0381111561532b5761532b614f26565b61533f816153398454614df8565b846152ce565b602080601f831160018114615372575f841561535b5750858301515b5f19600386901b1c1916600185901b1785556153c9565b5f85815260208120601f198616915b828110156153a057888601518255948401946001909101908401615381565b50858210156153bd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153e1575f80fd5b81516112788161493d565b5f82516153fd818460208701614cc7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460a00151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index dc5a43a78..da75dc6ac 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516151f53803806151f583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150a88061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145c6565b61045a565b005b34801561016c575f80fd5b5061015f61017b366004614601565b610984565b34801561018b575f80fd5b506101ca61019a366004614601565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614618565b610b54565b34801561022d575f80fd5b5061024161023c366004614601565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461462f565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614648565b610cae565b3480156102ca575f80fd5b506101ca6102d9366004614684565b610e7e565b3480156102e9575f80fd5b506102416102f8366004614601565b610e97565b348015610308575f80fd5b5061015f6103173660046145c6565b610eab565b6101ca61032a36600461469f565b6110ca565b34801561033a575f80fd5b5061015f610349366004614648565b6110f6565b348015610359575f80fd5b5061015f61036836600461462f565b611346565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd366004614601565b611503565b3480156103dd575f80fd5b5061015f6103ec366004614601565b611789565b6101ca6103ff366004614601565b611898565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b50610437610432366004614601565b6118a4565b6040516101d4919061470c565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614ffc833981519152949193919290829060ff1660048111156104c2576104c26146f8565b60048111156104d3576104d36146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f836118a4565b905042600283516004811115610567576105676146f8565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f8051602061501c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f8051602061501c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611983565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146f8565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e8689611a05565b6001600160401b03169050605060ff168460c001518461076e91906147fa565b610778919061481a565b6001600160401b031661078c826064614845565b10156107aa5760405162461bcd60e51b81526004016105b09061485c565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906148b1565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146f8565b0361088b5761088b8460600151611ca1565b5f84606001518460a001516108a091906147fa565b90506108ac8682611cae565b5f6005600160991b0163ee5b48eb6108c5898686611cf6565b6040518263ffffffff1660e01b81526004016108e191906148ea565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092191906148b1565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff1660058111156109d2576109d26146f8565b60058111156109e3576109e36146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146f8565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cf6565b6040518263ffffffff1660e01b8152600401610b0e91906148ea565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e91906148b1565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611f15565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a510008361491c565b92915050565b5f80516020614ffc8339815191525f610c5f83611f26565b604081810180516001600160a01b039081165f908152600a8701602052825190911681529182209190915560608201519051919250610ca9916001600160401b039091169061229d565b505050565b5f80516020614ffc8339815191525f610cc6846122b0565b90505f80610cd78360400151612491565b50915091505f610ce6836118a4565b9050816001600160401b031681608001516001600160401b03161015610d1e5760405162461bcd60e51b81526004016105b09061493b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d635760405162461bcd60e51b81526004016105b09061497d565b60015f87815260068701602052604090205460ff166004811115610d8957610d896146f8565b14610df25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a51000614845565b5f610ea1826118a4565b60a0015192915050565b5f80516020614ffc8339815191525f610ec3856126cc565b5f86815260058401602052604090205460c0820151919250610ef591620100009091046001600160401b0316906149c6565b6001600160401b03168160e001516001600160401b03161015610f765760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110c3575f610f878685611a05565b9050605060ff168260c001518360e00151610fa291906147fa565b610fac919061481a565b6001600160401b0316610fc082606461481a565b6001600160401b03161015610fe75760405162461bcd60e51b81526004016105b09061485c565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561106b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108f91906148b1565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110bc9084906149e6565b9091555050505b5050505050565b5f6110d3612a75565b6110de838334612aac565b9050610c4160015f8051602061505c83398151915255565b5f80516020614ffc8339815191525f61110e846122b0565b90505f8061111f8360400151612491565b50915091505f61112e836118a4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611168576111686146f8565b6004811115611179576111796146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112185760405162461bcd60e51b81526004016105b09061493b565b5f8781526006870160205260409020600301546001600160401b03808516911611156112565760405162461bcd60e51b81526004016105b09061497d565b60038151600481111561126b5761126b6146f8565b146112bf5760405162461bcd60e51b815260206004820152603160248201525f8051602061501c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff19166004179055600989018252822091909155606082015190820151611304916001600160401b03169061229d565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061503c8339815191525f61135e836122b0565b90505f8061136f8360400151612cda565b91509150806113d15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113eb906149f9565b905011801561141d575060015f83815260088601602052604090205460ff16600581111561141b5761141b6146f8565b145b6114395760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078501602052604081206114519161450e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614ffc83398151915293929190829060ff166004811115611564576115646146f8565b6004811115611575576115756146f8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115fc576115fc6146f8565b148061161a5750600381516004811115611618576116186146f8565b145b61166e5760405162461bcd60e51b815260206004820152603260248201525f8051602061501c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61167c82604001516118a4565b905080608001516001600160401b03165f036117005760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb61172d846040015184608001518560a00151611cf6565b6040518263ffffffff1660e01b815260040161174991906148ea565b6020604051808303815f875af1158015611765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c391906148b1565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061503c8339815191529291906117d1906149f9565b9050118015611803575060015f83815260088301602052604090205460ff166005811115611801576118016146f8565b145b61181f5760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118589190600401614a72565b6020604051808303815f875af1158015611874573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca991906148b1565b5f610c41823334612e7b565b6118ac614545565b5f8281525f8051602061507c8339815191526020526040908190208151610100810190925280545f8051602061503c833981519152929190829060ff1660058111156118fa576118fa6146f8565b600581111561190b5761190b6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061507c8339815191526020526040812060030180545f8051602061503c833981519152916001600160401b0390911690836119c683614afc565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a779190810190614bac565b9150915080611ada5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4191906148b1565b825114611ba55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c1b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c2a8460400151613276565b91509150818714611c975760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611cab815f61344e565b50565b5f9182525f8051602061507c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6f57611d2f816001614c94565b611d3a906008614845565b5081515f90839083908110611d5157611d51614ca7565b60200101906001600160f81b03191690815f1a905350600101611d1b565b505f5b6004811015611dd257611d86816003614c94565b611d91906008614845565b6001901c60f81b82611da48360026149e6565b81518110611db457611db4614ca7565b60200101906001600160f81b03191690815f1a905350600101611d72565b505f5b6020811015611e3457611de981601f614c94565b611df4906008614845565b86901c60f81b82611e068360066149e6565b81518110611e1657611e16614ca7565b60200101906001600160f81b03191690815f1a905350600101611dd5565b505f5b6008811015611e9f57611e4b816007614c94565b611e56906008614845565b6001600160401b038616901c60f81b82611e718360266149e6565b81518110611e8157611e81614ca7565b60200101906001600160f81b03191690815f1a905350600101611e37565b505f5b6008811015611f0a57611eb6816007614c94565b611ec1906008614845565b6001600160401b038516901c60f81b82611edc83602e6149e6565b81518110611eec57611eec614ca7565b60200101906001600160f81b03191690815f1a905350600101611ea2565b5090505b9392505050565b611f1d6136a8565b611cab816136f3565b611f2e614545565b5f8051602061503c8339815191525f611f46846122b0565b90505f80611f578360400151612cda565b915091508015611fbc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fee57611fee6146f8565b6005811115611fff57611fff6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612086576120866146f8565b14806120a457506001825160058111156120a2576120a26146f8565b145b6121035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612118576121186146f8565b0361212557506004612129565b5060055b6020808301515f90815260098801909152604081205581816005811115612152576121526146f8565b90816005811115612165576121656146f8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612199576121996146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612264576122646146f8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122996001600160a01b0382168361375f565b60408051606080820183525f8083526020830181905292820152905f8051602061503c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612325573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261234c9190810190614bac565b91509150806123b35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124165760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124895760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124b55760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612504576124cc816001614c94565b6124d7906008614845565b61ffff168682815181106124ed576124ed614ca7565b016020015160f81c901b91909117906001016124b8565b5061ffff8116156125275760405162461bcd60e51b81526004016105b090614d04565b5f805b60048110156125825761253e816003614c94565b612549906008614845565b63ffffffff168761255b8360026149e6565b8151811061256b5761256b614ca7565b016020015160f81c901b919091179060010161252a565b5063ffffffff81166003146125a95760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156125fe576125c081601f614c94565b6125cb906008614845565b886125d78360066149e6565b815181106125e7576125e7614ca7565b016020015160f81c901b91909117906001016125ac565b505f805b600881101561265d57612616816007614c94565b612621906008614845565b6001600160401b0316896126368360266149e6565b8151811061264657612646614ca7565b016020015160f81c901b9190911790600101612602565b505f805b60088110156126bc57612675816007614c94565b612680906008614845565b6001600160401b03168a61269583602e6149e6565b815181106126a5576126a5614ca7565b016020015160f81c901b9190911790600101612661565b5091989097509095509350505050565b6126d4614545565b5f8281525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff166005811115612722576127226146f8565b6005811115612733576127336146f8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127bb576127bb6146f8565b146128175760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128915760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b61289e8160a00151611ca1565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128e2576128e26146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129ae856129a881611983565b5f611cf6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129dd9085906004016148ea565b6020604051808303815f875af11580156129f9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1d91906148b1565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8051602061505c833981519152805460011901612aa657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ffc833981519152906001600160401b0316612af86040860160208701614684565b6001600160401b03161015612b675760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b796020860186614d9d565b61ffff1610158015612b9d5750612710612b966020860186614d9d565b61ffff1611155b612bb95760405162461bcd60e51b81526004016105b090614db8565b8054831015612c1c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c835760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8e82610c31565b90505f612c9b88836137f2565b5f81815260058601602052604090209091508790612cb98282614e03565b509098975050505050505050565b60015f8051602061505c83398151915255565b5f808251602714612cfd5760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612d4c57612d14816001614c94565b612d1f906008614845565b61ffff16858281518110612d3557612d35614ca7565b016020015160f81c901b9190911790600101612d00565b5061ffff811615612d6f5760405162461bcd60e51b81526004016105b090614d04565b5f805b6004811015612dca57612d86816003614c94565b612d91906008614845565b63ffffffff1686612da38360026149e6565b81518110612db357612db3614ca7565b016020015160f81c901b9190911790600101612d72565b5063ffffffff8116600214612df15760405162461bcd60e51b81526004016105b090614d47565b5f805b6020811015612e4657612e0881601f614c94565b612e13906008614845565b87612e1f8360066149e6565b81518110612e2f57612e2f614ca7565b016020015160f81c901b9190911790600101612df4565b505f86602681518110612e5b57612e5b614ca7565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e84612a75565b5f80516020614ffc8339815191525f612e9c84610c31565b90505f612ea8876118a4565b9050600281516005811115612ebf57612ebf6146f8565b14612f1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f2782613d2c565b5f828260a00151612f3891906149c6565b60048501546060840151919250612f5a916001600160401b039091169061481a565b6001600160401b0316816001600160401b03161115612fd95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fe38882611cae565b5f612fed89611983565b90505f898260405160200161301992919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130538d8688611cf6565b6040518263ffffffff1660e01b815260040161306f91906148ea565b6020604051808303815f875af115801561308b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130af91906148b1565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613137576131376146f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0e60015f8051602061505c83398151915255565b5f808251602e146132995760405162461bcd60e51b81526004016105b090614cbb565b5f805b60028110156132e8576132b0816001614c94565b6132bb906008614845565b61ffff168582815181106132d1576132d1614ca7565b016020015160f81c901b919091179060010161329c565b5061ffff81161561330b5760405162461bcd60e51b81526004016105b090614d04565b5f805b600481101561336657613322816003614c94565b61332d906008614845565b63ffffffff168661333f8360026149e6565b8151811061334f5761334f614ca7565b016020015160f81c901b919091179060010161330e565b5063ffffffff811660041461338d5760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156133e2576133a481601f614c94565b6133af906008614845565b876133bb8360066149e6565b815181106133cb576133cb614ca7565b016020015160f81c901b9190911790600101613390565b505f805b6008811015613441576133fa816007614c94565b613405906008614845565b6001600160401b03168861341a8360266149e6565b8151811061342a5761342a614ca7565b016020015160f81c901b91909117906001016133e6565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061503c833981519152914291901580613534575060028301548151613530916001600160401b0316906149e6565b8210155b1561355a576001600160401b038516606082015281815260408101516020820152613579565b848160600181815161356c91906149c6565b6001600160401b03169052505b606081015161358990606461481a565b602082015160028501546001600160401b0392909216916135b49190600160401b900460ff16614845565b10156136185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561364157846001600160401b03168160400181815161363991906149e6565b905250613660565b846001600160401b03168160400181815161365c9190614c94565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136f157604051631afcd79f60e31b815260040160405180910390fd5b565b6136fb6136a8565b61370481613d37565b611cab608082013560a083013561372160e0850160c08601614684565b613732610100860160e08701614d9d565b61ffff1661374861012087016101008801614e59565b61375a61014088016101208901614e79565b613d58565b804710156137825760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137cb576040519150601f19603f3d011682016040523d82523d5f602084013e6137d0565b606091505b5050905080610ca957604051630a12f52160e11b815260040160405180910390fd5b5f5f8051602061503c833981519152426138126040860160208701614684565b6001600160401b0316116138845760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138946040850160208601614684565b6001600160401b03166138aa6202a300426149e6565b1161391d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139755760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139e55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139f26040850185614e94565b9050603014613a595760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a6283613d2c565b5f80613afc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613aa79190614684565b6001600160401b03168152602001613ac260408a018a614e94565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f9c565b5f82815260078601602052604090209193509150613b1a8282614f21565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b479085906004016148ea565b6020604051808303815f875af1158015613b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8791906148b1565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c0957613c096146f8565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cfe91908e01908e01614684565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611cab81600161344e565b613d3f6136a8565b613d47614341565b613d4f614351565b611cab81614359565b613d606136a8565b5f80516020614ffc83398151915283613dcc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dee5760405162461bcd60e51b81526004016105b090614db8565b85871115613e565760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613ec35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140065760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407d5761403d816001614c94565b614048906008614845565b5081515f9083908390811061405f5761405f614ca7565b60200101906001600160f81b03191690815f1a905350600101614029565b505f5b60048110156140db57614094816003614c94565b61409f906008614845565b505f826140ad8360026149e6565b815181106140bd576140bd614ca7565b60200101906001600160f81b03191690815f1a905350600101614080565b505f5b602081101561413857845181602081106140fa576140fa614ca7565b1a60f81b8261410a8360066149e6565b8151811061411a5761411a614ca7565b60200101906001600160f81b03191690815f1a9053506001016140de565b505f5b6020811015614198578460200151816020811061415a5761415a614ca7565b1a60f81b8261416a8360266149e6565b8151811061417a5761417a614ca7565b60200101906001600160f81b03191690815f1a90535060010161413b565b505f5b600881101561420c576141af816007614c94565b6141ba906008614845565b60ff1685604001516001600160401b0316901c60f81b828260466141de91906149e6565b815181106141ee576141ee614ca7565b60200101906001600160f81b03191690815f1a90535060010161419b565b505f5b6030811015614277578460800151818151811061422e5761422e614ca7565b01602001516001600160f81b0319168261424983604e6149e6565b8151811061425957614259614ca7565b60200101906001600160f81b03191690815f1a90535060010161420f565b505f5b60088110156142e95761428e816007614c94565b614299906008614845565b60608601516001600160401b0390811691161c60f81b826142bb83607e6149e6565b815181106142cb576142cb614ca7565b60200101906001600160f81b03191690815f1a90535060010161427a565b506002816040516142fa9190614fe0565b602060405180830381855afa158015614315573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061433891906148b1565b94909350915050565b6143496136a8565b6136f1614506565b6136f16136a8565b6143616136a8565b80355f8051602061503c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143ad6080840160608501614e59565b60ff16111561441a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61442b6080840160608501614e59565b60ff16116144935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144a36080830160608401614e59565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144d46060830160408401614684565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cc76136a8565b50805461451a906149f9565b5f825580601f10614529575050565b601f0160209004905f5260205f2090810190611cab9190614589565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561459d575f815560010161458a565b5090565b8015158114611cab575f80fd5b803563ffffffff811681146145c1575f80fd5b919050565b5f805f606084860312156145d8575f80fd5b8335925060208401356145ea816145a1565b91506145f8604085016145ae565b90509250925092565b5f60208284031215614611575f80fd5b5035919050565b5f6101408284031215614629575f80fd5b50919050565b5f6020828403121561463f575f80fd5b611f0e826145ae565b5f8060408385031215614659575f80fd5b614662836145ae565b946020939093013593505050565b6001600160401b0381168114611cab575f80fd5b5f60208284031215614694575f80fd5b8135611f0e81614670565b5f8082840360608112156146b1575f80fd5b83356001600160401b038111156146c6575f80fd5b8401606081870312156146d7575f80fd5b92506040601f19820112156146ea575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061473057634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161475860408401826001600160a01b03169052565b50606083015161477360608401826001600160401b03169052565b50608083015161478e60808401826001600160401b03169052565b5060a08301516147a960a08401826001600160401b03169052565b5060c08301516147c460c08401826001600160401b03169052565b5060e08301516147df60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147df576147df6147e6565b6001600160401b0381811683821602808216919082811461483d5761483d6147e6565b505092915050565b8082028115828204841417610c4157610c416147e6565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148c1575f80fd5b5051919050565b5f5b838110156148e25781810151838201526020016148ca565b50505f910152565b602081525f82518060208401526149088160408501602087016148c8565b601f01601f19169190910160400192915050565b5f8261493657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147df576147df6147e6565b80820180821115610c4157610c416147e6565b600181811c90821680614a0d57607f821691505b60208210810361462957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a84816149f9565b806020870152604060018084165f8114614aa55760018114614ac157614aee565b60ff19851660408a0152604084151560051b8a01019550614aee565b895f5260205f205f5b85811015614ae55781548b8201860152908301908801614aca565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b1757614b176147e6565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5757614b57614b21565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8557614b85614b21565b604052919050565b6001600160a01b0381168114611cab575f80fd5b80516145c1816145a1565b5f8060408385031215614bbd575f80fd5b82516001600160401b0380821115614bd3575f80fd5b9084019060608287031215614be6575f80fd5b614bee614b35565b82518152602080840151614c0181614b8d565b82820152604084015183811115614c16575f80fd5b80850194505087601f850112614c2a575f80fd5b835183811115614c3c57614c3c614b21565b614c4e601f8201601f19168301614b5d565b93508084528882828701011115614c63575f80fd5b614c72818386018488016148c8565b50826040830152819550614c87818801614ba1565b9450505050509250929050565b81810381811115610c4157610c416147e6565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611cab575f80fd5b5f60208284031215614dad575f80fd5b8135611f0e81614d8e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e0e81614d8e565b61ffff8116905081548161ffff1982161783556020840135614e2f81614670565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e69575f80fd5b813560ff81168114611f0e575f80fd5b5f60208284031215614e89575f80fd5b8135611f0e81614b8d565b5f808335601e19843603018112614ea9575f80fd5b8301803591506001600160401b03821115614ec2575f80fd5b602001915036819003821315614ed6575f80fd5b9250929050565b601f821115610ca957805f5260205f20601f840160051c81016020851015614f025750805b601f840160051c820191505b818110156110c3575f8155600101614f0e565b81516001600160401b03811115614f3a57614f3a614b21565b614f4e81614f4884546149f9565b84614edd565b602080601f831160018114614f81575f8415614f6a5750858301515b5f19600386901b1c1916600185901b178555614fd8565b5f85815260208120601f198616915b82811015614faf57888601518255948401946001909101908401614f90565b5085821015614fcc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614ff18184602087016148c8565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460a00151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index f515ef537..bc89581b7 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -119,7 +119,7 @@ contract ERC20TokenStakingManager is return _getERC20StakingManagerStorage()._token.safeTransferFrom(value); } - function _unlock(uint256 value, address to) internal virtual override { + function _unlock(address to, uint256 value) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 9006be448..721c80a9a 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -79,7 +79,7 @@ contract NativeTokenStakingManager is return value; } - function _unlock(uint256 value, address to) internal virtual override { + function _unlock(address to, uint256 value) internal virtual override { payable(to).sendValue(value); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index be4a4cbcf..e85211cf1 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -151,15 +151,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager if (includeUptimeProof) { uint64 uptime = _getUptime(validationID, messageIndex); - require( + if ( uptime * 100 - >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, - "PoSValidatorManager: minimum uptime threshold not met" - ); - - $._redeemableValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( - validator.weight, validator.startedAt, validator.endedAt, 0, 0 - ); + >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + $._redeemableValidatorRewards[validator.owner] += $ + ._rewardCalculator + .calculateReward( + weightToValue(validator.weight), validator.startedAt, validator.endedAt, 0, 0 + ); + } } } @@ -171,7 +172,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); delete $._redeemableValidatorRewards[validator.owner]; - _unlock(validator.startingWeight, validator.owner); + _unlock(validator.owner, weightToValue(validator.startingWeight)); } function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { @@ -237,7 +238,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } function _lock(uint256 value) internal virtual returns (uint256); - function _unlock(uint256 value, address to) internal virtual; + function _unlock(address to, uint256 value) internal virtual; function _initializeDelegatorRegistration( bytes32 validationID, @@ -377,15 +378,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager if (includeUptimeProof) { uint256 uptime = _getUptime(validationID, messageIndex); - require( + if ( uptime * 100 - >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, - "PoSValidatorManager: minimum uptime threshold not met" - ); - - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( - delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 - ); + >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( + weightToValue(delegator.weight), delegator.startedAt, delegator.endedAt, 0, 0 + ); + } } // Check that removing this delegator would not exceed the maximum churn rate. @@ -481,7 +481,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _reward(delegator.owner, $._redeemableDelegatorRewards[delegationID]); delete $._redeemableDelegatorRewards[delegationID]; - _unlock(delegator.weight, delegator.owner); + _unlock(delegator.owner, weightToValue(delegator.weight)); // TODO can we remove the delegation from _delegatorStakes here? emit DelegationEnded(delegationID, validationID, nonce); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index bbf60c1db..9759d1ec4 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -23,18 +23,21 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP = DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); uint64 public constant DEFAULT_REWARD_RATE = uint64(10); uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; + uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + event GeoffEvent(uint256 num); + event DelegatorAdded( bytes32 indexed delegationID, bytes32 indexed validationID, @@ -488,8 +491,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -498,9 +500,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegation() public virtual { - uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + uint256 registrationExpiry = + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + registrationDuration; bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -537,15 +540,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator = DEFAULT_DELEGATOR_ADDRESS; uint256 balanceBefore = _getStakeAssetBalance(delegator); - uint256 expectedReward = DEFAULT_DELEGATOR_WEIGHT * DEFAULT_REWARD_RATE / 365; - _expectStakeUnlock(delegator, DEFAULT_DELEGATOR_WEIGHT); + uint256 expectedReward = _weightToValue(DEFAULT_DELEGATOR_WEIGHT) * DEFAULT_REWARD_RATE + * registrationDuration / 10000 / SECONDS_IN_YEAR; + _expectStakeUnlock(delegator, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); _expectRewardIssuance(delegator, expectedReward); _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; require( - balanceChange == DEFAULT_DELEGATOR_WEIGHT + expectedReward, + balanceChange == _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedReward, "delegator should have received their stake back and been rewarded" ); } @@ -695,9 +699,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndValidation() public virtual override { - uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + uint256 registrationExpiry = DEFAULT_REGISTRATION_TIMESTAMP + registrationDuration; bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, @@ -712,16 +716,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 balanceBefore = _getStakeAssetBalance(address(this)); - uint256 expectedReward = DEFAULT_WEIGHT * DEFAULT_REWARD_RATE / 365 - 1; + uint256 expectedReward = _weightToValue(DEFAULT_WEIGHT) * DEFAULT_REWARD_RATE + * registrationDuration / 10000 / SECONDS_IN_YEAR; - _expectStakeUnlock(address(this), DEFAULT_WEIGHT); + _expectStakeUnlock(address(this), _weightToValue(DEFAULT_WEIGHT)); _expectRewardIssuance(address(this), expectedReward); _testCompleteEndValidation(validationID); uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; require( - balanceChange == DEFAULT_WEIGHT + expectedReward, + balanceChange == _weightToValue(DEFAULT_WEIGHT) + expectedReward, "validator should have received their stake back and been rewarded" ); } From dabde59863de3a08f7d791326ebf738e7a7a6c8b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 14:17:03 -0400 Subject: [PATCH 11/36] Fixups --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index dd3700e72..ff08c9695 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460a00151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index da75dc6ac..154a488c2 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460a00151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e85211cf1..6690bd5c8 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -158,7 +158,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._redeemableValidatorRewards[validator.owner] += $ ._rewardCalculator .calculateReward( - weightToValue(validator.weight), validator.startedAt, validator.endedAt, 0, 0 + weightToValue(validator.startingWeight), + validator.startedAt, + validator.endedAt, + 0, + 0 ); } } From d480b4c7db69bfe91bbafb518872bb0b5d7bcfba Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 14:48:48 -0400 Subject: [PATCH 12/36] Fixups --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index ff08c9695..62f3f3cdf 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155b63803806155b683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154698061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614950565b61036a565b005b61015f61016f36600461498b565b610892565b6101b261018236600461498b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461498b565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b6565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f4565b610b57565b61015f61025a366004614a0d565b610bdb565b6101b261026d366004614a49565b610dab565b6101f261028036600461498b565b610dc4565b61015f610293366004614950565b610dd8565b61015f6102a6366004614a0d565b610ff6565b6101b26102b9366004614a64565b61125a565b6101b26102cc366004614a84565b61126d565b61015f6102df3660046149f4565b611299565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461498b565b611456565b61015f61033336600461498b565b6116dc565b6101cd601481565b61035361034e36600461498b565b6117eb565b6040516101bc9190614af9565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153bd833981519152949193919290829060ff1660048111156103d2576103d2614ae5565b60048111156103e3576103e3614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117eb565b90504260028351600481111561047757610477614ae5565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153dd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153dd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118ca565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e868961194c565b6001600160401b03169050605060ff168460c001518461067e9190614be7565b6106889190614c07565b6001600160401b031661069c826064614c32565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c49565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614ae5565b03610799576107998460600151611be8565b5f84606001518460a001516107ae9190614be7565b90506107ba8682611bf5565b5f6005600160991b0163ee5b48eb6107d3898686611c3d565b6040518263ffffffff1660e01b81526004016107ef9190614c82565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c49565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156108e0576108e0614ae5565b60058111156108f1576108f1614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614ae5565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c3d565b6040518263ffffffff1660e01b8152600401610a1c9190614c82565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c49565b50505050565b5f610a7264e8d4a5100083614cb4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e5a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153bd8339815191525f610b6f83611e78565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121eb565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612261565b505050565b5f805160206153bd8339815191525f610bf384612284565b90505f80610c048360400151612465565b50915091505f610c13836117eb565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cd3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d15565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614ae5565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c32565b5f610dce826117eb565b60a0015192915050565b5f805160206153bd8339815191525f610df0856126a0565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d5e565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb4868561194c565b9050605060ff168260c001518360e00151610ecf9190614be7565b610ed99190614c07565b6001600160401b0316610eed826064614c07565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c49565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d7e565b90915550505b505b5050505050565b5f805160206153bd8339815191525f61100e84612284565b90505f8061101f8360400151612465565b50915091505f61102e836117eb565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614ae5565b600481111561107957611079614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cd3565b826001600160401b03168160e001516001600160401b0316111561114e5760405162461bcd60e51b81526004016104c090614d15565b60038151600481111561116357611163614ae5565b146111b75760405162461bcd60e51b815260206004820152603160248201525f805160206153dd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111ed91906121eb565b856009015f8881526020019081526020015f205f90556112188160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611266833384612a49565b9392505050565b5f611276612e47565b611281848484612e7e565b905061126660015f8051602061541d83398151915255565b5f805160206153fd8339815191525f6112b183612284565b90505f806112c283604001516130b7565b91509150806113245760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133e90614d91565b9050118015611370575060015f83815260088601602052604090205460ff16600581111561136e5761136e614ae5565b145b61138c5760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078501602052604081206113a491614898565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153bd83398151915293929190829060ff1660048111156114b7576114b7614ae5565b60048111156114c8576114c8614ae5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154f5761154f614ae5565b148061156d575060038151600481111561156b5761156b614ae5565b145b6115c15760405162461bcd60e51b815260206004820152603260248201525f805160206153dd833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cf82604001516117eb565b905080608001516001600160401b03165f036116535760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611680846040015184608001518560a00151611c3d565b6040518263ffffffff1660e01b815260040161169c9190614c82565b6020604051808303815f875af11580156116b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c49565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206153fd83398151915292919061172490614d91565b9050118015611756575060015f83815260088301602052604090205460ff16600581111561175457611754614ae5565b145b6117725760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117ab9190600401614e10565b6020604051808303815f875af11580156117c7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c49565b6117f36148cf565b5f8281525f8051602061543d8339815191526020526040908190208151610100810190925280545f805160206153fd833981519152929190829060ff16600581111561184157611841614ae5565b600581111561185257611852614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061543d8339815191526020526040812060030180545f805160206153fd833981519152916001600160401b03909116908361190d83614e9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611997573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119be9190810190614f36565b9150915080611a215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a889190614c49565b825114611aec5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b625760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b718460400151613258565b91509150818714611bde5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bf2815f613430565b50565b5f9182525f8051602061543d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb657611c7681600161501e565b611c81906008614c32565b5081515f90839083908110611c9857611c98615031565b60200101906001600160f81b03191690815f1a905350600101611c62565b505f5b6004811015611d1957611ccd81600361501e565b611cd8906008614c32565b6001901c60f81b82611ceb836002614d7e565b81518110611cfb57611cfb615031565b60200101906001600160f81b03191690815f1a905350600101611cb9565b505f5b6020811015611d7b57611d3081601f61501e565b611d3b906008614c32565b86901c60f81b82611d4d836006614d7e565b81518110611d5d57611d5d615031565b60200101906001600160f81b03191690815f1a905350600101611d1c565b505f5b6008811015611de657611d9281600761501e565b611d9d906008614c32565b6001600160401b038616901c60f81b82611db8836026614d7e565b81518110611dc857611dc8615031565b60200101906001600160f81b03191690815f1a905350600101611d7e565b505f5b6008811015611e5157611dfd81600761501e565b611e08906008614c32565b6001600160401b038516901c60f81b82611e2383602e614d7e565b81518110611e3357611e33615031565b60200101906001600160f81b03191690815f1a905350600101611de9565b50949350505050565b611e6261368a565b611e6b826136d5565b611e7481613741565b5050565b611e806148cf565b5f805160206153fd8339815191525f611e9884612284565b90505f80611ea983604001516130b7565b915091508015611f0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4057611f40614ae5565b6005811115611f5157611f51614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd857611fd8614ae5565b1480611ff65750600182516005811115611ff457611ff4614ae5565b145b6120555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206a5761206a614ae5565b036120775750600461207b565b5060055b6020808301515f908152600988019091526040812055818160058111156120a4576120a4614ae5565b908160058111156120b7576120b7614ae5565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120eb576120eb614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b6576121b6614ae5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061539d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612246575f80fd5b505af1158015612258573d5f803e3d5ffd5b50505050505050565b5f8051602061539d83398151915254611e74906001600160a01b031683836137e2565b60408051606080820183525f8083526020830181905292820152905f805160206153fd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123209190810190614f36565b91509150806123875760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123ea5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124895760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156124d8576124a081600161501e565b6124ab906008614c32565b61ffff168682815181106124c1576124c1615031565b016020015160f81c901b919091179060010161248c565b5061ffff8116156124fb5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156125565761251281600361501e565b61251d906008614c32565b63ffffffff168761252f836002614d7e565b8151811061253f5761253f615031565b016020015160f81c901b91909117906001016124fe565b5063ffffffff811660031461257d5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156125d25761259481601f61501e565b61259f906008614c32565b886125ab836006614d7e565b815181106125bb576125bb615031565b016020015160f81c901b9190911790600101612580565b505f805b6008811015612631576125ea81600761501e565b6125f5906008614c32565b6001600160401b03168961260a836026614d7e565b8151811061261a5761261a615031565b016020015160f81c901b91909117906001016125d6565b505f805b60088110156126905761264981600761501e565b612654906008614c32565b6001600160401b03168a61266983602e614d7e565b8151811061267957612679615031565b016020015160f81c901b9190911790600101612635565b5091989097509095509350505050565b6126a86148cf565b5f8281525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156126f6576126f6614ae5565b600581111561270757612707614ae5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278f5761278f614ae5565b146127eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128655760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128728160a00151611be8565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b6576128b6614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129828561297c816118ca565b5f611c3d565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b1908590600401614c82565b6020604051808303815f875af11580156129cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f19190614c49565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a52612e47565b5f805160206153bd8339815191525f612a6d6101ed85613841565b90505f612a79876117eb565b9050600281516005811115612a9057612a90614ae5565b14612aef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af882613864565b5f828260a00151612b099190614d5e565b60048501546060840151919250612b2b916001600160401b0390911690614c07565b6001600160401b0316816001600160401b03161115612baa5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb48882611bf5565b5f612bbe896118ca565b90505f8982604051602001612bea92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c248d8688611c3d565b6040518263ffffffff1660e01b8152600401612c409190614c82565b6020604051808303815f875af1158015612c5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c809190614c49565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0857612d08614ae5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126660015f8051602061541d83398151915255565b5f8051602061541d833981519152805460011901612e7857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153bd833981519152906001600160401b0316612eca6040860160208701614a49565b6001600160401b03161015612f395760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f4b6020860186615127565b61ffff1610158015612f6f5750612710612f686020860186615127565b61ffff1611155b612f8b5760405162461bcd60e51b81526004016104c090615142565b8054831015612fee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305f84613841565b90505f61306b82610a62565b90505f613078888361386f565b5f81815260058601602052604090209091508790613096828261518d565b509098975050505050505050565b60015f8051602061541d83398151915255565b5f8082516027146130da5760405162461bcd60e51b81526004016104c090615045565b5f805b6002811015613129576130f181600161501e565b6130fc906008614c32565b61ffff1685828151811061311257613112615031565b016020015160f81c901b91909117906001016130dd565b5061ffff81161561314c5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156131a75761316381600361501e565b61316e906008614c32565b63ffffffff1686613180836002614d7e565b8151811061319057613190615031565b016020015160f81c901b919091179060010161314f565b5063ffffffff81166002146131ce5760405162461bcd60e51b81526004016104c0906150d1565b5f805b6020811015613223576131e581601f61501e565b6131f0906008614c32565b876131fc836006614d7e565b8151811061320c5761320c615031565b016020015160f81c901b91909117906001016131d1565b505f8660268151811061323857613238615031565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461327b5760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156132ca5761329281600161501e565b61329d906008614c32565b61ffff168582815181106132b3576132b3615031565b016020015160f81c901b919091179060010161327e565b5061ffff8116156132ed5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156133485761330481600361501e565b61330f906008614c32565b63ffffffff1686613321836002614d7e565b8151811061333157613331615031565b016020015160f81c901b91909117906001016132f0565b5063ffffffff811660041461336f5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156133c45761338681601f61501e565b613391906008614c32565b8761339d836006614d7e565b815181106133ad576133ad615031565b016020015160f81c901b9190911790600101613372565b505f805b6008811015613423576133dc81600761501e565b6133e7906008614c32565b6001600160401b0316886133fc836026614d7e565b8151811061340c5761340c615031565b016020015160f81c901b91909117906001016133c8565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206153fd833981519152914291901580613516575060028301548151613512916001600160401b031690614d7e565b8210155b1561353c576001600160401b03851660608201528181526040810151602082015261355b565b848160600181815161354e9190614d5e565b6001600160401b03169052505b606081015161356b906064614c07565b602082015160028501546001600160401b0392909216916135969190600160401b900460ff16614c32565b10156135fa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362357846001600160401b03168160400181815161361b9190614d7e565b905250613642565b846001600160401b03168160400181815161363e919061501e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d357604051631afcd79f60e31b815260040160405180910390fd5b565b6136dd61368a565b6136e681613da9565b611bf2608082013560a083013561370360e0850160c08601614a49565b613714610100860160e08701615127565b61ffff1661372a610120870161010088016151e3565b61373c61014088016101208901615203565b613dca565b61374961368a565b5f8051602061539d8339815191526001600160a01b0382166137c25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400e565b5f610a72825f8051602061539d833981519152546001600160a01b03169061406f565b611bf2816001613430565b5f5f805160206153fd8339815191524261388f6040860160208701614a49565b6001600160401b0316116139015760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139116040850160208601614a49565b6001600160401b03166139276202a30042614d7e565b1161399a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139f25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a625760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6f604085018561521e565b9050603014613ad65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adf83613864565b5f80613b796040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b249190614a49565b6001600160401b03168152602001613b3f60408a018a61521e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d1565b5f82815260078601602052604090209193509150613b9782826152ab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc4908590600401614c82565b6020604051808303815f875af1158015613be0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c049190614c49565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8657613c86614ae5565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7b91908e01908e01614a49565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db161368a565b613db9614576565b613dc1614586565b611bf28161458e565b613dd261368a565b5f805160206153bd83398151915283613e3e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e605760405162461bcd60e51b81526004016104c090615142565b85871115613ec85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f355760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140226001600160a01b0384168361473b565b905080515f141580156140465750808060200190518101906140449190615366565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d99190614c49565b90506140f06001600160a01b038516333086614748565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614134573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141589190614c49565b90508181116141be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c8828261501e565b95945050505050565b5f606082608001515160301461423b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b25761427281600161501e565b61427d906008614c32565b5081515f9083908390811061429457614294615031565b60200101906001600160f81b03191690815f1a90535060010161425e565b505f5b6004811015614310576142c981600361501e565b6142d4906008614c32565b505f826142e2836002614d7e565b815181106142f2576142f2615031565b60200101906001600160f81b03191690815f1a9053506001016142b5565b505f5b602081101561436d578451816020811061432f5761432f615031565b1a60f81b8261433f836006614d7e565b8151811061434f5761434f615031565b60200101906001600160f81b03191690815f1a905350600101614313565b505f5b60208110156143cd578460200151816020811061438f5761438f615031565b1a60f81b8261439f836026614d7e565b815181106143af576143af615031565b60200101906001600160f81b03191690815f1a905350600101614370565b505f5b6008811015614441576143e481600761501e565b6143ef906008614c32565b60ff1685604001516001600160401b0316901c60f81b828260466144139190614d7e565b8151811061442357614423615031565b60200101906001600160f81b03191690815f1a9053506001016143d0565b505f5b60308110156144ac578460800151818151811061446357614463615031565b01602001516001600160f81b0319168261447e83604e614d7e565b8151811061448e5761448e615031565b60200101906001600160f81b03191690815f1a905350600101614444565b505f5b600881101561451e576144c381600761501e565b6144ce906008614c32565b60608601516001600160401b0390811691161c60f81b826144f083607e614d7e565b8151811061450057614500615031565b60200101906001600160f81b03191690815f1a9053506001016144af565b5060028160405161452f9190615381565b602060405180830381855afa15801561454a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456d9190614c49565b94909350915050565b61457e61368a565b6136d3614781565b6136d361368a565b61459661368a565b80355f805160206153fd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145e260808401606085016151e3565b60ff16111561464f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466060808401606085016151e3565b60ff16116146c85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d860808301606084016151e3565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147096060830160408401614a49565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126683835f614789565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd9060840161380f565b6130a461368a565b6060814710156147ae5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c99190615381565b5f6040518083038185875af1925050503d805f8114614803576040519150601f19603f3d011682016040523d82523d5f602084013e614808565b606091505b5091509150611bde868383606082614828576148238261486f565b611266565b815115801561483f57506001600160a01b0384163b155b1561486857604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611266565b80511561487f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a490614d91565b5f825580601f106148b3575050565b601f0160209004905f5260205f2090810190611bf29190614913565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614927575f8155600101614914565b5090565b8015158114611bf2575f80fd5b803563ffffffff8116811461494b575f80fd5b919050565b5f805f60608486031215614962575f80fd5b8335925060208401356149748161492b565b915061498260408501614938565b90509250925092565b5f6020828403121561499b575f80fd5b5035919050565b6001600160a01b0381168114611bf2575f80fd5b5f808284036101608112156149c9575f80fd5b610140808212156149d8575f80fd5b84935083013590506149e9816149a2565b809150509250929050565b5f60208284031215614a04575f80fd5b61126682614938565b5f8060408385031215614a1e575f80fd5b614a2783614938565b946020939093013593505050565b6001600160401b0381168114611bf2575f80fd5b5f60208284031215614a59575f80fd5b813561126681614a35565b5f8060408385031215614a75575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a97575f80fd5b84356001600160401b03811115614aac575f80fd5b850160608188031215614abd575f80fd5b93506040601f1982011215614ad0575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1d57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4560408401826001600160a01b03169052565b506060830151614b6060608401826001600160401b03169052565b506080830151614b7b60808401826001600160401b03169052565b5060a0830151614b9660a08401826001600160401b03169052565b5060c0830151614bb160c08401826001600160401b03169052565b5060e0830151614bcc60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bcc57614bcc614bd3565b6001600160401b03818116838216028082169190828114614c2a57614c2a614bd3565b505092915050565b8082028115828204841417610a7257610a72614bd3565b5f60208284031215614c59575f80fd5b5051919050565b5f5b83811015614c7a578181015183820152602001614c62565b50505f910152565b602081525f8251806020840152614ca0816040850160208701614c60565b601f01601f19169190910160400192915050565b5f82614cce57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bcc57614bcc614bd3565b80820180821115610a7257610a72614bd3565b600181811c90821680614da557607f821691505b602082108103614dc357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2281614d91565b806020870152604060018084165f8114614e435760018114614e5f57614e8c565b60ff19851660408a0152604084151560051b8a01019550614e8c565b895f5260205f205f5b85811015614e835781548b8201860152908301908801614e68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614eb557614eb5614bd3565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ef557614ef5614ebf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2357614f23614ebf565b604052919050565b805161494b8161492b565b5f8060408385031215614f47575f80fd5b82516001600160401b0380821115614f5d575f80fd5b9084019060608287031215614f70575f80fd5b614f78614ed3565b82518152602080840151614f8b816149a2565b82820152604084015183811115614fa0575f80fd5b80850194505087601f850112614fb4575f80fd5b835183811115614fc657614fc6614ebf565b614fd8601f8201601f19168301614efb565b93508084528882828701011115614fed575f80fd5b614ffc81838601848801614c60565b50826040830152819550615011818801614f2b565b9450505050509250929050565b81810381811115610a7257610a72614bd3565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bf2575f80fd5b5f60208284031215615137575f80fd5b813561126681615118565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561519881615118565b61ffff8116905081548161ffff19821617835560208401356151b981614a35565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151f3575f80fd5b813560ff81168114611266575f80fd5b5f60208284031215615213575f80fd5b8135611266816149a2565b5f808335601e19843603018112615233575f80fd5b8301803591506001600160401b0382111561524c575f80fd5b602001915036819003821315615260575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c8101602085101561528c5750805b601f840160051c820191505b81811015610fef575f8155600101615298565b81516001600160401b038111156152c4576152c4614ebf565b6152d8816152d28454614d91565b84615267565b602080601f83116001811461530b575f84156152f45750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b828110156153395788860151825594840194600190910190840161531a565b508582101561535657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615376575f80fd5b81516112668161492b565b5f8251615392818460208701614c60565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 154a488c2..253fe8781 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161518738038061518783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61503a8061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b1565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ec565b610982565b34801561018b575f80fd5b506101ca61019a3660046145ec565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614603565b610b52565b34801561022d575f80fd5b5061024161023c3660046145ec565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461461a565b610c45565b3480156102ab575f80fd5b5061015f6102ba366004614633565b610ca8565b3480156102ca575f80fd5b506101ca6102d936600461466f565b610e78565b3480156102e9575f80fd5b506102416102f83660046145ec565b610e91565b348015610308575f80fd5b5061015f6103173660046145b1565b610ea5565b6101ca61032a36600461468a565b6110c3565b34801561033a575f80fd5b5061015f610349366004614633565b6110ef565b348015610359575f80fd5b5061015f61036836600461461a565b611331565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ec565b6114ee565b3480156103dd575f80fd5b5061015f6103ec3660046145ec565b611774565b6101ca6103ff3660046145ec565b611883565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ec565b61188f565b6040516101d491906146f7565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f8e833981519152949193919290829060ff1660048111156104c2576104c26146e3565b60048111156104d3576104d36146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188f565b905042600283516004811115610567576105676146e3565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fae8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fae8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196e565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f0565b6001600160401b03169050605060ff168460c001518461076e91906147e5565b6107789190614805565b6001600160401b031661078c826064614830565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f9190614847565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146e3565b03610889576108898460600151611c8c565b5f84606001518460a0015161089e91906147e5565b90506108aa8682611c99565b5f6005600160991b0163ee5b48eb6108c3898686611ce1565b6040518263ffffffff1660e01b81526004016108df9190614880565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f9190614847565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff1660058111156109d0576109d06146e3565b60058111156109e1576109e16146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146e3565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce1565b6040518263ffffffff1660e01b8152600401610b0c9190614880565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c9190614847565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f00565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148b2565b92915050565b5f80516020614f8e8339815191525f610c5d83611f11565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612288565b505050565b5f80516020614f8e8339815191525f610cc08461229b565b90505f80610cd1836040015161247c565b50915091505f610ce08361188f565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d1565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b090614913565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146e3565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614830565b5f610e9b8261188f565b60a0015192915050565b5f80516020614f8e8339815191525f610ebd856126b7565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b03169061495c565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f0565b9050605060ff168260c001518360e00151610f9c91906147e5565b610fa69190614805565b6001600160401b0316610fba826064614805565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110879190614847565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b490849061497c565b90915550505b505b5050505050565b5f6110cc612a60565b6110d7838334612a97565b9050610c3f60015f80516020614fee83398151915255565b5f80516020614f8e8339815191525f6111078461229b565b90505f80611118836040015161247c565b50915091505f6111278361188f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146e3565b6004811115611172576111726146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d1565b826001600160401b03168160e001516001600160401b031611156112475760405162461bcd60e51b81526004016105b090614913565b60038151600481111561125c5761125c6146e3565b146112b05760405162461bcd60e51b815260206004820152603160248201525f80516020614fae8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112ef9190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fce8339815191525f6113498361229b565b90505f8061135a8360400151612cc5565b91509150806113bc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d69061498f565b9050118015611408575060015f83815260088601602052604090205460ff166005811115611406576114066146e3565b145b6114245760405162461bcd60e51b81526004016105b0906149c1565b5f828152600785016020526040812061143c916144f9565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f8e83398151915293929190829060ff16600481111561154f5761154f6146e3565b6004811115611560576115606146e3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e7576115e76146e3565b14806116055750600381516004811115611603576116036146e3565b145b6116595760405162461bcd60e51b815260206004820152603260248201525f80516020614fae833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611667826040015161188f565b905080608001516001600160401b03165f036116eb5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611718846040015184608001518560a00151611ce1565b6040518263ffffffff1660e01b81526004016117349190614880565b6020604051808303815f875af1158015611750573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc9190614847565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fce8339815191529291906117bc9061498f565b90501180156117ee575060015f83815260088301602052604090205460ff1660058111156117ec576117ec6146e3565b145b61180a5760405162461bcd60e51b81526004016105b0906149c1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118439190600401614a08565b6020604051808303815f875af115801561185f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca39190614847565b5f610c3f823334612e66565b611897614530565b5f8281525f8051602061500e8339815191526020526040908190208151610100810190925280545f80516020614fce833981519152929190829060ff1660058111156118e5576118e56146e3565b60058111156118f6576118f66146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061500e8339815191526020526040812060030180545f80516020614fce833981519152916001600160401b0390911690836119b183614a92565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a3b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a629190810190614b42565b9150915080611ac55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2c9190614847565b825114611b905760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c065760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c158460400151613261565b91509150818714611c825760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c96815f613439565b50565b5f9182525f8051602061500e833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5a57611d1a816001614c2a565b611d25906008614830565b5081515f90839083908110611d3c57611d3c614c3d565b60200101906001600160f81b03191690815f1a905350600101611d06565b505f5b6004811015611dbd57611d71816003614c2a565b611d7c906008614830565b6001901c60f81b82611d8f83600261497c565b81518110611d9f57611d9f614c3d565b60200101906001600160f81b03191690815f1a905350600101611d5d565b505f5b6020811015611e1f57611dd481601f614c2a565b611ddf906008614830565b86901c60f81b82611df183600661497c565b81518110611e0157611e01614c3d565b60200101906001600160f81b03191690815f1a905350600101611dc0565b505f5b6008811015611e8a57611e36816007614c2a565b611e41906008614830565b6001600160401b038616901c60f81b82611e5c83602661497c565b81518110611e6c57611e6c614c3d565b60200101906001600160f81b03191690815f1a905350600101611e22565b505f5b6008811015611ef557611ea1816007614c2a565b611eac906008614830565b6001600160401b038516901c60f81b82611ec783602e61497c565b81518110611ed757611ed7614c3d565b60200101906001600160f81b03191690815f1a905350600101611e8d565b5090505b9392505050565b611f08613693565b611c96816136de565b611f19614530565b5f80516020614fce8339815191525f611f318461229b565b90505f80611f428360400151612cc5565b915091508015611fa75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd957611fd96146e3565b6005811115611fea57611fea6146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612071576120716146e3565b148061208f575060018251600581111561208d5761208d6146e3565b145b6120ee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612103576121036146e3565b0361211057506004612114565b5060055b6020808301515f9081526009880190915260408120558181600581111561213d5761213d6146e3565b90816005811115612150576121506146e3565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612184576121846146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224f5761224f6146e3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122846001600160a01b0383168261374a565b60408051606080820183525f8083526020830181905292820152905f80516020614fce8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612310573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123379190810190614b42565b915091508061239e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124015760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a05760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156124ef576124b7816001614c2a565b6124c2906008614830565b61ffff168682815181106124d8576124d8614c3d565b016020015160f81c901b91909117906001016124a3565b5061ffff8116156125125760405162461bcd60e51b81526004016105b090614c9a565b5f805b600481101561256d57612529816003614c2a565b612534906008614830565b63ffffffff168761254683600261497c565b8151811061255657612556614c3d565b016020015160f81c901b9190911790600101612515565b5063ffffffff81166003146125945760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156125e9576125ab81601f614c2a565b6125b6906008614830565b886125c283600661497c565b815181106125d2576125d2614c3d565b016020015160f81c901b9190911790600101612597565b505f805b600881101561264857612601816007614c2a565b61260c906008614830565b6001600160401b03168961262183602661497c565b8151811061263157612631614c3d565b016020015160f81c901b91909117906001016125ed565b505f805b60088110156126a757612660816007614c2a565b61266b906008614830565b6001600160401b03168a61268083602e61497c565b8151811061269057612690614c3d565b016020015160f81c901b919091179060010161264c565b5091989097509095509350505050565b6126bf614530565b5f8281525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff16600581111561270d5761270d6146e3565b600581111561271e5761271e6146e3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a6576127a66146e3565b146128025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128898160a00151611c8c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cd576128cd6146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612999856129938161196e565b5f611ce1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c8908590600401614880565b6020604051808303815f875af11580156129e4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a089190614847565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614fee833981519152805460011901612a9157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f8e833981519152906001600160401b0316612ae3604086016020870161466f565b6001600160401b03161015612b525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b646020860186614d33565b61ffff1610158015612b885750612710612b816020860186614d33565b61ffff1611155b612ba45760405162461bcd60e51b81526004016105b090614d4e565b8054831015612c075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7982610c2f565b90505f612c8688836137dd565b5f81815260058601602052604090209091508790612ca48282614d99565b509098975050505050505050565b60015f80516020614fee83398151915255565b5f808251602714612ce85760405162461bcd60e51b81526004016105b090614c51565b5f805b6002811015612d3757612cff816001614c2a565b612d0a906008614830565b61ffff16858281518110612d2057612d20614c3d565b016020015160f81c901b9190911790600101612ceb565b5061ffff811615612d5a5760405162461bcd60e51b81526004016105b090614c9a565b5f805b6004811015612db557612d71816003614c2a565b612d7c906008614830565b63ffffffff1686612d8e83600261497c565b81518110612d9e57612d9e614c3d565b016020015160f81c901b9190911790600101612d5d565b5063ffffffff8116600214612ddc5760405162461bcd60e51b81526004016105b090614cdd565b5f805b6020811015612e3157612df381601f614c2a565b612dfe906008614830565b87612e0a83600661497c565b81518110612e1a57612e1a614c3d565b016020015160f81c901b9190911790600101612ddf565b505f86602681518110612e4657612e46614c3d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6f612a60565b5f80516020614f8e8339815191525f612e8784610c2f565b90505f612e938761188f565b9050600281516005811115612eaa57612eaa6146e3565b14612f095760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1282613d17565b5f828260a00151612f23919061495c565b60048501546060840151919250612f45916001600160401b0390911690614805565b6001600160401b0316816001600160401b03161115612fc45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fce8882611c99565b5f612fd88961196e565b90505f898260405160200161300492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303e8d8688611ce1565b6040518263ffffffff1660e01b815260040161305a9190614880565b6020604051808303815f875af1158015613076573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309a9190614847565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613122576131226146e3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef960015f80516020614fee83398151915255565b5f808251602e146132845760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156132d35761329b816001614c2a565b6132a6906008614830565b61ffff168582815181106132bc576132bc614c3d565b016020015160f81c901b9190911790600101613287565b5061ffff8116156132f65760405162461bcd60e51b81526004016105b090614c9a565b5f805b60048110156133515761330d816003614c2a565b613318906008614830565b63ffffffff168661332a83600261497c565b8151811061333a5761333a614c3d565b016020015160f81c901b91909117906001016132f9565b5063ffffffff81166004146133785760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156133cd5761338f81601f614c2a565b61339a906008614830565b876133a683600661497c565b815181106133b6576133b6614c3d565b016020015160f81c901b919091179060010161337b565b505f805b600881101561342c576133e5816007614c2a565b6133f0906008614830565b6001600160401b03168861340583602661497c565b8151811061341557613415614c3d565b016020015160f81c901b91909117906001016133d1565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fce83398151915291429190158061351f57506002830154815161351b916001600160401b03169061497c565b8210155b15613545576001600160401b038516606082015281815260408101516020820152613564565b8481606001818151613557919061495c565b6001600160401b03169052505b6060810151613574906064614805565b602082015160028501546001600160401b03929092169161359f9190600160401b900460ff16614830565b10156136035760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362c57846001600160401b031681604001818151613624919061497c565b90525061364b565b846001600160401b0316816040018181516136479190614c2a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136dc57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e6613693565b6136ef81613d22565b611c96608082013560a083013561370c60e0850160c0860161466f565b61371d610100860160e08701614d33565b61ffff1661373361012087016101008801614def565b61374561014088016101208901614e0f565b613d43565b8047101561376d5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b6576040519150601f19603f3d011682016040523d82523d5f602084013e6137bb565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fce833981519152426137fd604086016020870161466f565b6001600160401b03161161386f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387f604085016020860161466f565b6001600160401b03166138956202a3004261497c565b116139085760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139605760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139dd6040850185614e2a565b9050603014613a445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4d83613d17565b5f80613ae76040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a92919061466f565b6001600160401b03168152602001613aad60408a018a614e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f87565b5f82815260078601602052604090209193509150613b058282614eb7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b32908590600401614880565b6020604051808303815f875af1158015613b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b729190614847565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf457613bf46146e3565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce991908e01908e0161466f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c96816001613439565b613d2a613693565b613d3261432c565b613d3a61433c565b611c9681614344565b613d4b613693565b5f80516020614f8e83398151915283613db75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd95760405162461bcd60e51b81526004016105b090614d4e565b85871115613e415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eae5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f205760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406857614028816001614c2a565b614033906008614830565b5081515f9083908390811061404a5761404a614c3d565b60200101906001600160f81b03191690815f1a905350600101614014565b505f5b60048110156140c65761407f816003614c2a565b61408a906008614830565b505f8261409883600261497c565b815181106140a8576140a8614c3d565b60200101906001600160f81b03191690815f1a90535060010161406b565b505f5b602081101561412357845181602081106140e5576140e5614c3d565b1a60f81b826140f583600661497c565b8151811061410557614105614c3d565b60200101906001600160f81b03191690815f1a9053506001016140c9565b505f5b6020811015614183578460200151816020811061414557614145614c3d565b1a60f81b8261415583602661497c565b8151811061416557614165614c3d565b60200101906001600160f81b03191690815f1a905350600101614126565b505f5b60088110156141f75761419a816007614c2a565b6141a5906008614830565b60ff1685604001516001600160401b0316901c60f81b828260466141c9919061497c565b815181106141d9576141d9614c3d565b60200101906001600160f81b03191690815f1a905350600101614186565b505f5b6030811015614262578460800151818151811061421957614219614c3d565b01602001516001600160f81b0319168261423483604e61497c565b8151811061424457614244614c3d565b60200101906001600160f81b03191690815f1a9053506001016141fa565b505f5b60088110156142d457614279816007614c2a565b614284906008614830565b60608601516001600160401b0390811691161c60f81b826142a683607e61497c565b815181106142b6576142b6614c3d565b60200101906001600160f81b03191690815f1a905350600101614265565b506002816040516142e59190614f72565b602060405180830381855afa158015614300573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143239190614847565b94909350915050565b614334613693565b6136dc6144f1565b6136dc613693565b61434c613693565b80355f80516020614fce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143986080840160608501614def565b60ff1611156144055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144166080840160608501614def565b60ff161161447e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448e6080830160608401614def565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bf606083016040840161466f565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb2613693565b5080546145059061498f565b5f825580601f10614514575050565b601f0160209004905f5260205f2090810190611c969190614574565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614588575f8155600101614575565b5090565b8015158114611c96575f80fd5b803563ffffffff811681146145ac575f80fd5b919050565b5f805f606084860312156145c3575f80fd5b8335925060208401356145d58161458c565b91506145e360408501614599565b90509250925092565b5f602082840312156145fc575f80fd5b5035919050565b5f6101408284031215614614575f80fd5b50919050565b5f6020828403121561462a575f80fd5b611ef982614599565b5f8060408385031215614644575f80fd5b61464d83614599565b946020939093013593505050565b6001600160401b0381168114611c96575f80fd5b5f6020828403121561467f575f80fd5b8135611ef98161465b565b5f80828403606081121561469c575f80fd5b83356001600160401b038111156146b1575f80fd5b8401606081870312156146c2575f80fd5b92506040601f19820112156146d5575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471b57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474360408401826001600160a01b03169052565b50606083015161475e60608401826001600160401b03169052565b50608083015161477960808401826001600160401b03169052565b5060a083015161479460a08401826001600160401b03169052565b5060c08301516147af60c08401826001600160401b03169052565b5060e08301516147ca60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147ca576147ca6147d1565b6001600160401b03818116838216028082169190828114614828576148286147d1565b505092915050565b8082028115828204841417610c3f57610c3f6147d1565b5f60208284031215614857575f80fd5b5051919050565b5f5b83811015614878578181015183820152602001614860565b50505f910152565b602081525f825180602084015261489e81604085016020870161485e565b601f01601f19169190910160400192915050565b5f826148cc57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147ca576147ca6147d1565b80820180821115610c3f57610c3f6147d1565b600181811c908216806149a357607f821691505b60208210810361461457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a1a8161498f565b806020870152604060018084165f8114614a3b5760018114614a5757614a84565b60ff19851660408a0152604084151560051b8a01019550614a84565b895f5260205f205f5b85811015614a7b5781548b8201860152908301908801614a60565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614aad57614aad6147d1565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614aed57614aed614ab7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b1b57614b1b614ab7565b604052919050565b6001600160a01b0381168114611c96575f80fd5b80516145ac8161458c565b5f8060408385031215614b53575f80fd5b82516001600160401b0380821115614b69575f80fd5b9084019060608287031215614b7c575f80fd5b614b84614acb565b82518152602080840151614b9781614b23565b82820152604084015183811115614bac575f80fd5b80850194505087601f850112614bc0575f80fd5b835183811115614bd257614bd2614ab7565b614be4601f8201601f19168301614af3565b93508084528882828701011115614bf9575f80fd5b614c088183860184880161485e565b50826040830152819550614c1d818801614b37565b9450505050509250929050565b81810381811115610c3f57610c3f6147d1565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c96575f80fd5b5f60208284031215614d43575f80fd5b8135611ef981614d24565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614da481614d24565b61ffff8116905081548161ffff1982161783556020840135614dc58161465b565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614dff575f80fd5b813560ff81168114611ef9575f80fd5b5f60208284031215614e1f575f80fd5b8135611ef981614b23565b5f808335601e19843603018112614e3f575f80fd5b8301803591506001600160401b03821115614e58575f80fd5b602001915036819003821315614e6c575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614e985750805b601f840160051c820191505b818110156110bc575f8155600101614ea4565b81516001600160401b03811115614ed057614ed0614ab7565b614ee481614ede845461498f565b84614e73565b602080601f831160018114614f17575f8415614f005750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4557888601518255948401946001909101908401614f26565b5085821015614f6257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8381846020870161485e565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 6690bd5c8..4480812a9 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -468,7 +468,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // to be used to complete delisting for an earlier delegation. This is necessary because the P-Chain // is only willing to sign the latest weight update. require( - $._delegatorStakes[delegationID].endingNonce <= nonce, + delegator.endingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); From 2ecf2bff7d54a8be04405988f20a98fb88ac00e3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 15:13:02 -0400 Subject: [PATCH 13/36] lint --- contracts/staking/PoSValidatorManager.sol | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 4480812a9..9dca36b01 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -467,10 +467,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // a weight update using a higher nonce (which implicitly includes the delegation's weight update) // to be used to complete delisting for an earlier delegation. This is necessary because the P-Chain // is only willing to sign the latest weight update. - require( - delegator.endingNonce <= nonce, - "PoSValidatorManager: nonce does not match" - ); + require(delegator.endingNonce <= nonce, "PoSValidatorManager: nonce does not match"); // Ensure the delegator is pending removed. Since anybody can call this function once // end delegation has been initialized, we need to make sure that this function is only From e29827c5c3c9bdb9f5147c58bc178f88a4ea1f4d Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 11 Sep 2024 18:37:03 +0000 Subject: [PATCH 14/36] Native staking rewards --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 35 ++++++++++++- .../staking/NativeTokenStakingManager.sol | 7 ++- contracts/staking/PoSValidatorManager.sol | 7 ++- .../tests/ERC20TokenStakingManagerTests.t.sol | 1 - .../NativeTokenStakingManagerTests.t.sol | 33 +++++++----- .../tests/PoSValidatorManagerTests.t.sol | 51 ++++++++++++++++--- 7 files changed, 109 insertions(+), 27 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 62f3f3cdf..6bf7209e4 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155b63803806155b683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154698061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614950565b61036a565b005b61015f61016f36600461498b565b610892565b6101b261018236600461498b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461498b565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b6565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f4565b610b57565b61015f61025a366004614a0d565b610bdb565b6101b261026d366004614a49565b610dab565b6101f261028036600461498b565b610dc4565b61015f610293366004614950565b610dd8565b61015f6102a6366004614a0d565b610ff6565b6101b26102b9366004614a64565b61125a565b6101b26102cc366004614a84565b61126d565b61015f6102df3660046149f4565b611299565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461498b565b611456565b61015f61033336600461498b565b6116dc565b6101cd601481565b61035361034e36600461498b565b6117eb565b6040516101bc9190614af9565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153bd833981519152949193919290829060ff1660048111156103d2576103d2614ae5565b60048111156103e3576103e3614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117eb565b90504260028351600481111561047757610477614ae5565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153dd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153dd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118ca565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e868961194c565b6001600160401b03169050605060ff168460c001518461067e9190614be7565b6106889190614c07565b6001600160401b031661069c826064614c32565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c49565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614ae5565b03610799576107998460600151611be8565b5f84606001518460a001516107ae9190614be7565b90506107ba8682611bf5565b5f6005600160991b0163ee5b48eb6107d3898686611c3d565b6040518263ffffffff1660e01b81526004016107ef9190614c82565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c49565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156108e0576108e0614ae5565b60058111156108f1576108f1614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614ae5565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c3d565b6040518263ffffffff1660e01b8152600401610a1c9190614c82565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c49565b50505050565b5f610a7264e8d4a5100083614cb4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e5a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153bd8339815191525f610b6f83611e78565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121eb565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612261565b505050565b5f805160206153bd8339815191525f610bf384612284565b90505f80610c048360400151612465565b50915091505f610c13836117eb565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cd3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d15565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614ae5565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c32565b5f610dce826117eb565b60a0015192915050565b5f805160206153bd8339815191525f610df0856126a0565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d5e565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb4868561194c565b9050605060ff168260c001518360e00151610ecf9190614be7565b610ed99190614c07565b6001600160401b0316610eed826064614c07565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c49565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d7e565b90915550505b505b5050505050565b5f805160206153bd8339815191525f61100e84612284565b90505f8061101f8360400151612465565b50915091505f61102e836117eb565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614ae5565b600481111561107957611079614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cd3565b826001600160401b03168160e001516001600160401b0316111561114e5760405162461bcd60e51b81526004016104c090614d15565b60038151600481111561116357611163614ae5565b146111b75760405162461bcd60e51b815260206004820152603160248201525f805160206153dd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111ed91906121eb565b856009015f8881526020019081526020015f205f90556112188160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611266833384612a49565b9392505050565b5f611276612e47565b611281848484612e7e565b905061126660015f8051602061541d83398151915255565b5f805160206153fd8339815191525f6112b183612284565b90505f806112c283604001516130b7565b91509150806113245760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133e90614d91565b9050118015611370575060015f83815260088601602052604090205460ff16600581111561136e5761136e614ae5565b145b61138c5760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078501602052604081206113a491614898565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153bd83398151915293929190829060ff1660048111156114b7576114b7614ae5565b60048111156114c8576114c8614ae5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154f5761154f614ae5565b148061156d575060038151600481111561156b5761156b614ae5565b145b6115c15760405162461bcd60e51b815260206004820152603260248201525f805160206153dd833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cf82604001516117eb565b905080608001516001600160401b03165f036116535760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611680846040015184608001518560a00151611c3d565b6040518263ffffffff1660e01b815260040161169c9190614c82565b6020604051808303815f875af11580156116b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c49565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206153fd83398151915292919061172490614d91565b9050118015611756575060015f83815260088301602052604090205460ff16600581111561175457611754614ae5565b145b6117725760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117ab9190600401614e10565b6020604051808303815f875af11580156117c7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c49565b6117f36148cf565b5f8281525f8051602061543d8339815191526020526040908190208151610100810190925280545f805160206153fd833981519152929190829060ff16600581111561184157611841614ae5565b600581111561185257611852614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061543d8339815191526020526040812060030180545f805160206153fd833981519152916001600160401b03909116908361190d83614e9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611997573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119be9190810190614f36565b9150915080611a215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a889190614c49565b825114611aec5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b625760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b718460400151613258565b91509150818714611bde5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bf2815f613430565b50565b5f9182525f8051602061543d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb657611c7681600161501e565b611c81906008614c32565b5081515f90839083908110611c9857611c98615031565b60200101906001600160f81b03191690815f1a905350600101611c62565b505f5b6004811015611d1957611ccd81600361501e565b611cd8906008614c32565b6001901c60f81b82611ceb836002614d7e565b81518110611cfb57611cfb615031565b60200101906001600160f81b03191690815f1a905350600101611cb9565b505f5b6020811015611d7b57611d3081601f61501e565b611d3b906008614c32565b86901c60f81b82611d4d836006614d7e565b81518110611d5d57611d5d615031565b60200101906001600160f81b03191690815f1a905350600101611d1c565b505f5b6008811015611de657611d9281600761501e565b611d9d906008614c32565b6001600160401b038616901c60f81b82611db8836026614d7e565b81518110611dc857611dc8615031565b60200101906001600160f81b03191690815f1a905350600101611d7e565b505f5b6008811015611e5157611dfd81600761501e565b611e08906008614c32565b6001600160401b038516901c60f81b82611e2383602e614d7e565b81518110611e3357611e33615031565b60200101906001600160f81b03191690815f1a905350600101611de9565b50949350505050565b611e6261368a565b611e6b826136d5565b611e7481613741565b5050565b611e806148cf565b5f805160206153fd8339815191525f611e9884612284565b90505f80611ea983604001516130b7565b915091508015611f0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4057611f40614ae5565b6005811115611f5157611f51614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd857611fd8614ae5565b1480611ff65750600182516005811115611ff457611ff4614ae5565b145b6120555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206a5761206a614ae5565b036120775750600461207b565b5060055b6020808301515f908152600988019091526040812055818160058111156120a4576120a4614ae5565b908160058111156120b7576120b7614ae5565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120eb576120eb614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b6576121b6614ae5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061539d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612246575f80fd5b505af1158015612258573d5f803e3d5ffd5b50505050505050565b5f8051602061539d83398151915254611e74906001600160a01b031683836137e2565b60408051606080820183525f8083526020830181905292820152905f805160206153fd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123209190810190614f36565b91509150806123875760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123ea5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124895760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156124d8576124a081600161501e565b6124ab906008614c32565b61ffff168682815181106124c1576124c1615031565b016020015160f81c901b919091179060010161248c565b5061ffff8116156124fb5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156125565761251281600361501e565b61251d906008614c32565b63ffffffff168761252f836002614d7e565b8151811061253f5761253f615031565b016020015160f81c901b91909117906001016124fe565b5063ffffffff811660031461257d5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156125d25761259481601f61501e565b61259f906008614c32565b886125ab836006614d7e565b815181106125bb576125bb615031565b016020015160f81c901b9190911790600101612580565b505f805b6008811015612631576125ea81600761501e565b6125f5906008614c32565b6001600160401b03168961260a836026614d7e565b8151811061261a5761261a615031565b016020015160f81c901b91909117906001016125d6565b505f805b60088110156126905761264981600761501e565b612654906008614c32565b6001600160401b03168a61266983602e614d7e565b8151811061267957612679615031565b016020015160f81c901b9190911790600101612635565b5091989097509095509350505050565b6126a86148cf565b5f8281525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156126f6576126f6614ae5565b600581111561270757612707614ae5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278f5761278f614ae5565b146127eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128655760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128728160a00151611be8565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b6576128b6614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129828561297c816118ca565b5f611c3d565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b1908590600401614c82565b6020604051808303815f875af11580156129cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f19190614c49565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a52612e47565b5f805160206153bd8339815191525f612a6d6101ed85613841565b90505f612a79876117eb565b9050600281516005811115612a9057612a90614ae5565b14612aef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af882613864565b5f828260a00151612b099190614d5e565b60048501546060840151919250612b2b916001600160401b0390911690614c07565b6001600160401b0316816001600160401b03161115612baa5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb48882611bf5565b5f612bbe896118ca565b90505f8982604051602001612bea92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c248d8688611c3d565b6040518263ffffffff1660e01b8152600401612c409190614c82565b6020604051808303815f875af1158015612c5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c809190614c49565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0857612d08614ae5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126660015f8051602061541d83398151915255565b5f8051602061541d833981519152805460011901612e7857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153bd833981519152906001600160401b0316612eca6040860160208701614a49565b6001600160401b03161015612f395760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f4b6020860186615127565b61ffff1610158015612f6f5750612710612f686020860186615127565b61ffff1611155b612f8b5760405162461bcd60e51b81526004016104c090615142565b8054831015612fee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305f84613841565b90505f61306b82610a62565b90505f613078888361386f565b5f81815260058601602052604090209091508790613096828261518d565b509098975050505050505050565b60015f8051602061541d83398151915255565b5f8082516027146130da5760405162461bcd60e51b81526004016104c090615045565b5f805b6002811015613129576130f181600161501e565b6130fc906008614c32565b61ffff1685828151811061311257613112615031565b016020015160f81c901b91909117906001016130dd565b5061ffff81161561314c5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156131a75761316381600361501e565b61316e906008614c32565b63ffffffff1686613180836002614d7e565b8151811061319057613190615031565b016020015160f81c901b919091179060010161314f565b5063ffffffff81166002146131ce5760405162461bcd60e51b81526004016104c0906150d1565b5f805b6020811015613223576131e581601f61501e565b6131f0906008614c32565b876131fc836006614d7e565b8151811061320c5761320c615031565b016020015160f81c901b91909117906001016131d1565b505f8660268151811061323857613238615031565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461327b5760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156132ca5761329281600161501e565b61329d906008614c32565b61ffff168582815181106132b3576132b3615031565b016020015160f81c901b919091179060010161327e565b5061ffff8116156132ed5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156133485761330481600361501e565b61330f906008614c32565b63ffffffff1686613321836002614d7e565b8151811061333157613331615031565b016020015160f81c901b91909117906001016132f0565b5063ffffffff811660041461336f5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156133c45761338681601f61501e565b613391906008614c32565b8761339d836006614d7e565b815181106133ad576133ad615031565b016020015160f81c901b9190911790600101613372565b505f805b6008811015613423576133dc81600761501e565b6133e7906008614c32565b6001600160401b0316886133fc836026614d7e565b8151811061340c5761340c615031565b016020015160f81c901b91909117906001016133c8565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206153fd833981519152914291901580613516575060028301548151613512916001600160401b031690614d7e565b8210155b1561353c576001600160401b03851660608201528181526040810151602082015261355b565b848160600181815161354e9190614d5e565b6001600160401b03169052505b606081015161356b906064614c07565b602082015160028501546001600160401b0392909216916135969190600160401b900460ff16614c32565b10156135fa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362357846001600160401b03168160400181815161361b9190614d7e565b905250613642565b846001600160401b03168160400181815161363e919061501e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d357604051631afcd79f60e31b815260040160405180910390fd5b565b6136dd61368a565b6136e681613da9565b611bf2608082013560a083013561370360e0850160c08601614a49565b613714610100860160e08701615127565b61ffff1661372a610120870161010088016151e3565b61373c61014088016101208901615203565b613dca565b61374961368a565b5f8051602061539d8339815191526001600160a01b0382166137c25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400e565b5f610a72825f8051602061539d833981519152546001600160a01b03169061406f565b611bf2816001613430565b5f5f805160206153fd8339815191524261388f6040860160208701614a49565b6001600160401b0316116139015760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139116040850160208601614a49565b6001600160401b03166139276202a30042614d7e565b1161399a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139f25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a625760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6f604085018561521e565b9050603014613ad65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adf83613864565b5f80613b796040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b249190614a49565b6001600160401b03168152602001613b3f60408a018a61521e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d1565b5f82815260078601602052604090209193509150613b9782826152ab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc4908590600401614c82565b6020604051808303815f875af1158015613be0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c049190614c49565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8657613c86614ae5565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7b91908e01908e01614a49565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db161368a565b613db9614576565b613dc1614586565b611bf28161458e565b613dd261368a565b5f805160206153bd83398151915283613e3e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e605760405162461bcd60e51b81526004016104c090615142565b85871115613ec85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f355760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140226001600160a01b0384168361473b565b905080515f141580156140465750808060200190518101906140449190615366565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d99190614c49565b90506140f06001600160a01b038516333086614748565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614134573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141589190614c49565b90508181116141be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c8828261501e565b95945050505050565b5f606082608001515160301461423b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b25761427281600161501e565b61427d906008614c32565b5081515f9083908390811061429457614294615031565b60200101906001600160f81b03191690815f1a90535060010161425e565b505f5b6004811015614310576142c981600361501e565b6142d4906008614c32565b505f826142e2836002614d7e565b815181106142f2576142f2615031565b60200101906001600160f81b03191690815f1a9053506001016142b5565b505f5b602081101561436d578451816020811061432f5761432f615031565b1a60f81b8261433f836006614d7e565b8151811061434f5761434f615031565b60200101906001600160f81b03191690815f1a905350600101614313565b505f5b60208110156143cd578460200151816020811061438f5761438f615031565b1a60f81b8261439f836026614d7e565b815181106143af576143af615031565b60200101906001600160f81b03191690815f1a905350600101614370565b505f5b6008811015614441576143e481600761501e565b6143ef906008614c32565b60ff1685604001516001600160401b0316901c60f81b828260466144139190614d7e565b8151811061442357614423615031565b60200101906001600160f81b03191690815f1a9053506001016143d0565b505f5b60308110156144ac578460800151818151811061446357614463615031565b01602001516001600160f81b0319168261447e83604e614d7e565b8151811061448e5761448e615031565b60200101906001600160f81b03191690815f1a905350600101614444565b505f5b600881101561451e576144c381600761501e565b6144ce906008614c32565b60608601516001600160401b0390811691161c60f81b826144f083607e614d7e565b8151811061450057614500615031565b60200101906001600160f81b03191690815f1a9053506001016144af565b5060028160405161452f9190615381565b602060405180830381855afa15801561454a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456d9190614c49565b94909350915050565b61457e61368a565b6136d3614781565b6136d361368a565b61459661368a565b80355f805160206153fd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145e260808401606085016151e3565b60ff16111561464f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466060808401606085016151e3565b60ff16116146c85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d860808301606084016151e3565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147096060830160408401614a49565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126683835f614789565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd9060840161380f565b6130a461368a565b6060814710156147ae5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c99190615381565b5f6040518083038185875af1925050503d805f8114614803576040519150601f19603f3d011682016040523d82523d5f602084013e614808565b606091505b5091509150611bde868383606082614828576148238261486f565b611266565b815115801561483f57506001600160a01b0384163b155b1561486857604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611266565b80511561487f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a490614d91565b5f825580601f106148b3575050565b601f0160209004905f5260205f2090810190611bf29190614913565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614927575f8155600101614914565b5090565b8015158114611bf2575f80fd5b803563ffffffff8116811461494b575f80fd5b919050565b5f805f60608486031215614962575f80fd5b8335925060208401356149748161492b565b915061498260408501614938565b90509250925092565b5f6020828403121561499b575f80fd5b5035919050565b6001600160a01b0381168114611bf2575f80fd5b5f808284036101608112156149c9575f80fd5b610140808212156149d8575f80fd5b84935083013590506149e9816149a2565b809150509250929050565b5f60208284031215614a04575f80fd5b61126682614938565b5f8060408385031215614a1e575f80fd5b614a2783614938565b946020939093013593505050565b6001600160401b0381168114611bf2575f80fd5b5f60208284031215614a59575f80fd5b813561126681614a35565b5f8060408385031215614a75575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a97575f80fd5b84356001600160401b03811115614aac575f80fd5b850160608188031215614abd575f80fd5b93506040601f1982011215614ad0575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1d57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4560408401826001600160a01b03169052565b506060830151614b6060608401826001600160401b03169052565b506080830151614b7b60808401826001600160401b03169052565b5060a0830151614b9660a08401826001600160401b03169052565b5060c0830151614bb160c08401826001600160401b03169052565b5060e0830151614bcc60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bcc57614bcc614bd3565b6001600160401b03818116838216028082169190828114614c2a57614c2a614bd3565b505092915050565b8082028115828204841417610a7257610a72614bd3565b5f60208284031215614c59575f80fd5b5051919050565b5f5b83811015614c7a578181015183820152602001614c62565b50505f910152565b602081525f8251806020840152614ca0816040850160208701614c60565b601f01601f19169190910160400192915050565b5f82614cce57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bcc57614bcc614bd3565b80820180821115610a7257610a72614bd3565b600181811c90821680614da557607f821691505b602082108103614dc357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2281614d91565b806020870152604060018084165f8114614e435760018114614e5f57614e8c565b60ff19851660408a0152604084151560051b8a01019550614e8c565b895f5260205f205f5b85811015614e835781548b8201860152908301908801614e68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614eb557614eb5614bd3565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ef557614ef5614ebf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2357614f23614ebf565b604052919050565b805161494b8161492b565b5f8060408385031215614f47575f80fd5b82516001600160401b0380821115614f5d575f80fd5b9084019060608287031215614f70575f80fd5b614f78614ed3565b82518152602080840151614f8b816149a2565b82820152604084015183811115614fa0575f80fd5b80850194505087601f850112614fb4575f80fd5b835183811115614fc657614fc6614ebf565b614fd8601f8201601f19168301614efb565b93508084528882828701011115614fed575f80fd5b614ffc81838601848801614c60565b50826040830152819550615011818801614f2b565b9450505050509250929050565b81810381811115610a7257610a72614bd3565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bf2575f80fd5b5f60208284031215615137575f80fd5b813561126681615118565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561519881615118565b61ffff8116905081548161ffff19821617835560208401356151b981614a35565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151f3575f80fd5b813560ff81168114611266575f80fd5b5f60208284031215615213575f80fd5b8135611266816149a2565b5f808335601e19843603018112615233575f80fd5b8301803591506001600160401b0382111561524c575f80fd5b602001915036819003821315615260575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c8101602085101561528c5750805b601f840160051c820191505b81811015610fef575f8155600101615298565b81516001600160401b038111156152c4576152c4614ebf565b6152d8816152d28454614d91565b84615267565b602080601f83116001811461530b575f84156152f45750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b828110156153395788860151825594840194600190910190840161531a565b508582101561535657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615376575f80fd5b81516112668161492b565b5f8251615392818460208701614c60565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155ce3803806155ce83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154818061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614968565b61036a565b005b61015f61016f3660046149a3565b610892565b6101b26101823660046149a3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed3660046149a3565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149ce565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a0c565b610b57565b61015f61025a366004614a25565b610bf3565b6101b261026d366004614a61565b610dc3565b6101f26102803660046149a3565b610ddc565b61015f610293366004614968565b610df0565b61015f6102a6366004614a25565b61100e565b6101b26102b9366004614a7c565b611272565b6101b26102cc366004614a9c565b611285565b61015f6102df366004614a0c565b6112b1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f6103203660046149a3565b61146e565b61015f6103333660046149a3565b6116f4565b6101cd601481565b61035361034e3660046149a3565b611803565b6040516101bc9190614b11565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153d5833981519152949193919290829060ff1660048111156103d2576103d2614afd565b60048111156103e3576103e3614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f83611803565b90504260028351600481111561047757610477614afd565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153f58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153f58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118e2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614afd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611964565b6001600160401b03169050605060ff168460c001518461067e9190614bff565b6106889190614c1f565b6001600160401b031661069c826064614c4a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dc3565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c61565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614afd565b03610799576107998460600151611c00565b5f84606001518460a001516107ae9190614bff565b90506107ba8682611c0d565b5f6005600160991b0163ee5b48eb6107d3898686611c55565b6040518263ffffffff1660e01b81526004016107ef9190614c9a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c61565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff1660058111156108e0576108e0614afd565b60058111156108f1576108f1614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614afd565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c55565b6040518263ffffffff1660e01b8152600401610a1c9190614c9a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c61565b50505050565b5f610a7264e8d4a5100083614ccc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e72565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153d58339815191525f610b6f83611e90565b9050600481516005811115610b8657610b86614afd565b03610bd4576040808201516001600160a01b0381165f908152600a85016020529190912054610bb59190612203565b6040808201516001600160a01b03165f908152600a8401602052908120555b610bee8160400151610be98360600151610dc3565b612279565b505050565b5f805160206153d58339815191525f610c0b8461229c565b90505f80610c1c836040015161247d565b50915091505f610c2b83611803565b9050816001600160401b031681608001516001600160401b03161015610c635760405162461bcd60e51b81526004016104c090614ceb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ca85760405162461bcd60e51b81526004016104c090614d2d565b60015f87815260068701602052604090205460ff166004811115610cce57610cce614afd565b14610d375760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c4a565b5f610de682611803565b60a0015192915050565b5f805160206153d58339815191525f610e08856126b8565b5f86815260058401602052604090205460c0820151919250610e3a91620100009091046001600160401b031690614d76565b6001600160401b03168160e001516001600160401b03161015610ebb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611007575f610ecc8685611964565b9050605060ff168260c001518360e00151610ee79190614bff565b610ef19190614c1f565b6001600160401b0316610f05826064614c1f565b6001600160401b031610611005578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f468460600151610dc3565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190614c61565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fff908490614d96565b90915550505b505b5050505050565b5f805160206153d58339815191525f6110268461229c565b90505f80611037836040015161247d565b50915091505f61104683611803565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561108057611080614afd565b600481111561109157611091614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111305760405162461bcd60e51b81526004016104c090614ceb565b826001600160401b03168160e001516001600160401b031611156111665760405162461bcd60e51b81526004016104c090614d2d565b60038151600481111561117b5761117b614afd565b146111cf5760405162461bcd60e51b815260206004820152603160248201525f805160206153f58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546112059190612203565b856009015f8881526020019081526020015f205f90556112308160200151610be98360600151610dc3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61127e833384612a61565b9392505050565b5f61128e612e5f565b611299848484612e96565b905061127e60015f8051602061543583398151915255565b5f805160206154158339815191525f6112c98361229c565b90505f806112da83604001516130cf565b915091508061133c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135690614da9565b9050118015611388575060015f83815260088601602052604090205460ff16600581111561138657611386614afd565b145b6113a45760405162461bcd60e51b81526004016104c090614de1565b5f82815260078501602052604081206113bc916148b0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153d583398151915293929190829060ff1660048111156114cf576114cf614afd565b60048111156114e0576114e0614afd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156757611567614afd565b1480611585575060038151600481111561158357611583614afd565b145b6115d95760405162461bcd60e51b815260206004820152603260248201525f805160206153f5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e78260400151611803565b905080608001516001600160401b03165f0361166b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611698846040015184608001518560a00151611c55565b6040518263ffffffff1660e01b81526004016116b49190614c9a565b6020604051808303815f875af11580156116d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110079190614c61565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061541583398151915292919061173c90614da9565b905011801561176e575060015f83815260088301602052604090205460ff16600581111561176c5761176c614afd565b145b61178a5760405162461bcd60e51b81526004016104c090614de1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117c39190600401614e28565b6020604051808303815f875af11580156117df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bee9190614c61565b61180b6148e7565b5f8281525f805160206154558339815191526020526040908190208151610100810190925280545f80516020615415833981519152929190829060ff16600581111561185957611859614afd565b600581111561186a5761186a614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154558339815191526020526040812060030180545f80516020615415833981519152916001600160401b03909116908361192583614eb2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d69190810190614f4e565b9150915080611a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa09190614c61565b825114611b045760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b7a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b898460400151613270565b91509150818714611bf65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c0a815f613448565b50565b5f9182525f80516020615455833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cce57611c8e816001615036565b611c99906008614c4a565b5081515f90839083908110611cb057611cb0615049565b60200101906001600160f81b03191690815f1a905350600101611c7a565b505f5b6004811015611d3157611ce5816003615036565b611cf0906008614c4a565b6001901c60f81b82611d03836002614d96565b81518110611d1357611d13615049565b60200101906001600160f81b03191690815f1a905350600101611cd1565b505f5b6020811015611d9357611d4881601f615036565b611d53906008614c4a565b86901c60f81b82611d65836006614d96565b81518110611d7557611d75615049565b60200101906001600160f81b03191690815f1a905350600101611d34565b505f5b6008811015611dfe57611daa816007615036565b611db5906008614c4a565b6001600160401b038616901c60f81b82611dd0836026614d96565b81518110611de057611de0615049565b60200101906001600160f81b03191690815f1a905350600101611d96565b505f5b6008811015611e6957611e15816007615036565b611e20906008614c4a565b6001600160401b038516901c60f81b82611e3b83602e614d96565b81518110611e4b57611e4b615049565b60200101906001600160f81b03191690815f1a905350600101611e01565b50949350505050565b611e7a6136a2565b611e83826136ed565b611e8c81613759565b5050565b611e986148e7565b5f805160206154158339815191525f611eb08461229c565b90505f80611ec183604001516130cf565b915091508015611f265760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5857611f58614afd565b6005811115611f6957611f69614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ff057611ff0614afd565b148061200e575060018251600581111561200c5761200c614afd565b145b61206d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561208257612082614afd565b0361208f57506004612093565b5060055b6020808301515f908152600988019091526040812055818160058111156120bc576120bc614afd565b908160058111156120cf576120cf614afd565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561210357612103614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121ce576121ce614afd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153b583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561225e575f80fd5b505af1158015612270573d5f803e3d5ffd5b50505050505050565b5f805160206153b583398151915254611e8c906001600160a01b031683836137fa565b60408051606080820183525f8083526020830181905292820152905f805160206154158339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612311573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123389190810190614f4e565b915091508061239f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146124025760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124755760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124a15760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156124f0576124b8816001615036565b6124c3906008614c4a565b61ffff168682815181106124d9576124d9615049565b016020015160f81c901b91909117906001016124a4565b5061ffff8116156125135760405162461bcd60e51b81526004016104c0906150a6565b5f805b600481101561256e5761252a816003615036565b612535906008614c4a565b63ffffffff1687612547836002614d96565b8151811061255757612557615049565b016020015160f81c901b9190911790600101612516565b5063ffffffff81166003146125955760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156125ea576125ac81601f615036565b6125b7906008614c4a565b886125c3836006614d96565b815181106125d3576125d3615049565b016020015160f81c901b9190911790600101612598565b505f805b600881101561264957612602816007615036565b61260d906008614c4a565b6001600160401b031689612622836026614d96565b8151811061263257612632615049565b016020015160f81c901b91909117906001016125ee565b505f805b60088110156126a857612661816007615036565b61266c906008614c4a565b6001600160401b03168a61268183602e614d96565b8151811061269157612691615049565b016020015160f81c901b919091179060010161264d565b5091989097509095509350505050565b6126c06148e7565b5f8281525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff16600581111561270e5761270e614afd565b600581111561271f5761271f614afd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a7576127a7614afd565b146128035760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461287d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61288a8160a00151611c00565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128ce576128ce614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61299a85612994816118e2565b5f611c55565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c9908590600401614c9a565b6020604051808303815f875af11580156129e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a099190614c61565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a6a612e5f565b5f805160206153d58339815191525f612a856101ed85613859565b90505f612a9187611803565b9050600281516005811115612aa857612aa8614afd565b14612b075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b108261387c565b5f828260a00151612b219190614d76565b60048501546060840151919250612b43916001600160401b0390911690614c1f565b6001600160401b0316816001600160401b03161115612bc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bcc8882611c0d565b5f612bd6896118e2565b90505f8982604051602001612c0292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c3c8d8688611c55565b6040518263ffffffff1660e01b8152600401612c589190614c9a565b6020604051808303815f875af1158015612c74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c989190614c61565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d2057612d20614afd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127e60015f8051602061543583398151915255565b5f80516020615435833981519152805460011901612e9057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153d5833981519152906001600160401b0316612ee26040860160208701614a61565b6001600160401b03161015612f515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f63602086018661513f565b61ffff1610158015612f875750612710612f80602086018661513f565b61ffff1611155b612fa35760405162461bcd60e51b81526004016104c09061515a565b80548310156130065760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561306d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307784613859565b90505f61308382610a62565b90505f6130908883613887565b5f818152600586016020526040902090915087906130ae82826151a5565b509098975050505050505050565b60015f8051602061543583398151915255565b5f8082516027146130f25760405162461bcd60e51b81526004016104c09061505d565b5f805b600281101561314157613109816001615036565b613114906008614c4a565b61ffff1685828151811061312a5761312a615049565b016020015160f81c901b91909117906001016130f5565b5061ffff8116156131645760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156131bf5761317b816003615036565b613186906008614c4a565b63ffffffff1686613198836002614d96565b815181106131a8576131a8615049565b016020015160f81c901b9190911790600101613167565b5063ffffffff81166002146131e65760405162461bcd60e51b81526004016104c0906150e9565b5f805b602081101561323b576131fd81601f615036565b613208906008614c4a565b87613214836006614d96565b8151811061322457613224615049565b016020015160f81c901b91909117906001016131e9565b505f8660268151811061325057613250615049565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132935760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156132e2576132aa816001615036565b6132b5906008614c4a565b61ffff168582815181106132cb576132cb615049565b016020015160f81c901b9190911790600101613296565b5061ffff8116156133055760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156133605761331c816003615036565b613327906008614c4a565b63ffffffff1686613339836002614d96565b8151811061334957613349615049565b016020015160f81c901b9190911790600101613308565b5063ffffffff81166004146133875760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156133dc5761339e81601f615036565b6133a9906008614c4a565b876133b5836006614d96565b815181106133c5576133c5615049565b016020015160f81c901b919091179060010161338a565b505f805b600881101561343b576133f4816007615036565b6133ff906008614c4a565b6001600160401b031688613414836026614d96565b8151811061342457613424615049565b016020015160f81c901b91909117906001016133e0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061541583398151915291429190158061352e57506002830154815161352a916001600160401b031690614d96565b8210155b15613554576001600160401b038516606082015281815260408101516020820152613573565b84816060018181516135669190614d76565b6001600160401b03169052505b6060810151613583906064614c1f565b602082015160028501546001600160401b0392909216916135ae9190600160401b900460ff16614c4a565b10156136125760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363b57846001600160401b0316816040018181516136339190614d96565b90525061365a565b846001600160401b0316816040018181516136569190615036565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136eb57604051631afcd79f60e31b815260040160405180910390fd5b565b6136f56136a2565b6136fe81613dc1565b611c0a608082013560a083013561371b60e0850160c08601614a61565b61372c610100860160e0870161513f565b61ffff16613742610120870161010088016151fb565b6137546101408801610120890161521b565b613de2565b6137616136a2565b5f805160206153b58339815191526001600160a01b0382166137da5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bee91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614026565b5f610a72825f805160206153b5833981519152546001600160a01b031690614087565b611c0a816001613448565b5f5f80516020615415833981519152426138a76040860160208701614a61565b6001600160401b0316116139195760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139296040850160208601614a61565b6001600160401b031661393f6202a30042614d96565b116139b25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a0a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a7a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a876040850185615236565b9050603014613aee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af78361387c565b5f80613b916040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b3c9190614a61565b6001600160401b03168152602001613b5760408a018a615236565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e9565b5f82815260078601602052604090209193509150613baf82826152c3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bdc908590600401614c9a565b6020604051808303815f875af1158015613bf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c1c9190614c61565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9e57613c9e614afd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d9391908e01908e01614a61565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc96136a2565b613dd161458e565b613dd961459e565b611c0a816145a6565b613dea6136a2565b5f805160206153d583398151915283613e565760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e785760405162461bcd60e51b81526004016104c09061515a565b85871115613ee05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f4d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fbf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61403a6001600160a01b03841683614753565b905080515f1415801561405e57508080602001905181019061405c919061537e565b155b15610bee57604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f19190614c61565b90506141086001600160a01b038516333086614760565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561414c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141709190614c61565b90508181116141d65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141e08282615036565b95945050505050565b5f60608260800151516030146142535760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ca5761428a816001615036565b614295906008614c4a565b5081515f908390839081106142ac576142ac615049565b60200101906001600160f81b03191690815f1a905350600101614276565b505f5b6004811015614328576142e1816003615036565b6142ec906008614c4a565b505f826142fa836002614d96565b8151811061430a5761430a615049565b60200101906001600160f81b03191690815f1a9053506001016142cd565b505f5b6020811015614385578451816020811061434757614347615049565b1a60f81b82614357836006614d96565b8151811061436757614367615049565b60200101906001600160f81b03191690815f1a90535060010161432b565b505f5b60208110156143e557846020015181602081106143a7576143a7615049565b1a60f81b826143b7836026614d96565b815181106143c7576143c7615049565b60200101906001600160f81b03191690815f1a905350600101614388565b505f5b6008811015614459576143fc816007615036565b614407906008614c4a565b60ff1685604001516001600160401b0316901c60f81b8282604661442b9190614d96565b8151811061443b5761443b615049565b60200101906001600160f81b03191690815f1a9053506001016143e8565b505f5b60308110156144c4578460800151818151811061447b5761447b615049565b01602001516001600160f81b0319168261449683604e614d96565b815181106144a6576144a6615049565b60200101906001600160f81b03191690815f1a90535060010161445c565b505f5b6008811015614536576144db816007615036565b6144e6906008614c4a565b60608601516001600160401b0390811691161c60f81b8261450883607e614d96565b8151811061451857614518615049565b60200101906001600160f81b03191690815f1a9053506001016144c7565b506002816040516145479190615399565b602060405180830381855afa158015614562573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145859190614c61565b94909350915050565b6145966136a2565b6136eb614799565b6136eb6136a2565b6145ae6136a2565b80355f8051602061541583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145fa60808401606085016151fb565b60ff1611156146675760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61467860808401606085016151fb565b60ff16116146e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146f060808301606084016151fb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147216060830160408401614a61565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127e83835f6147a1565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613827565b6130bc6136a2565b6060814710156147c65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147e19190615399565b5f6040518083038185875af1925050503d805f811461481b576040519150601f19603f3d011682016040523d82523d5f602084013e614820565b606091505b5091509150611bf68683836060826148405761483b82614887565b61127e565b815115801561485757506001600160a01b0384163b155b1561488057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061127e565b8051156148975780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148bc90614da9565b5f825580601f106148cb575050565b601f0160209004905f5260205f2090810190611c0a919061492b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561493f575f815560010161492c565b5090565b8015158114611c0a575f80fd5b803563ffffffff81168114614963575f80fd5b919050565b5f805f6060848603121561497a575f80fd5b83359250602084013561498c81614943565b915061499a60408501614950565b90509250925092565b5f602082840312156149b3575f80fd5b5035919050565b6001600160a01b0381168114611c0a575f80fd5b5f808284036101608112156149e1575f80fd5b610140808212156149f0575f80fd5b8493508301359050614a01816149ba565b809150509250929050565b5f60208284031215614a1c575f80fd5b61127e82614950565b5f8060408385031215614a36575f80fd5b614a3f83614950565b946020939093013593505050565b6001600160401b0381168114611c0a575f80fd5b5f60208284031215614a71575f80fd5b813561127e81614a4d565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aaf575f80fd5b84356001600160401b03811115614ac4575f80fd5b850160608188031215614ad5575f80fd5b93506040601f1982011215614ae8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b3557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5d60408401826001600160a01b03169052565b506060830151614b7860608401826001600160401b03169052565b506080830151614b9360808401826001600160401b03169052565b5060a0830151614bae60a08401826001600160401b03169052565b5060c0830151614bc960c08401826001600160401b03169052565b5060e0830151614be460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614be457614be4614beb565b6001600160401b03818116838216028082169190828114614c4257614c42614beb565b505092915050565b8082028115828204841417610a7257610a72614beb565b5f60208284031215614c71575f80fd5b5051919050565b5f5b83811015614c92578181015183820152602001614c7a565b50505f910152565b602081525f8251806020840152614cb8816040850160208701614c78565b601f01601f19169190910160400192915050565b5f82614ce657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614be457614be4614beb565b80820180821115610a7257610a72614beb565b600181811c90821680614dbd57607f821691505b602082108103614ddb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e3a81614da9565b806020870152604060018084165f8114614e5b5760018114614e7757614ea4565b60ff19851660408a0152604084151560051b8a01019550614ea4565b895f5260205f205f5b85811015614e9b5781548b8201860152908301908801614e80565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ecd57614ecd614beb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f0d57614f0d614ed7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f3b57614f3b614ed7565b604052919050565b805161496381614943565b5f8060408385031215614f5f575f80fd5b82516001600160401b0380821115614f75575f80fd5b9084019060608287031215614f88575f80fd5b614f90614eeb565b82518152602080840151614fa3816149ba565b82820152604084015183811115614fb8575f80fd5b80850194505087601f850112614fcc575f80fd5b835183811115614fde57614fde614ed7565b614ff0601f8201601f19168301614f13565b93508084528882828701011115615005575f80fd5b61501481838601848801614c78565b50826040830152819550615029818801614f43565b9450505050509250929050565b81810381811115610a7257610a72614beb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c0a575f80fd5b5f6020828403121561514f575f80fd5b813561127e81615130565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151b081615130565b61ffff8116905081548161ffff19821617835560208401356151d181614a4d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561520b575f80fd5b813560ff8116811461127e575f80fd5b5f6020828403121561522b575f80fd5b813561127e816149ba565b5f808335601e1984360301811261524b575f80fd5b8301803591506001600160401b03821115615264575f80fd5b602001915036819003821315615278575f80fd5b9250929050565b601f821115610bee57805f5260205f20601f840160051c810160208510156152a45750805b601f840160051c820191505b81811015611007575f81556001016152b0565b81516001600160401b038111156152dc576152dc614ed7565b6152f0816152ea8454614da9565b8461527f565b602080601f831160018114615323575f841561530c5750858301515b5f19600386901b1c1916600185901b178555611005565b5f85815260208120601f198616915b8281101561535157888601518255948401946001909101908401615332565b508582101561536e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561538e575f80fd5b815161127e81614943565b5f82516153aa818460208701614c78565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 253fe8781..2b0241b15 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,8 @@ 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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161518738038061518783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61503a8061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b1565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ec565b610982565b34801561018b575f80fd5b506101ca61019a3660046145ec565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614603565b610b52565b34801561022d575f80fd5b5061024161023c3660046145ec565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461461a565b610c45565b3480156102ab575f80fd5b5061015f6102ba366004614633565b610ca8565b3480156102ca575f80fd5b506101ca6102d936600461466f565b610e78565b3480156102e9575f80fd5b506102416102f83660046145ec565b610e91565b348015610308575f80fd5b5061015f6103173660046145b1565b610ea5565b6101ca61032a36600461468a565b6110c3565b34801561033a575f80fd5b5061015f610349366004614633565b6110ef565b348015610359575f80fd5b5061015f61036836600461461a565b611331565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ec565b6114ee565b3480156103dd575f80fd5b5061015f6103ec3660046145ec565b611774565b6101ca6103ff3660046145ec565b611883565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ec565b61188f565b6040516101d491906146f7565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f8e833981519152949193919290829060ff1660048111156104c2576104c26146e3565b60048111156104d3576104d36146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188f565b905042600283516004811115610567576105676146e3565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fae8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fae8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196e565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f0565b6001600160401b03169050605060ff168460c001518461076e91906147e5565b6107789190614805565b6001600160401b031661078c826064614830565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f9190614847565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146e3565b03610889576108898460600151611c8c565b5f84606001518460a0015161089e91906147e5565b90506108aa8682611c99565b5f6005600160991b0163ee5b48eb6108c3898686611ce1565b6040518263ffffffff1660e01b81526004016108df9190614880565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f9190614847565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff1660058111156109d0576109d06146e3565b60058111156109e1576109e16146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146e3565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce1565b6040518263ffffffff1660e01b8152600401610b0c9190614880565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c9190614847565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f00565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148b2565b92915050565b5f80516020614f8e8339815191525f610c5d83611f11565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612288565b505050565b5f80516020614f8e8339815191525f610cc08461229b565b90505f80610cd1836040015161247c565b50915091505f610ce08361188f565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d1565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b090614913565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146e3565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614830565b5f610e9b8261188f565b60a0015192915050565b5f80516020614f8e8339815191525f610ebd856126b7565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b03169061495c565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f0565b9050605060ff168260c001518360e00151610f9c91906147e5565b610fa69190614805565b6001600160401b0316610fba826064614805565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110879190614847565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b490849061497c565b90915550505b505b5050505050565b5f6110cc612a60565b6110d7838334612a97565b9050610c3f60015f80516020614fee83398151915255565b5f80516020614f8e8339815191525f6111078461229b565b90505f80611118836040015161247c565b50915091505f6111278361188f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146e3565b6004811115611172576111726146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d1565b826001600160401b03168160e001516001600160401b031611156112475760405162461bcd60e51b81526004016105b090614913565b60038151600481111561125c5761125c6146e3565b146112b05760405162461bcd60e51b815260206004820152603160248201525f80516020614fae8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112ef9190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fce8339815191525f6113498361229b565b90505f8061135a8360400151612cc5565b91509150806113bc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d69061498f565b9050118015611408575060015f83815260088601602052604090205460ff166005811115611406576114066146e3565b145b6114245760405162461bcd60e51b81526004016105b0906149c1565b5f828152600785016020526040812061143c916144f9565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f8e83398151915293929190829060ff16600481111561154f5761154f6146e3565b6004811115611560576115606146e3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e7576115e76146e3565b14806116055750600381516004811115611603576116036146e3565b145b6116595760405162461bcd60e51b815260206004820152603260248201525f80516020614fae833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611667826040015161188f565b905080608001516001600160401b03165f036116eb5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611718846040015184608001518560a00151611ce1565b6040518263ffffffff1660e01b81526004016117349190614880565b6020604051808303815f875af1158015611750573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc9190614847565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fce8339815191529291906117bc9061498f565b90501180156117ee575060015f83815260088301602052604090205460ff1660058111156117ec576117ec6146e3565b145b61180a5760405162461bcd60e51b81526004016105b0906149c1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118439190600401614a08565b6020604051808303815f875af115801561185f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca39190614847565b5f610c3f823334612e66565b611897614530565b5f8281525f8051602061500e8339815191526020526040908190208151610100810190925280545f80516020614fce833981519152929190829060ff1660058111156118e5576118e56146e3565b60058111156118f6576118f66146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061500e8339815191526020526040812060030180545f80516020614fce833981519152916001600160401b0390911690836119b183614a92565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a3b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a629190810190614b42565b9150915080611ac55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2c9190614847565b825114611b905760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c065760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c158460400151613261565b91509150818714611c825760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c96815f613439565b50565b5f9182525f8051602061500e833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5a57611d1a816001614c2a565b611d25906008614830565b5081515f90839083908110611d3c57611d3c614c3d565b60200101906001600160f81b03191690815f1a905350600101611d06565b505f5b6004811015611dbd57611d71816003614c2a565b611d7c906008614830565b6001901c60f81b82611d8f83600261497c565b81518110611d9f57611d9f614c3d565b60200101906001600160f81b03191690815f1a905350600101611d5d565b505f5b6020811015611e1f57611dd481601f614c2a565b611ddf906008614830565b86901c60f81b82611df183600661497c565b81518110611e0157611e01614c3d565b60200101906001600160f81b03191690815f1a905350600101611dc0565b505f5b6008811015611e8a57611e36816007614c2a565b611e41906008614830565b6001600160401b038616901c60f81b82611e5c83602661497c565b81518110611e6c57611e6c614c3d565b60200101906001600160f81b03191690815f1a905350600101611e22565b505f5b6008811015611ef557611ea1816007614c2a565b611eac906008614830565b6001600160401b038516901c60f81b82611ec783602e61497c565b81518110611ed757611ed7614c3d565b60200101906001600160f81b03191690815f1a905350600101611e8d565b5090505b9392505050565b611f08613693565b611c96816136de565b611f19614530565b5f80516020614fce8339815191525f611f318461229b565b90505f80611f428360400151612cc5565b915091508015611fa75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd957611fd96146e3565b6005811115611fea57611fea6146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612071576120716146e3565b148061208f575060018251600581111561208d5761208d6146e3565b145b6120ee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612103576121036146e3565b0361211057506004612114565b5060055b6020808301515f9081526009880190915260408120558181600581111561213d5761213d6146e3565b90816005811115612150576121506146e3565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612184576121846146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224f5761224f6146e3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122846001600160a01b0383168261374a565b60408051606080820183525f8083526020830181905292820152905f80516020614fce8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612310573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123379190810190614b42565b915091508061239e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124015760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a05760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156124ef576124b7816001614c2a565b6124c2906008614830565b61ffff168682815181106124d8576124d8614c3d565b016020015160f81c901b91909117906001016124a3565b5061ffff8116156125125760405162461bcd60e51b81526004016105b090614c9a565b5f805b600481101561256d57612529816003614c2a565b612534906008614830565b63ffffffff168761254683600261497c565b8151811061255657612556614c3d565b016020015160f81c901b9190911790600101612515565b5063ffffffff81166003146125945760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156125e9576125ab81601f614c2a565b6125b6906008614830565b886125c283600661497c565b815181106125d2576125d2614c3d565b016020015160f81c901b9190911790600101612597565b505f805b600881101561264857612601816007614c2a565b61260c906008614830565b6001600160401b03168961262183602661497c565b8151811061263157612631614c3d565b016020015160f81c901b91909117906001016125ed565b505f805b60088110156126a757612660816007614c2a565b61266b906008614830565b6001600160401b03168a61268083602e61497c565b8151811061269057612690614c3d565b016020015160f81c901b919091179060010161264c565b5091989097509095509350505050565b6126bf614530565b5f8281525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff16600581111561270d5761270d6146e3565b600581111561271e5761271e6146e3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a6576127a66146e3565b146128025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128898160a00151611c8c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cd576128cd6146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612999856129938161196e565b5f611ce1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c8908590600401614880565b6020604051808303815f875af11580156129e4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a089190614847565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614fee833981519152805460011901612a9157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f8e833981519152906001600160401b0316612ae3604086016020870161466f565b6001600160401b03161015612b525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b646020860186614d33565b61ffff1610158015612b885750612710612b816020860186614d33565b61ffff1611155b612ba45760405162461bcd60e51b81526004016105b090614d4e565b8054831015612c075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7982610c2f565b90505f612c8688836137dd565b5f81815260058601602052604090209091508790612ca48282614d99565b509098975050505050505050565b60015f80516020614fee83398151915255565b5f808251602714612ce85760405162461bcd60e51b81526004016105b090614c51565b5f805b6002811015612d3757612cff816001614c2a565b612d0a906008614830565b61ffff16858281518110612d2057612d20614c3d565b016020015160f81c901b9190911790600101612ceb565b5061ffff811615612d5a5760405162461bcd60e51b81526004016105b090614c9a565b5f805b6004811015612db557612d71816003614c2a565b612d7c906008614830565b63ffffffff1686612d8e83600261497c565b81518110612d9e57612d9e614c3d565b016020015160f81c901b9190911790600101612d5d565b5063ffffffff8116600214612ddc5760405162461bcd60e51b81526004016105b090614cdd565b5f805b6020811015612e3157612df381601f614c2a565b612dfe906008614830565b87612e0a83600661497c565b81518110612e1a57612e1a614c3d565b016020015160f81c901b9190911790600101612ddf565b505f86602681518110612e4657612e46614c3d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6f612a60565b5f80516020614f8e8339815191525f612e8784610c2f565b90505f612e938761188f565b9050600281516005811115612eaa57612eaa6146e3565b14612f095760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1282613d17565b5f828260a00151612f23919061495c565b60048501546060840151919250612f45916001600160401b0390911690614805565b6001600160401b0316816001600160401b03161115612fc45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fce8882611c99565b5f612fd88961196e565b90505f898260405160200161300492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303e8d8688611ce1565b6040518263ffffffff1660e01b815260040161305a9190614880565b6020604051808303815f875af1158015613076573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309a9190614847565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613122576131226146e3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef960015f80516020614fee83398151915255565b5f808251602e146132845760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156132d35761329b816001614c2a565b6132a6906008614830565b61ffff168582815181106132bc576132bc614c3d565b016020015160f81c901b9190911790600101613287565b5061ffff8116156132f65760405162461bcd60e51b81526004016105b090614c9a565b5f805b60048110156133515761330d816003614c2a565b613318906008614830565b63ffffffff168661332a83600261497c565b8151811061333a5761333a614c3d565b016020015160f81c901b91909117906001016132f9565b5063ffffffff81166004146133785760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156133cd5761338f81601f614c2a565b61339a906008614830565b876133a683600661497c565b815181106133b6576133b6614c3d565b016020015160f81c901b919091179060010161337b565b505f805b600881101561342c576133e5816007614c2a565b6133f0906008614830565b6001600160401b03168861340583602661497c565b8151811061341557613415614c3d565b016020015160f81c901b91909117906001016133d1565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fce83398151915291429190158061351f57506002830154815161351b916001600160401b03169061497c565b8210155b15613545576001600160401b038516606082015281815260408101516020820152613564565b8481606001818151613557919061495c565b6001600160401b03169052505b6060810151613574906064614805565b602082015160028501546001600160401b03929092169161359f9190600160401b900460ff16614830565b10156136035760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362c57846001600160401b031681604001818151613624919061497c565b90525061364b565b846001600160401b0316816040018181516136479190614c2a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136dc57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e6613693565b6136ef81613d22565b611c96608082013560a083013561370c60e0850160c0860161466f565b61371d610100860160e08701614d33565b61ffff1661373361012087016101008801614def565b61374561014088016101208901614e0f565b613d43565b8047101561376d5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b6576040519150601f19603f3d011682016040523d82523d5f602084013e6137bb565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fce833981519152426137fd604086016020870161466f565b6001600160401b03161161386f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387f604085016020860161466f565b6001600160401b03166138956202a3004261497c565b116139085760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139605760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139dd6040850185614e2a565b9050603014613a445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4d83613d17565b5f80613ae76040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a92919061466f565b6001600160401b03168152602001613aad60408a018a614e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f87565b5f82815260078601602052604090209193509150613b058282614eb7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b32908590600401614880565b6020604051808303815f875af1158015613b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b729190614847565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf457613bf46146e3565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce991908e01908e0161466f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c96816001613439565b613d2a613693565b613d3261432c565b613d3a61433c565b611c9681614344565b613d4b613693565b5f80516020614f8e83398151915283613db75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd95760405162461bcd60e51b81526004016105b090614d4e565b85871115613e415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eae5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f205760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406857614028816001614c2a565b614033906008614830565b5081515f9083908390811061404a5761404a614c3d565b60200101906001600160f81b03191690815f1a905350600101614014565b505f5b60048110156140c65761407f816003614c2a565b61408a906008614830565b505f8261409883600261497c565b815181106140a8576140a8614c3d565b60200101906001600160f81b03191690815f1a90535060010161406b565b505f5b602081101561412357845181602081106140e5576140e5614c3d565b1a60f81b826140f583600661497c565b8151811061410557614105614c3d565b60200101906001600160f81b03191690815f1a9053506001016140c9565b505f5b6020811015614183578460200151816020811061414557614145614c3d565b1a60f81b8261415583602661497c565b8151811061416557614165614c3d565b60200101906001600160f81b03191690815f1a905350600101614126565b505f5b60088110156141f75761419a816007614c2a565b6141a5906008614830565b60ff1685604001516001600160401b0316901c60f81b828260466141c9919061497c565b815181106141d9576141d9614c3d565b60200101906001600160f81b03191690815f1a905350600101614186565b505f5b6030811015614262578460800151818151811061421957614219614c3d565b01602001516001600160f81b0319168261423483604e61497c565b8151811061424457614244614c3d565b60200101906001600160f81b03191690815f1a9053506001016141fa565b505f5b60088110156142d457614279816007614c2a565b614284906008614830565b60608601516001600160401b0390811691161c60f81b826142a683607e61497c565b815181106142b6576142b6614c3d565b60200101906001600160f81b03191690815f1a905350600101614265565b506002816040516142e59190614f72565b602060405180830381855afa158015614300573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143239190614847565b94909350915050565b614334613693565b6136dc6144f1565b6136dc613693565b61434c613693565b80355f80516020614fce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143986080840160608501614def565b60ff1611156144055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144166080840160608501614def565b60ff161161447e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448e6080830160608401614def565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bf606083016040840161466f565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb2613693565b5080546145059061498f565b5f825580601f10614514575050565b601f0160209004905f5260205f2090810190611c969190614574565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614588575f8155600101614575565b5090565b8015158114611c96575f80fd5b803563ffffffff811681146145ac575f80fd5b919050565b5f805f606084860312156145c3575f80fd5b8335925060208401356145d58161458c565b91506145e360408501614599565b90509250925092565b5f602082840312156145fc575f80fd5b5035919050565b5f6101408284031215614614575f80fd5b50919050565b5f6020828403121561462a575f80fd5b611ef982614599565b5f8060408385031215614644575f80fd5b61464d83614599565b946020939093013593505050565b6001600160401b0381168114611c96575f80fd5b5f6020828403121561467f575f80fd5b8135611ef98161465b565b5f80828403606081121561469c575f80fd5b83356001600160401b038111156146b1575f80fd5b8401606081870312156146c2575f80fd5b92506040601f19820112156146d5575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471b57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474360408401826001600160a01b03169052565b50606083015161475e60608401826001600160401b03169052565b50608083015161477960808401826001600160401b03169052565b5060a083015161479460a08401826001600160401b03169052565b5060c08301516147af60c08401826001600160401b03169052565b5060e08301516147ca60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147ca576147ca6147d1565b6001600160401b03818116838216028082169190828114614828576148286147d1565b505092915050565b8082028115828204841417610c3f57610c3f6147d1565b5f60208284031215614857575f80fd5b5051919050565b5f5b83811015614878578181015183820152602001614860565b50505f910152565b602081525f825180602084015261489e81604085016020870161485e565b601f01601f19169190910160400192915050565b5f826148cc57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147ca576147ca6147d1565b80820180821115610c3f57610c3f6147d1565b600181811c908216806149a357607f821691505b60208210810361461457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a1a8161498f565b806020870152604060018084165f8114614a3b5760018114614a5757614a84565b60ff19851660408a0152604084151560051b8a01019550614a84565b895f5260205f205f5b85811015614a7b5781548b8201860152908301908801614a60565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614aad57614aad6147d1565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614aed57614aed614ab7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b1b57614b1b614ab7565b604052919050565b6001600160a01b0381168114611c96575f80fd5b80516145ac8161458c565b5f8060408385031215614b53575f80fd5b82516001600160401b0380821115614b69575f80fd5b9084019060608287031215614b7c575f80fd5b614b84614acb565b82518152602080840151614b9781614b23565b82820152604084015183811115614bac575f80fd5b80850194505087601f850112614bc0575f80fd5b835183811115614bd257614bd2614ab7565b614be4601f8201601f19168301614af3565b93508084528882828701011115614bf9575f80fd5b614c088183860184880161485e565b50826040830152819550614c1d818801614b37565b9450505050509250929050565b81810381811115610c3f57610c3f6147d1565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c96575f80fd5b5f60208284031215614d43575f80fd5b8135611ef981614d24565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614da481614d24565b61ffff8116905081548161ffff1982161783556020840135614dc58161465b565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614dff575f80fd5b813560ff81168114611ef9575f80fd5b5f60208284031215614e1f575f80fd5b8135611ef981614b23565b5f808335601e19843603018112614e3f575f80fd5b8301803591506001600160401b03821115614e58575f80fd5b602001915036819003821315614e6c575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614e985750805b601f840160051c820191505b818110156110bc575f8155600101614ea4565b81516001600160401b03811115614ed057614ed0614ab7565b614ee481614ede845461498f565b84614e73565b602080601f831160018114614f17575f8415614f005750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4557888601518255948401946001909101908401614f26565b5085821015614f6257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8381846020870161485e565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161526538038061526583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151188061014d5f395ff3fe608060405260043610610147575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103d8578063bee0a03f146103f7578063c599e24f14610416578063c974d1b614610429578063d5f20ff61461043d578063df93d8de14610469575f80fd5b806376f786211461033a57806380a8ad941461035957806398f3e2b41461036c578063a3a65e481461038b578063afba878a146103aa578063b771b3bc146103be575f80fd5b8063329c3e1211610104578063329c3e121461026457806335455ded14610296578063467ef06f146102be5780635297fae6146102dd57806362065856146102fc57806366435abf1461031b575f80fd5b80630118acc41461014b5780630322ed981461016c5780630cdd09851461018b578063151d30d1146101e85780631f7a9d8f1461020e5780632e2194d81461022d575b5f80fd5b348015610156575f80fd5b5061016a61016536600461468f565b61047f565b005b348015610177575f80fd5b5061016a6101863660046146ca565b6109a7565b348015610196575f80fd5b506101d56101a53660046146ca565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101f3575f80fd5b506101fc600a81565b60405160ff90911681526020016101df565b348015610219575f80fd5b5061016a6102283660046146e1565b610b77565b348015610238575f80fd5b5061024c6102473660046146ca565b610c54565b6040516001600160401b0390911681526020016101df565b34801561026f575f80fd5b5061027e6001600160991b0181565b6040516001600160a01b0390911681526020016101df565b3480156102a1575f80fd5b506102ab61271081565b60405161ffff90911681526020016101df565b3480156102c9575f80fd5b5061016a6102d83660046146f8565b610c6a565b3480156102e8575f80fd5b5061016a6102f7366004614711565b610d06565b348015610307575f80fd5b506101d561031636600461474d565b610ed6565b348015610326575f80fd5b5061024c6103353660046146ca565b610eef565b348015610345575f80fd5b5061016a61035436600461468f565b610f03565b6101d5610367366004614768565b611121565b348015610377575f80fd5b5061016a610386366004614711565b61114d565b348015610396575f80fd5b5061016a6103a53660046146f8565b6113b1565b3480156103b5575f80fd5b506101fc605081565b3480156103c9575f80fd5b5061027e6005600160991b0181565b3480156103e3575f80fd5b5061016a6103f23660046146ca565b61156e565b348015610402575f80fd5b5061016a6104113660046146ca565b6117f4565b6101d56104243660046146ca565b611903565b348015610434575f80fd5b506101fc601481565b348015610448575f80fd5b5061045c6104573660046146ca565b61190f565b6040516101df91906147d5565b348015610474575f80fd5b5061024c6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f8051602061506c833981519152949193919290829060ff1660048111156104e7576104e76147c1565b60048111156104f8576104f86147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105748361190f565b90504260028351600481111561058c5761058c6147c1565b146105de5760405162461bcd60e51b815260206004820152602a60248201525f8051602061508c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106435760405162461bcd60e51b815260206004820152603360248201525f8051602061508c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d5565b5f61064d856119ee565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561069a5761069a6147c1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610887575f6107738689611a70565b6001600160401b03169050605060ff168460c001518461079391906148c3565b61079d91906148e3565b6001600160401b03166107b182606461490e565b10610885578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107e98760600151610ed6565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa158015610850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108749190614925565b5f8b81526009890160205260409020555b505b60028351600581111561089c5761089c6147c1565b036108ae576108ae8460600151611d0c565b5f84606001518460a001516108c391906148c3565b90506108cf8682611d19565b5f6005600160991b0163ee5b48eb6108e8898686611d61565b6040518263ffffffff1660e01b8152600401610904919061495e565b6020604051808303815f875af1158015610920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109449190614925565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156109f5576109f56147c1565b6005811115610a0657610a066147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a8b57610a8b6147c1565b14610af05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb610b158584608001515f611d61565b6040518263ffffffff1660e01b8152600401610b31919061495e565b6020604051808303815f875af1158015610b4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b719190614925565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc0575080546001600160401b03808416911610155b15610bde5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0883611f80565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c6464e8d4a5100083614990565b92915050565b5f8051602061506c8339815191525f610c8283611f91565b9050600481516005811115610c9957610c996147c1565b03610ce7576040808201516001600160a01b0381165f908152600a85016020529190912054610cc89190612304565b6040808201516001600160a01b03165f908152600a8401602052908120555b610d018160400151610cfc8360600151610ed6565b612362565b505050565b5f8051602061506c8339815191525f610d1e84612379565b90505f80610d2f836040015161255a565b50915091505f610d3e8361190f565b9050816001600160401b031681608001516001600160401b03161015610d765760405162461bcd60e51b81526004016105d5906149af565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dbb5760405162461bcd60e51b81526004016105d5906149f1565b60015f87815260068701602052604090205460ff166004811115610de157610de16147c1565b14610e4a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d5565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c646001600160401b03831664e8d4a5100061490e565b5f610ef98261190f565b60a0015192915050565b5f8051602061506c8339815191525f610f1b85612795565b5f86815260058401602052604090205460c0820151919250610f4d91620100009091046001600160401b031690614a3a565b6001600160401b03168160e001516001600160401b03161015610fce5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105d5565b831561111a575f610fdf8685611a70565b9050605060ff168260c001518360e00151610ffa91906148c3565b61100491906148e3565b6001600160401b03166110188260646148e3565b6001600160401b031610611118578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6110598460600151610ed6565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190614925565b6040808401516001600160a01b03165f908152600a86016020529081208054909190611112908490614a5a565b90915550505b505b5050505050565b5f61112a612b3e565b611135838334612b75565b9050610c6460015f805160206150cc83398151915255565b5f8051602061506c8339815191525f61116584612379565b90505f80611176836040015161255a565b50915091505f6111858361190f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156111bf576111bf6147c1565b60048111156111d0576111d06147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561126f5760405162461bcd60e51b81526004016105d5906149af565b826001600160401b03168160e001516001600160401b031611156112a55760405162461bcd60e51b81526004016105d5906149f1565b6003815160048111156112ba576112ba6147c1565b1461130e5760405162461bcd60e51b815260206004820152603160248201525f8051602061508c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d5565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546113449190612304565b856009015f8881526020019081526020015f205f905561136f8160200151610cfc8360600151610ed6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206150ac8339815191525f6113c983612379565b90505f806113da8360400151612da3565b915091508061143c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d5565b5f8281526007850160205260408120805461145690614a6d565b9050118015611488575060015f83815260088601602052604090205460ff166005811115611486576114866147c1565b145b6114a45760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078501602052604081206114bc916145d7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061506c83398151915293929190829060ff1660048111156115cf576115cf6147c1565b60048111156115e0576115e06147c1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611667576116676147c1565b14806116855750600381516004811115611683576116836147c1565b145b6116d95760405162461bcd60e51b815260206004820152603260248201525f8051602061508c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105d5565b5f6116e7826040015161190f565b905080608001516001600160401b03165f0361176b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb611798846040015184608001518560a00151611d61565b6040518263ffffffff1660e01b81526004016117b4919061495e565b6020604051808303815f875af11580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190614925565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150ac83398151915292919061183c90614a6d565b905011801561186e575060015f83815260088301602052604090205460ff16600581111561186c5761186c6147c1565b145b61188a5760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c39190600401614ae6565b6020604051808303815f875af11580156118df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d019190614925565b5f610c64823334612f44565b61191761460e565b5f8281525f805160206150ec8339815191526020526040908190208151610100810190925280545f805160206150ac833981519152929190829060ff166005811115611965576119656147c1565b6005811115611976576119766147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150ec8339815191526020526040812060030180545f805160206150ac833981519152916001600160401b039091169083611a3183614b70565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611abb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ae29190810190614c20565b9150915080611b455760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190614925565b825114611c105760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d5565b60208201516001600160a01b031615611c865760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d5565b5f80611c95846040015161333f565b91509150818714611d025760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d5565b9695505050505050565b611d16815f613517565b50565b5f9182525f805160206150ec833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611dda57611d9a816001614d08565b611da590600861490e565b5081515f90839083908110611dbc57611dbc614d1b565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6004811015611e3d57611df1816003614d08565b611dfc90600861490e565b6001901c60f81b82611e0f836002614a5a565b81518110611e1f57611e1f614d1b565b60200101906001600160f81b03191690815f1a905350600101611ddd565b505f5b6020811015611e9f57611e5481601f614d08565b611e5f90600861490e565b86901c60f81b82611e71836006614a5a565b81518110611e8157611e81614d1b565b60200101906001600160f81b03191690815f1a905350600101611e40565b505f5b6008811015611f0a57611eb6816007614d08565b611ec190600861490e565b6001600160401b038616901c60f81b82611edc836026614a5a565b81518110611eec57611eec614d1b565b60200101906001600160f81b03191690815f1a905350600101611ea2565b505f5b6008811015611f7557611f21816007614d08565b611f2c90600861490e565b6001600160401b038516901c60f81b82611f4783602e614a5a565b81518110611f5757611f57614d1b565b60200101906001600160f81b03191690815f1a905350600101611f0d565b5090505b9392505050565b611f88613771565b611d16816137bc565b611f9961460e565b5f805160206150ac8339815191525f611fb184612379565b90505f80611fc28360400151612da3565b9150915080156120275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d5565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115612059576120596147c1565b600581111561206a5761206a6147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156120f1576120f16147c1565b148061210f575060018251600581111561210d5761210d6147c1565b145b61216e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d5565b600382516005811115612183576121836147c1565b0361219057506004612194565b5060055b6020808301515f908152600988019091526040812055818160058111156121bd576121bd6147c1565b908160058111156121d0576121d06147c1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612204576122046147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156122cf576122cf6147c1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612350575f80fd5b505af1158015611118573d5f803e3d5ffd5b6123756001600160a01b03831682613828565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206150ac8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124159190810190614c20565b915091508061247c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d5565b82548251146124df5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d5565b60208201516001600160a01b0316156125525760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d5565b509392505050565b5f805f835160361461257e5760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156125cd57612595816001614d08565b6125a090600861490e565b61ffff168682815181106125b6576125b6614d1b565b016020015160f81c901b9190911790600101612581565b5061ffff8116156125f05760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561264b57612607816003614d08565b61261290600861490e565b63ffffffff1687612624836002614a5a565b8151811061263457612634614d1b565b016020015160f81c901b91909117906001016125f3565b5063ffffffff81166003146126725760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156126c75761268981601f614d08565b61269490600861490e565b886126a0836006614a5a565b815181106126b0576126b0614d1b565b016020015160f81c901b9190911790600101612675565b505f805b6008811015612726576126df816007614d08565b6126ea90600861490e565b6001600160401b0316896126ff836026614a5a565b8151811061270f5761270f614d1b565b016020015160f81c901b91909117906001016126cb565b505f805b60088110156127855761273e816007614d08565b61274990600861490e565b6001600160401b03168a61275e83602e614a5a565b8151811061276e5761276e614d1b565b016020015160f81c901b919091179060010161272a565b5091989097509095509350505050565b61279d61460e565b5f8281525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156127eb576127eb6147c1565b60058111156127fc576127fc6147c1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612884576128846147c1565b146128e05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d5565b60408101516001600160a01b0316336001600160a01b03161461295a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d5565b6129678160a00151611d0c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156129ab576129ab6147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612a7785612a71816119ee565b5f611d61565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612aa690859060040161495e565b6020604051808303815f875af1158015612ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae69190614925565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f805160206150cc833981519152805460011901612b6f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061506c833981519152906001600160401b0316612bc1604086016020870161474d565b6001600160401b03161015612c305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105d5565b6003810154612c426020860186614e11565b61ffff1610158015612c665750612710612c5f6020860186614e11565b61ffff1611155b612c825760405162461bcd60e51b81526004016105d590614e2c565b8054831015612ce55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105d5565b8060010154831115612d4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105d5565b825f612d5782610c54565b90505f612d6488836138bb565b5f81815260058601602052604090209091508790612d828282614e77565b509098975050505050505050565b60015f805160206150cc83398151915255565b5f808251602714612dc65760405162461bcd60e51b81526004016105d590614d2f565b5f805b6002811015612e1557612ddd816001614d08565b612de890600861490e565b61ffff16858281518110612dfe57612dfe614d1b565b016020015160f81c901b9190911790600101612dc9565b5061ffff811615612e385760405162461bcd60e51b81526004016105d590614d78565b5f805b6004811015612e9357612e4f816003614d08565b612e5a90600861490e565b63ffffffff1686612e6c836002614a5a565b81518110612e7c57612e7c614d1b565b016020015160f81c901b9190911790600101612e3b565b5063ffffffff8116600214612eba5760405162461bcd60e51b81526004016105d590614dbb565b5f805b6020811015612f0f57612ed181601f614d08565b612edc90600861490e565b87612ee8836006614a5a565b81518110612ef857612ef8614d1b565b016020015160f81c901b9190911790600101612ebd565b505f86602681518110612f2457612f24614d1b565b016020015191976001600160f81b03199092161515965090945050505050565b5f612f4d612b3e565b5f8051602061506c8339815191525f612f6584610c54565b90505f612f718761190f565b9050600281516005811115612f8857612f886147c1565b14612fe75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d5565b612ff082613df5565b5f828260a001516130019190614a3a565b60048501546060840151919250613023916001600160401b03909116906148e3565b6001600160401b0316816001600160401b031611156130a25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105d5565b6130ac8882611d19565b5f6130b6896119ee565b90505f89826040516020016130e292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61311c8d8688611d61565b6040518263ffffffff1660e01b8152600401613138919061495e565b6020604051808303815f875af1158015613154573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131789190614925565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613200576132006147c1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f7960015f805160206150cc83398151915255565b5f808251602e146133625760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156133b157613379816001614d08565b61338490600861490e565b61ffff1685828151811061339a5761339a614d1b565b016020015160f81c901b9190911790600101613365565b5061ffff8116156133d45760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561342f576133eb816003614d08565b6133f690600861490e565b63ffffffff1686613408836002614a5a565b8151811061341857613418614d1b565b016020015160f81c901b91909117906001016133d7565b5063ffffffff81166004146134565760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156134ab5761346d81601f614d08565b61347890600861490e565b87613484836006614a5a565b8151811061349457613494614d1b565b016020015160f81c901b9190911790600101613459565b505f805b600881101561350a576134c3816007614d08565b6134ce90600861490e565b6001600160401b0316886134e3836026614a5a565b815181106134f3576134f3614d1b565b016020015160f81c901b91909117906001016134af565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150ac8339815191529142919015806135fd5750600283015481516135f9916001600160401b031690614a5a565b8210155b15613623576001600160401b038516606082015281815260408101516020820152613642565b84816060018181516136359190614a3a565b6001600160401b03169052505b60608101516136529060646148e3565b602082015160028501546001600160401b03929092169161367d9190600160401b900460ff1661490e565b10156136e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105d5565b831561370a57846001600160401b0316816040018181516137029190614a5a565b905250613729565b846001600160401b0316816040018181516137259190614d08565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137ba57604051631afcd79f60e31b815260040160405180910390fd5b565b6137c4613771565b6137cd81613e00565b611d16608082013560a08301356137ea60e0850160c0860161474d565b6137fb610100860160e08701614e11565b61ffff1661381161012087016101008801614ecd565b61382361014088016101208901614eed565b613e21565b8047101561384b5760405163cd78605960e01b81523060048201526024016105d5565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613894576040519150601f19603f3d011682016040523d82523d5f602084013e613899565b606091505b5050905080610d0157604051630a12f52160e11b815260040160405180910390fd5b5f5f805160206150ac833981519152426138db604086016020870161474d565b6001600160401b03161161394d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105d5565b61395d604085016020860161474d565b6001600160401b03166139736202a30042614a5a565b116139e65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105d5565b8335613a3e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d5565b83355f90815260098201602052604090205415613aae5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d5565b613abb6040850185614f08565b9050603014613b225760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d5565b613b2b83613df5565b5f80613bc56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b70919061474d565b6001600160401b03168152602001613b8b60408a018a614f08565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614065565b5f82815260078601602052604090209193509150613be38282614f95565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c1090859060040161495e565b6020604051808303815f875af1158015613c2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c509190614925565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613cd257613cd26147c1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613dc791908e01908e0161474d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611d16816001613517565b613e08613771565b613e1061440a565b613e1861441a565b611d1681614422565b613e29613771565b5f8051602061506c83398151915283613e955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105d5565b612710841115613eb75760405162461bcd60e51b81526004016105d590614e2c565b85871115613f1f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105d5565b5f8360ff1611613f8c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105d5565b600a60ff84161115613ffe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105d5565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140cf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561414657614106816001614d08565b61411190600861490e565b5081515f9083908390811061412857614128614d1b565b60200101906001600160f81b03191690815f1a9053506001016140f2565b505f5b60048110156141a45761415d816003614d08565b61416890600861490e565b505f82614176836002614a5a565b8151811061418657614186614d1b565b60200101906001600160f81b03191690815f1a905350600101614149565b505f5b602081101561420157845181602081106141c3576141c3614d1b565b1a60f81b826141d3836006614a5a565b815181106141e3576141e3614d1b565b60200101906001600160f81b03191690815f1a9053506001016141a7565b505f5b6020811015614261578460200151816020811061422357614223614d1b565b1a60f81b82614233836026614a5a565b8151811061424357614243614d1b565b60200101906001600160f81b03191690815f1a905350600101614204565b505f5b60088110156142d557614278816007614d08565b61428390600861490e565b60ff1685604001516001600160401b0316901c60f81b828260466142a79190614a5a565b815181106142b7576142b7614d1b565b60200101906001600160f81b03191690815f1a905350600101614264565b505f5b603081101561434057846080015181815181106142f7576142f7614d1b565b01602001516001600160f81b0319168261431283604e614a5a565b8151811061432257614322614d1b565b60200101906001600160f81b03191690815f1a9053506001016142d8565b505f5b60088110156143b257614357816007614d08565b61436290600861490e565b60608601516001600160401b0390811691161c60f81b8261438483607e614a5a565b8151811061439457614394614d1b565b60200101906001600160f81b03191690815f1a905350600101614343565b506002816040516143c39190615050565b602060405180830381855afa1580156143de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144019190614925565b94909350915050565b614412613771565b6137ba6145cf565b6137ba613771565b61442a613771565b80355f805160206150ac83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146144766080840160608501614ecd565b60ff1611156144e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105d5565b5f6144f46080840160608501614ecd565b60ff161161455c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105d5565b61456c6080830160608401614ecd565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561459d606083016040840161474d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612d90613771565b5080546145e390614a6d565b5f825580601f106145f2575050565b601f0160209004905f5260205f2090810190611d169190614652565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614666575f8155600101614653565b5090565b8015158114611d16575f80fd5b803563ffffffff8116811461468a575f80fd5b919050565b5f805f606084860312156146a1575f80fd5b8335925060208401356146b38161466a565b91506146c160408501614677565b90509250925092565b5f602082840312156146da575f80fd5b5035919050565b5f61014082840312156146f2575f80fd5b50919050565b5f60208284031215614708575f80fd5b611f7982614677565b5f8060408385031215614722575f80fd5b61472b83614677565b946020939093013593505050565b6001600160401b0381168114611d16575f80fd5b5f6020828403121561475d575f80fd5b8135611f7981614739565b5f80828403606081121561477a575f80fd5b83356001600160401b0381111561478f575f80fd5b8401606081870312156147a0575f80fd5b92506040601f19820112156147b3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147f957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161482160408401826001600160a01b03169052565b50606083015161483c60608401826001600160401b03169052565b50608083015161485760808401826001600160401b03169052565b5060a083015161487260a08401826001600160401b03169052565b5060c083015161488d60c08401826001600160401b03169052565b5060e08301516148a860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148a8576148a86148af565b6001600160401b03818116838216028082169190828114614906576149066148af565b505092915050565b8082028115828204841417610c6457610c646148af565b5f60208284031215614935575f80fd5b5051919050565b5f5b8381101561495657818101518382015260200161493e565b50505f910152565b602081525f825180602084015261497c81604085016020870161493c565b601f01601f19169190910160400192915050565b5f826149aa57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156148a8576148a86148af565b80820180821115610c6457610c646148af565b600181811c90821680614a8157607f821691505b6020821081036146f257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614af881614a6d565b806020870152604060018084165f8114614b195760018114614b3557614b62565b60ff19851660408a0152604084151560051b8a01019550614b62565b895f5260205f205f5b85811015614b595781548b8201860152908301908801614b3e565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b8b57614b8b6148af565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bcb57614bcb614b95565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bf957614bf9614b95565b604052919050565b6001600160a01b0381168114611d16575f80fd5b805161468a8161466a565b5f8060408385031215614c31575f80fd5b82516001600160401b0380821115614c47575f80fd5b9084019060608287031215614c5a575f80fd5b614c62614ba9565b82518152602080840151614c7581614c01565b82820152604084015183811115614c8a575f80fd5b80850194505087601f850112614c9e575f80fd5b835183811115614cb057614cb0614b95565b614cc2601f8201601f19168301614bd1565b93508084528882828701011115614cd7575f80fd5b614ce68183860184880161493c565b50826040830152819550614cfb818801614c15565b9450505050509250929050565b81810381811115610c6457610c646148af565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611d16575f80fd5b5f60208284031215614e21575f80fd5b8135611f7981614e02565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e8281614e02565b61ffff8116905081548161ffff1982161783556020840135614ea381614739565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614edd575f80fd5b813560ff81168114611f79575f80fd5b5f60208284031215614efd575f80fd5b8135611f7981614c01565b5f808335601e19843603018112614f1d575f80fd5b8301803591506001600160401b03821115614f36575f80fd5b602001915036819003821315614f4a575f80fd5b9250929050565b601f821115610d0157805f5260205f20601f840160051c81016020851015614f765750805b601f840160051c820191505b8181101561111a575f8155600101614f82565b81516001600160401b03811115614fae57614fae614b95565b614fc281614fbc8454614a6d565b84614f51565b602080601f831160018114614ff5575f8415614fde5750858301515b5f19600386901b1c1916600185901b178555611118565b5f85815260208120601f198616915b8281101561502357888601518255948401946001909101908401615004565b508582101561504057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f825161506181846020870161493c565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,6 +370,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) } +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) NATIVEMINTER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "NATIVE_MINTER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + // UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. // // Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 721c80a9a..f08264082 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -6,6 +6,8 @@ pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; +import {INativeMinter} from + "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; @@ -24,6 +26,9 @@ contract NativeTokenStakingManager is { using Address for address payable; + INativeMinter public constant NATIVE_MINTER = + INativeMinter(0x0200000000000000000000000000000000000001); + constructor(ICMInitializable init) { if (init == ICMInitializable.Disallowed) { _disableInitializers(); @@ -85,6 +90,6 @@ contract NativeTokenStakingManager is // solhint-disable-next-line no-empty-blocks function _reward(address account, uint256 amount) internal virtual override { - // TODO: call the native minter precompile to mint `amount` for `account` + NATIVE_MINTER.mintNativeCoin(account, amount); } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 9dca36b01..33527bbe4 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -173,9 +173,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _completeEndValidation(messageIndex); - _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); - delete $._redeemableValidatorRewards[validator.owner]; + if (validator.status == ValidatorStatus.Completed) { + _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); + delete $._redeemableValidatorRewards[validator.owner]; + } + // We unlock the state whether the validation period is completed or invalidated. _unlock(validator.owner, weightToValue(validator.startingWeight)); } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 72634d056..4a7ebdb9a 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -30,7 +30,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ERC20TokenStakingManager public app; IERC20Mintable public token; - ExampleRewardCalculator public rewardCalculator; function setUp() public virtual { // Construct the object under test diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 80a8dfc9b..1941b7eb3 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -18,6 +18,8 @@ import { import {IRewardCalculator} from "../interfaces/IRewardCalculator.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"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks @@ -27,6 +29,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function setUp() public virtual { // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -40,25 +43,13 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - rewardCalculator: IRewardCalculator(new ExampleRewardCalculator(DEFAULT_REWARD_RATE)) + rewardCalculator: rewardCalculator }) ); validatorManager = app; posValidatorManager = app; } - function testCompleteEndValidation() public override { - // TODO: get native token staking rewards working, then remove this - // method and let the implementation in PosValidatorManagerTests do the - // test, and remove the `virtual` modifier from that implementation. - } - - function testCompleteEndDelegation() public override { - // TODO: get native token staking rewards working, then remove this - // method and let the implementation in PosValidatorManagerTests do the - // test, and remove the `virtual` modifier from that implementation. - } - function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("zero delegation fee")); @@ -209,7 +200,21 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } - function _expectRewardIssuance(address account, uint256 amount) internal override {} + function _expectRewardIssuance(address account, uint256 amount) internal override { + vm.mockCall( + address(app.NATIVE_MINTER()), + abi.encodeCall(INativeMinter.mintNativeCoin, (account, amount)), + "" + ); + // empty calldata implies the receive function will be called: + vm.mockCall({ + callee: account, + msgValue: amount, + data: "", // implies receive() + returnData: "" + }); + vm.deal(account, account.balance + amount); + } function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 9759d1ec4..dee49c225 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -5,6 +5,7 @@ pragma solidity 0.8.25; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import {PoSValidatorRequirements} from "../interfaces/IPoSValidatorManager.sol"; @@ -33,6 +34,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; + ExampleRewardCalculator public rewardCalculator; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); @@ -499,7 +501,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorManager.resendEndValidatorMessage(validationID); } - function testCompleteEndDelegation() public virtual { + function testCompleteEndDelegation() public { uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; uint256 registrationExpiry = @@ -540,14 +542,31 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator = DEFAULT_DELEGATOR_ADDRESS; uint256 balanceBefore = _getStakeAssetBalance(delegator); - uint256 expectedReward = _weightToValue(DEFAULT_DELEGATOR_WEIGHT) * DEFAULT_REWARD_RATE - * registrationDuration / 10000 / SECONDS_IN_YEAR; + uint256 expectedReward = rewardCalculator.calculateReward( + _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + uint64(registrationExpiry), + 0, + 0 + ); _expectStakeUnlock(delegator, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); _expectRewardIssuance(delegator, expectedReward); - _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); + _setUpCompleteEndDelegation({ + validationID: validationID, + delegationID: delegationID, + delegator: delegator, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedReward: expectedReward, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); - uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; + uint256 balanceAfter = _getStakeAssetBalance(delegator); + vm.assertEq(balanceAfter, balanceAfter); + vm.assertEq(expectedReward, expectedReward); + uint256 balanceChange = balanceAfter - balanceBefore; require( balanceChange == _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedReward, "delegator should have received their stake back and been rewarded" @@ -695,7 +714,22 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation({ + validationID: validationID, + delegationID: delegationID1, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedReward: rewardCalculator.calculateReward( + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + 0, + 0 + ), + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 4 + }); } function testCompleteEndValidation() public virtual override { @@ -863,6 +897,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _setUpCompleteEndDelegation( bytes32 validationID, bytes32 delegationID, + address delegator, + uint256 delegatorWeight, + uint256 expectedReward, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -874,6 +911,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(delegationID, validationID, expectedNonce); + _expectStakeUnlock(delegator, delegatorWeight); + _expectRewardIssuance(delegator, expectedReward); posValidatorManager.completeEndDelegation(0, delegationID); assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); return delegationID; From 44d8097d003373460d65c7dddaff7a43beceede3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:01:03 -0400 Subject: [PATCH 15/36] Updates and fixes --- .../ERC20TokenStakingManager.go | 35 +--- .../ExampleRewardCalculator.go | 59 +++++-- .../NativeTokenStakingManager.go | 35 +--- .../PoAValidatorManager.go | 2 +- contracts/staking/ExampleRewardCalculator.sol | 20 ++- contracts/staking/PoSValidatorManager.sol | 77 +++++---- contracts/staking/ValidatorManager.sol | 9 +- .../staking/interfaces/IRewardCalculator.sol | 6 +- .../tests/ExamplesRewardCalculatorTests.t.sol | 29 +++- .../NativeTokenStakingManagerTests.t.sol | 1 + .../tests/PoSValidatorManagerTests.t.sol | 161 +++++++++++------- .../staking/tests/ValidatorManagerTests.t.sol | 24 ++- 12 files changed, 252 insertions(+), 206 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6bf7209e4..205e65aa2 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -75,8 +75,8 @@ 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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155ce3803806155ce83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154818061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614968565b61036a565b005b61015f61016f3660046149a3565b610892565b6101b26101823660046149a3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed3660046149a3565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149ce565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a0c565b610b57565b61015f61025a366004614a25565b610bf3565b6101b261026d366004614a61565b610dc3565b6101f26102803660046149a3565b610ddc565b61015f610293366004614968565b610df0565b61015f6102a6366004614a25565b61100e565b6101b26102b9366004614a7c565b611272565b6101b26102cc366004614a9c565b611285565b61015f6102df366004614a0c565b6112b1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f6103203660046149a3565b61146e565b61015f6103333660046149a3565b6116f4565b6101cd601481565b61035361034e3660046149a3565b611803565b6040516101bc9190614b11565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153d5833981519152949193919290829060ff1660048111156103d2576103d2614afd565b60048111156103e3576103e3614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f83611803565b90504260028351600481111561047757610477614afd565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153f58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153f58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118e2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614afd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611964565b6001600160401b03169050605060ff168460c001518461067e9190614bff565b6106889190614c1f565b6001600160401b031661069c826064614c4a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dc3565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c61565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614afd565b03610799576107998460600151611c00565b5f84606001518460a001516107ae9190614bff565b90506107ba8682611c0d565b5f6005600160991b0163ee5b48eb6107d3898686611c55565b6040518263ffffffff1660e01b81526004016107ef9190614c9a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c61565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff1660058111156108e0576108e0614afd565b60058111156108f1576108f1614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614afd565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c55565b6040518263ffffffff1660e01b8152600401610a1c9190614c9a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c61565b50505050565b5f610a7264e8d4a5100083614ccc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e72565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153d58339815191525f610b6f83611e90565b9050600481516005811115610b8657610b86614afd565b03610bd4576040808201516001600160a01b0381165f908152600a85016020529190912054610bb59190612203565b6040808201516001600160a01b03165f908152600a8401602052908120555b610bee8160400151610be98360600151610dc3565b612279565b505050565b5f805160206153d58339815191525f610c0b8461229c565b90505f80610c1c836040015161247d565b50915091505f610c2b83611803565b9050816001600160401b031681608001516001600160401b03161015610c635760405162461bcd60e51b81526004016104c090614ceb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ca85760405162461bcd60e51b81526004016104c090614d2d565b60015f87815260068701602052604090205460ff166004811115610cce57610cce614afd565b14610d375760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c4a565b5f610de682611803565b60a0015192915050565b5f805160206153d58339815191525f610e08856126b8565b5f86815260058401602052604090205460c0820151919250610e3a91620100009091046001600160401b031690614d76565b6001600160401b03168160e001516001600160401b03161015610ebb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611007575f610ecc8685611964565b9050605060ff168260c001518360e00151610ee79190614bff565b610ef19190614c1f565b6001600160401b0316610f05826064614c1f565b6001600160401b031610611005578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f468460600151610dc3565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190614c61565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fff908490614d96565b90915550505b505b5050505050565b5f805160206153d58339815191525f6110268461229c565b90505f80611037836040015161247d565b50915091505f61104683611803565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561108057611080614afd565b600481111561109157611091614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111305760405162461bcd60e51b81526004016104c090614ceb565b826001600160401b03168160e001516001600160401b031611156111665760405162461bcd60e51b81526004016104c090614d2d565b60038151600481111561117b5761117b614afd565b146111cf5760405162461bcd60e51b815260206004820152603160248201525f805160206153f58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546112059190612203565b856009015f8881526020019081526020015f205f90556112308160200151610be98360600151610dc3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61127e833384612a61565b9392505050565b5f61128e612e5f565b611299848484612e96565b905061127e60015f8051602061543583398151915255565b5f805160206154158339815191525f6112c98361229c565b90505f806112da83604001516130cf565b915091508061133c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135690614da9565b9050118015611388575060015f83815260088601602052604090205460ff16600581111561138657611386614afd565b145b6113a45760405162461bcd60e51b81526004016104c090614de1565b5f82815260078501602052604081206113bc916148b0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153d583398151915293929190829060ff1660048111156114cf576114cf614afd565b60048111156114e0576114e0614afd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156757611567614afd565b1480611585575060038151600481111561158357611583614afd565b145b6115d95760405162461bcd60e51b815260206004820152603260248201525f805160206153f5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e78260400151611803565b905080608001516001600160401b03165f0361166b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611698846040015184608001518560a00151611c55565b6040518263ffffffff1660e01b81526004016116b49190614c9a565b6020604051808303815f875af11580156116d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110079190614c61565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061541583398151915292919061173c90614da9565b905011801561176e575060015f83815260088301602052604090205460ff16600581111561176c5761176c614afd565b145b61178a5760405162461bcd60e51b81526004016104c090614de1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117c39190600401614e28565b6020604051808303815f875af11580156117df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bee9190614c61565b61180b6148e7565b5f8281525f805160206154558339815191526020526040908190208151610100810190925280545f80516020615415833981519152929190829060ff16600581111561185957611859614afd565b600581111561186a5761186a614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154558339815191526020526040812060030180545f80516020615415833981519152916001600160401b03909116908361192583614eb2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d69190810190614f4e565b9150915080611a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa09190614c61565b825114611b045760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b7a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b898460400151613270565b91509150818714611bf65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c0a815f613448565b50565b5f9182525f80516020615455833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cce57611c8e816001615036565b611c99906008614c4a565b5081515f90839083908110611cb057611cb0615049565b60200101906001600160f81b03191690815f1a905350600101611c7a565b505f5b6004811015611d3157611ce5816003615036565b611cf0906008614c4a565b6001901c60f81b82611d03836002614d96565b81518110611d1357611d13615049565b60200101906001600160f81b03191690815f1a905350600101611cd1565b505f5b6020811015611d9357611d4881601f615036565b611d53906008614c4a565b86901c60f81b82611d65836006614d96565b81518110611d7557611d75615049565b60200101906001600160f81b03191690815f1a905350600101611d34565b505f5b6008811015611dfe57611daa816007615036565b611db5906008614c4a565b6001600160401b038616901c60f81b82611dd0836026614d96565b81518110611de057611de0615049565b60200101906001600160f81b03191690815f1a905350600101611d96565b505f5b6008811015611e6957611e15816007615036565b611e20906008614c4a565b6001600160401b038516901c60f81b82611e3b83602e614d96565b81518110611e4b57611e4b615049565b60200101906001600160f81b03191690815f1a905350600101611e01565b50949350505050565b611e7a6136a2565b611e83826136ed565b611e8c81613759565b5050565b611e986148e7565b5f805160206154158339815191525f611eb08461229c565b90505f80611ec183604001516130cf565b915091508015611f265760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5857611f58614afd565b6005811115611f6957611f69614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ff057611ff0614afd565b148061200e575060018251600581111561200c5761200c614afd565b145b61206d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561208257612082614afd565b0361208f57506004612093565b5060055b6020808301515f908152600988019091526040812055818160058111156120bc576120bc614afd565b908160058111156120cf576120cf614afd565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561210357612103614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121ce576121ce614afd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153b583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561225e575f80fd5b505af1158015612270573d5f803e3d5ffd5b50505050505050565b5f805160206153b583398151915254611e8c906001600160a01b031683836137fa565b60408051606080820183525f8083526020830181905292820152905f805160206154158339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612311573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123389190810190614f4e565b915091508061239f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146124025760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124755760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124a15760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156124f0576124b8816001615036565b6124c3906008614c4a565b61ffff168682815181106124d9576124d9615049565b016020015160f81c901b91909117906001016124a4565b5061ffff8116156125135760405162461bcd60e51b81526004016104c0906150a6565b5f805b600481101561256e5761252a816003615036565b612535906008614c4a565b63ffffffff1687612547836002614d96565b8151811061255757612557615049565b016020015160f81c901b9190911790600101612516565b5063ffffffff81166003146125955760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156125ea576125ac81601f615036565b6125b7906008614c4a565b886125c3836006614d96565b815181106125d3576125d3615049565b016020015160f81c901b9190911790600101612598565b505f805b600881101561264957612602816007615036565b61260d906008614c4a565b6001600160401b031689612622836026614d96565b8151811061263257612632615049565b016020015160f81c901b91909117906001016125ee565b505f805b60088110156126a857612661816007615036565b61266c906008614c4a565b6001600160401b03168a61268183602e614d96565b8151811061269157612691615049565b016020015160f81c901b919091179060010161264d565b5091989097509095509350505050565b6126c06148e7565b5f8281525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff16600581111561270e5761270e614afd565b600581111561271f5761271f614afd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a7576127a7614afd565b146128035760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461287d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61288a8160a00151611c00565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128ce576128ce614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61299a85612994816118e2565b5f611c55565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c9908590600401614c9a565b6020604051808303815f875af11580156129e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a099190614c61565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a6a612e5f565b5f805160206153d58339815191525f612a856101ed85613859565b90505f612a9187611803565b9050600281516005811115612aa857612aa8614afd565b14612b075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b108261387c565b5f828260a00151612b219190614d76565b60048501546060840151919250612b43916001600160401b0390911690614c1f565b6001600160401b0316816001600160401b03161115612bc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bcc8882611c0d565b5f612bd6896118e2565b90505f8982604051602001612c0292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c3c8d8688611c55565b6040518263ffffffff1660e01b8152600401612c589190614c9a565b6020604051808303815f875af1158015612c74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c989190614c61565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d2057612d20614afd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127e60015f8051602061543583398151915255565b5f80516020615435833981519152805460011901612e9057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153d5833981519152906001600160401b0316612ee26040860160208701614a61565b6001600160401b03161015612f515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f63602086018661513f565b61ffff1610158015612f875750612710612f80602086018661513f565b61ffff1611155b612fa35760405162461bcd60e51b81526004016104c09061515a565b80548310156130065760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561306d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307784613859565b90505f61308382610a62565b90505f6130908883613887565b5f818152600586016020526040902090915087906130ae82826151a5565b509098975050505050505050565b60015f8051602061543583398151915255565b5f8082516027146130f25760405162461bcd60e51b81526004016104c09061505d565b5f805b600281101561314157613109816001615036565b613114906008614c4a565b61ffff1685828151811061312a5761312a615049565b016020015160f81c901b91909117906001016130f5565b5061ffff8116156131645760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156131bf5761317b816003615036565b613186906008614c4a565b63ffffffff1686613198836002614d96565b815181106131a8576131a8615049565b016020015160f81c901b9190911790600101613167565b5063ffffffff81166002146131e65760405162461bcd60e51b81526004016104c0906150e9565b5f805b602081101561323b576131fd81601f615036565b613208906008614c4a565b87613214836006614d96565b8151811061322457613224615049565b016020015160f81c901b91909117906001016131e9565b505f8660268151811061325057613250615049565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132935760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156132e2576132aa816001615036565b6132b5906008614c4a565b61ffff168582815181106132cb576132cb615049565b016020015160f81c901b9190911790600101613296565b5061ffff8116156133055760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156133605761331c816003615036565b613327906008614c4a565b63ffffffff1686613339836002614d96565b8151811061334957613349615049565b016020015160f81c901b9190911790600101613308565b5063ffffffff81166004146133875760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156133dc5761339e81601f615036565b6133a9906008614c4a565b876133b5836006614d96565b815181106133c5576133c5615049565b016020015160f81c901b919091179060010161338a565b505f805b600881101561343b576133f4816007615036565b6133ff906008614c4a565b6001600160401b031688613414836026614d96565b8151811061342457613424615049565b016020015160f81c901b91909117906001016133e0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061541583398151915291429190158061352e57506002830154815161352a916001600160401b031690614d96565b8210155b15613554576001600160401b038516606082015281815260408101516020820152613573565b84816060018181516135669190614d76565b6001600160401b03169052505b6060810151613583906064614c1f565b602082015160028501546001600160401b0392909216916135ae9190600160401b900460ff16614c4a565b10156136125760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363b57846001600160401b0316816040018181516136339190614d96565b90525061365a565b846001600160401b0316816040018181516136569190615036565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136eb57604051631afcd79f60e31b815260040160405180910390fd5b565b6136f56136a2565b6136fe81613dc1565b611c0a608082013560a083013561371b60e0850160c08601614a61565b61372c610100860160e0870161513f565b61ffff16613742610120870161010088016151fb565b6137546101408801610120890161521b565b613de2565b6137616136a2565b5f805160206153b58339815191526001600160a01b0382166137da5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bee91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614026565b5f610a72825f805160206153b5833981519152546001600160a01b031690614087565b611c0a816001613448565b5f5f80516020615415833981519152426138a76040860160208701614a61565b6001600160401b0316116139195760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139296040850160208601614a61565b6001600160401b031661393f6202a30042614d96565b116139b25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a0a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a7a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a876040850185615236565b9050603014613aee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af78361387c565b5f80613b916040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b3c9190614a61565b6001600160401b03168152602001613b5760408a018a615236565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e9565b5f82815260078601602052604090209193509150613baf82826152c3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bdc908590600401614c9a565b6020604051808303815f875af1158015613bf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c1c9190614c61565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9e57613c9e614afd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d9391908e01908e01614a61565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc96136a2565b613dd161458e565b613dd961459e565b611c0a816145a6565b613dea6136a2565b5f805160206153d583398151915283613e565760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e785760405162461bcd60e51b81526004016104c09061515a565b85871115613ee05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f4d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fbf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61403a6001600160a01b03841683614753565b905080515f1415801561405e57508080602001905181019061405c919061537e565b155b15610bee57604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f19190614c61565b90506141086001600160a01b038516333086614760565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561414c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141709190614c61565b90508181116141d65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141e08282615036565b95945050505050565b5f60608260800151516030146142535760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ca5761428a816001615036565b614295906008614c4a565b5081515f908390839081106142ac576142ac615049565b60200101906001600160f81b03191690815f1a905350600101614276565b505f5b6004811015614328576142e1816003615036565b6142ec906008614c4a565b505f826142fa836002614d96565b8151811061430a5761430a615049565b60200101906001600160f81b03191690815f1a9053506001016142cd565b505f5b6020811015614385578451816020811061434757614347615049565b1a60f81b82614357836006614d96565b8151811061436757614367615049565b60200101906001600160f81b03191690815f1a90535060010161432b565b505f5b60208110156143e557846020015181602081106143a7576143a7615049565b1a60f81b826143b7836026614d96565b815181106143c7576143c7615049565b60200101906001600160f81b03191690815f1a905350600101614388565b505f5b6008811015614459576143fc816007615036565b614407906008614c4a565b60ff1685604001516001600160401b0316901c60f81b8282604661442b9190614d96565b8151811061443b5761443b615049565b60200101906001600160f81b03191690815f1a9053506001016143e8565b505f5b60308110156144c4578460800151818151811061447b5761447b615049565b01602001516001600160f81b0319168261449683604e614d96565b815181106144a6576144a6615049565b60200101906001600160f81b03191690815f1a90535060010161445c565b505f5b6008811015614536576144db816007615036565b6144e6906008614c4a565b60608601516001600160401b0390811691161c60f81b8261450883607e614d96565b8151811061451857614518615049565b60200101906001600160f81b03191690815f1a9053506001016144c7565b506002816040516145479190615399565b602060405180830381855afa158015614562573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145859190614c61565b94909350915050565b6145966136a2565b6136eb614799565b6136eb6136a2565b6145ae6136a2565b80355f8051602061541583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145fa60808401606085016151fb565b60ff1611156146675760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61467860808401606085016151fb565b60ff16116146e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146f060808301606084016151fb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147216060830160408401614a61565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127e83835f6147a1565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613827565b6130bc6136a2565b6060814710156147c65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147e19190615399565b5f6040518083038185875af1925050503d805f811461481b576040519150601f19603f3d011682016040523d82523d5f602084013e614820565b606091505b5091509150611bf68683836060826148405761483b82614887565b61127e565b815115801561485757506001600160a01b0384163b155b1561488057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061127e565b8051156148975780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148bc90614da9565b5f825580601f106148cb575050565b601f0160209004905f5260205f2090810190611c0a919061492b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561493f575f815560010161492c565b5090565b8015158114611c0a575f80fd5b803563ffffffff81168114614963575f80fd5b919050565b5f805f6060848603121561497a575f80fd5b83359250602084013561498c81614943565b915061499a60408501614950565b90509250925092565b5f602082840312156149b3575f80fd5b5035919050565b6001600160a01b0381168114611c0a575f80fd5b5f808284036101608112156149e1575f80fd5b610140808212156149f0575f80fd5b8493508301359050614a01816149ba565b809150509250929050565b5f60208284031215614a1c575f80fd5b61127e82614950565b5f8060408385031215614a36575f80fd5b614a3f83614950565b946020939093013593505050565b6001600160401b0381168114611c0a575f80fd5b5f60208284031215614a71575f80fd5b813561127e81614a4d565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aaf575f80fd5b84356001600160401b03811115614ac4575f80fd5b850160608188031215614ad5575f80fd5b93506040601f1982011215614ae8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b3557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5d60408401826001600160a01b03169052565b506060830151614b7860608401826001600160401b03169052565b506080830151614b9360808401826001600160401b03169052565b5060a0830151614bae60a08401826001600160401b03169052565b5060c0830151614bc960c08401826001600160401b03169052565b5060e0830151614be460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614be457614be4614beb565b6001600160401b03818116838216028082169190828114614c4257614c42614beb565b505092915050565b8082028115828204841417610a7257610a72614beb565b5f60208284031215614c71575f80fd5b5051919050565b5f5b83811015614c92578181015183820152602001614c7a565b50505f910152565b602081525f8251806020840152614cb8816040850160208701614c78565b601f01601f19169190910160400192915050565b5f82614ce657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614be457614be4614beb565b80820180821115610a7257610a72614beb565b600181811c90821680614dbd57607f821691505b602082108103614ddb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e3a81614da9565b806020870152604060018084165f8114614e5b5760018114614e7757614ea4565b60ff19851660408a0152604084151560051b8a01019550614ea4565b895f5260205f205f5b85811015614e9b5781548b8201860152908301908801614e80565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ecd57614ecd614beb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f0d57614f0d614ed7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f3b57614f3b614ed7565b604052919050565b805161496381614943565b5f8060408385031215614f5f575f80fd5b82516001600160401b0380821115614f75575f80fd5b9084019060608287031215614f88575f80fd5b614f90614eeb565b82518152602080840151614fa3816149ba565b82820152604084015183811115614fb8575f80fd5b80850194505087601f850112614fcc575f80fd5b835183811115614fde57614fde614ed7565b614ff0601f8201601f19168301614f13565b93508084528882828701011115615005575f80fd5b61501481838601848801614c78565b50826040830152819550615029818801614f43565b9450505050509250929050565b81810381811115610a7257610a72614beb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c0a575f80fd5b5f6020828403121561514f575f80fd5b813561127e81615130565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151b081615130565b61ffff8116905081548161ffff19821617835560208401356151d181614a4d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561520b575f80fd5b813560ff8116811461127e575f80fd5b5f6020828403121561522b575f80fd5b813561127e816149ba565b5f808335601e1984360301811261524b575f80fd5b8301803591506001600160401b03821115615264575f80fd5b602001915036819003821315615278575f80fd5b9250929050565b601f821115610bee57805f5260205f20601f840160051c810160208510156152a45750805b601f840160051c820191505b81811015611007575f81556001016152b0565b81516001600160401b038111156152dc576152dc614ed7565b6152f0816152ea8454614da9565b8461527f565b602080601f831160018114615323575f841561530c5750858301515b5f19600386901b1c1916600185901b178555611005565b5f85815260208120601f198616915b8281101561535157888601518255948401946001909101908401615332565b508582101561536e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561538e575f80fd5b815161127e81614943565b5f82516153aa818460208701614c78565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516155c03803806155c083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154738061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f366004614956565b610357565b005b610154610164366004614991565b6108a9565b6101a7610177366004614991565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614991565b610a79565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046149bc565b610a8f565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046149fa565b610b6e565b61015461024f366004614a13565b610bfc565b6101a7610262366004614a4f565b610dcc565b6101e7610275366004614991565b610de5565b610154610288366004614956565b610df9565b61015461029b366004614a13565b610ff3565b6101a76102ae366004614a6a565b611257565b6101a76102c1366004614a8a565b61126a565b6101546102d43660046149fa565b611296565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614991565b611453565b610154610320366004614991565b6116d9565b6101c2601481565b61034061033b366004614991565b6117ed565b6040516101b19190614aff565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c7833981519152949193919290829060ff1660048111156103bf576103bf614aeb565b60048111156103d0576103d0614aeb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61044c836117ed565b90504260028351600481111561046457610464614aeb565b146104b65760405162461bcd60e51b815260206004820152602a60248201525f805160206153e78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461051b5760405162461bcd60e51b815260206004820152603360248201525f805160206153e78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ad565b5f610525856118cc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561057257610572614aeb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003918201805467ffffffffffffffff191691909316179091555f908451600581111561065057610650614aeb565b148061066e575060048451600581111561066c5761066c614aeb565b145b1561069257505f8581526009870160205260409020546001600160401b03166106a5565b88156106a5576106a2868961194e565b90505b8660040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106d88760600151610dcc565b60c0870151608089015160a08a01516040516001600160e01b031960e087901b16815260048101949094526001600160401b039283166024850152908216604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610754573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107789190614bd9565b5f8b815260078901602052604090205560028451600581111561079d5761079d614aeb565b036107af576107af8560600151611bea565b5f85606001518560a001516107c49190614c04565b90506107d08782611bf7565b5f6005600160991b0163ee5b48eb6107e98a8786611c3f565b6040518263ffffffff1660e01b81526004016108059190614c46565b6020604051808303815f875af1158015610821573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108459190614bd9565b604080516001600160401b038581168252888116602083015291810183905291925085169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f8051602061544783398151915260205260408082208151610100810190925280545f8051602061540783398151915293929190829060ff1660058111156108f7576108f7614aeb565b600581111561090857610908614aeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561098d5761098d614aeb565b146109f25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ad565b6005600160991b016001600160a01b031663ee5b48eb610a178584608001515f611c3f565b6040518263ffffffff1660e01b8152600401610a339190614c46565b6020604051808303815f875af1158015610a4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a739190614bd9565b50505050565b5f610a8964e8d4a5100083614c78565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ad8575080546001600160401b03808416911610155b15610af65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b218484611e5c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c78339815191525f80610b8784611e7a565b604082015191935091506001600160a01b0316610ba45750505050565b600482516005811115610bb957610bb9614aeb565b03610be2575f8181526008840160205260408082208054929055830151610be090826121f1565b505b610a738260400151610bf78460600151610dcc565b612267565b5f805160206153c78339815191525f610c148461228a565b90505f80610c25836040015161246b565b50915091505f610c34836117ed565b9050816001600160401b031681608001516001600160401b03161015610c6c5760405162461bcd60e51b81526004016104ad90614c97565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cb15760405162461bcd60e51b81526004016104ad90614cd9565b60015f87815260068701602052604090205460ff166004811115610cd757610cd7614aeb565b14610d405760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ad565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a896001600160401b03831664e8d4a51000614d22565b5f610def826117ed565b60a0015192915050565b5f805160206153c78339815191525f610e11856126a6565b5f86815260058401602052604090205460c0820151919250610e4391620100009091046001600160401b031690614d39565b6001600160401b03168160e001516001600160401b03161015610ec45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104ad565b8315610fec575f610ed5868561194e565b5f8781526009850160205260409020805467ffffffffffffffff19166001600160401b03831617905560048401546060840151919250600160401b90046001600160a01b03169063778c06b590610f2b90610dcc565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820181905260448201529181166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610fa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc69190614bd9565b5f87815260088501602052604081208054909190610fe5908490614d59565b9091555050505b5050505050565b5f805160206153c78339815191525f61100b8461228a565b90505f8061101c836040015161246b565b50915091505f61102b836117ed565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106557611065614aeb565b600481111561107657611076614aeb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111155760405162461bcd60e51b81526004016104ad90614c97565b826001600160401b03168160e001516001600160401b0316111561114b5760405162461bcd60e51b81526004016104ad90614cd9565b60038151600481111561116057611160614aeb565b146111b45760405162461bcd60e51b815260206004820152603160248201525f805160206153e78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ad565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546111ea91906121f1565b856007015f8881526020019081526020015f205f90556112158160200151610bf78360600151610dcc565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611263833384612a4f565b9392505050565b5f611273612e4d565b61127e848484612e84565b905061126360015f8051602061542783398151915255565b5f805160206154078339815191525f6112ae8361228a565b90505f806112bf83604001516130bd565b91509150806113215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ad565b5f8281526007850160205260408120805461133b90614d6c565b905011801561136d575060015f83815260088601602052604090205460ff16600581111561136b5761136b614aeb565b145b6113895760405162461bcd60e51b81526004016104ad90614da4565b5f82815260078501602052604081206113a19161489e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c783398151915293929190829060ff1660048111156114b4576114b4614aeb565b60048111156114c5576114c5614aeb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154c5761154c614aeb565b148061156a575060038151600481111561156857611568614aeb565b145b6115be5760405162461bcd60e51b815260206004820152603260248201525f805160206153e7833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104ad565b5f6115cc82604001516117ed565b905080608001516001600160401b03165f036116505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104ad565b6005600160991b016001600160a01b031663ee5b48eb61167d846040015184608001518560a00151611c3f565b6040518263ffffffff1660e01b81526004016116999190614c46565b6020604051808303815f875af11580156116b5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fec9190614bd9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540783398151915292919061172190614d6c565b9050118015611753575060015f83815260088301602052604090205460ff16600581111561175157611751614aeb565b145b61176f5760405162461bcd60e51b81526004016104ad90614da4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117a89190600401614deb565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e89190614bd9565b505050565b6117f56148d5565b5f8281525f805160206154478339815191526020526040908190208151610100810190925280545f80516020615407833981519152929190829060ff16600581111561184357611843614aeb565b600581111561185457611854614aeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154478339815191526020526040812060030180545f80516020615407833981519152916001600160401b03909116908361190f83614e75565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611999573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c09190810190614f11565b9150915080611a235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ad565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8a9190614bd9565b825114611aee5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ad565b60208201516001600160a01b031615611b645760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ad565b5f80611b73846040015161325e565b91509150818714611be05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ad565b9695505050505050565b611bf4815f613436565b50565b5f9182525f80516020615447833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb857611c78816001614ff9565b611c83906008614d22565b5081515f90839083908110611c9a57611c9a61500c565b60200101906001600160f81b03191690815f1a905350600101611c64565b505f5b6004811015611d1b57611ccf816003614ff9565b611cda906008614d22565b6001901c60f81b82611ced836002614d59565b81518110611cfd57611cfd61500c565b60200101906001600160f81b03191690815f1a905350600101611cbb565b505f5b6020811015611d7d57611d3281601f614ff9565b611d3d906008614d22565b86901c60f81b82611d4f836006614d59565b81518110611d5f57611d5f61500c565b60200101906001600160f81b03191690815f1a905350600101611d1e565b505f5b6008811015611de857611d94816007614ff9565b611d9f906008614d22565b6001600160401b038616901c60f81b82611dba836026614d59565b81518110611dca57611dca61500c565b60200101906001600160f81b03191690815f1a905350600101611d80565b505f5b6008811015611e5357611dff816007614ff9565b611e0a906008614d22565b6001600160401b038516901c60f81b82611e2583602e614d59565b81518110611e3557611e3561500c565b60200101906001600160f81b03191690815f1a905350600101611deb565b50949350505050565b611e64613690565b611e6d826136db565b611e7681613747565b5050565b611e826148d5565b5f5f8051602061540783398151915281611e9b8561228a565b90505f80611eac83604001516130bd565b915091508015611f115760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ad565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4357611f43614aeb565b6005811115611f5457611f54614aeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fdb57611fdb614aeb565b1480611ff95750600182516005811115611ff757611ff7614aeb565b145b6120585760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ad565b60038251600581111561206d5761206d614aeb565b0361207a5750600461207e565b5060055b6020808301515f908152600988019091526040812055818160058111156120a7576120a7614aeb565b908160058111156120ba576120ba614aeb565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120ee576120ee614aeb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b9576121b9614aeb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509791965090945050505050565b5f5f805160206153a783398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224c575f80fd5b505af115801561225e573d5f803e3d5ffd5b50505050505050565b5f805160206153a783398151915254611e76906001600160a01b031683836137e8565b60408051606080820183525f8083526020830181905292820152905f805160206154078339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123269190810190614f11565b915091508061238d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ad565b82548251146123f05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ad565b60208201516001600160a01b0316156124635760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ad565b509392505050565b5f805f835160361461248f5760405162461bcd60e51b81526004016104ad90615020565b5f805b60028110156124de576124a6816001614ff9565b6124b1906008614d22565b61ffff168682815181106124c7576124c761500c565b016020015160f81c901b9190911790600101612492565b5061ffff8116156125015760405162461bcd60e51b81526004016104ad90615069565b5f805b600481101561255c57612518816003614ff9565b612523906008614d22565b63ffffffff1687612535836002614d59565b815181106125455761254561500c565b016020015160f81c901b9190911790600101612504565b5063ffffffff81166003146125835760405162461bcd60e51b81526004016104ad906150ac565b5f805b60208110156125d85761259a81601f614ff9565b6125a5906008614d22565b886125b1836006614d59565b815181106125c1576125c161500c565b016020015160f81c901b9190911790600101612586565b505f805b6008811015612637576125f0816007614ff9565b6125fb906008614d22565b6001600160401b031689612610836026614d59565b815181106126205761262061500c565b016020015160f81c901b91909117906001016125dc565b505f805b60088110156126965761264f816007614ff9565b61265a906008614d22565b6001600160401b03168a61266f83602e614d59565b8151811061267f5761267f61500c565b016020015160f81c901b919091179060010161263b565b5091989097509095509350505050565b6126ae6148d5565b5f8281525f8051602061544783398151915260205260408082208151610100810190925280545f8051602061540783398151915293929190829060ff1660058111156126fc576126fc614aeb565b600581111561270d5761270d614aeb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279557612795614aeb565b146127f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ad565b60408101516001600160a01b0316336001600160a01b03161461286b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ad565b6128788160a00151611bea565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128bc576128bc614aeb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298885612982816118cc565b5f611c3f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b7908590600401614c46565b6020604051808303815f875af11580156129d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f79190614bd9565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a58612e4d565b5f805160206153c78339815191525f612a736101e285613847565b90505f612a7f876117ed565b9050600281516005811115612a9657612a96614aeb565b14612af55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ad565b612afe8261386a565b5f828260a00151612b0f9190614d39565b60048501546060840151919250612b31916001600160401b03909116906150f3565b6001600160401b0316816001600160401b03161115612bb05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104ad565b612bba8882611bf7565b5f612bc4896118cc565b90505f8982604051602001612bf092919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2a8d8688611c3f565b6040518263ffffffff1660e01b8152600401612c469190614c46565b6020604051808303815f875af1158015612c62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c869190614bd9565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0e57612d0e614aeb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126360015f8051602061542783398151915255565b5f80516020615427833981519152805460011901612e7e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c7833981519152906001600160401b0316612ed06040860160208701614a4f565b6001600160401b03161015612f3f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104ad565b6003810154612f51602086018661512d565b61ffff1610158015612f755750612710612f6e602086018661512d565b61ffff1611155b612f915760405162461bcd60e51b81526004016104ad90615148565b8054831015612ff45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104ad565b806001015483111561305b5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104ad565b5f61306584613847565b90505f61307182610a79565b90505f61307e8883613875565b5f8181526005860160205260409020909150879061309c8282615193565b509098975050505050505050565b60015f8051602061542783398151915255565b5f8082516027146130e05760405162461bcd60e51b81526004016104ad90615020565b5f805b600281101561312f576130f7816001614ff9565b613102906008614d22565b61ffff168582815181106131185761311861500c565b016020015160f81c901b91909117906001016130e3565b5061ffff8116156131525760405162461bcd60e51b81526004016104ad90615069565b5f805b60048110156131ad57613169816003614ff9565b613174906008614d22565b63ffffffff1686613186836002614d59565b815181106131965761319661500c565b016020015160f81c901b9190911790600101613155565b5063ffffffff81166002146131d45760405162461bcd60e51b81526004016104ad906150ac565b5f805b6020811015613229576131eb81601f614ff9565b6131f6906008614d22565b87613202836006614d59565b815181106132125761321261500c565b016020015160f81c901b91909117906001016131d7565b505f8660268151811061323e5761323e61500c565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132815760405162461bcd60e51b81526004016104ad90615020565b5f805b60028110156132d057613298816001614ff9565b6132a3906008614d22565b61ffff168582815181106132b9576132b961500c565b016020015160f81c901b9190911790600101613284565b5061ffff8116156132f35760405162461bcd60e51b81526004016104ad90615069565b5f805b600481101561334e5761330a816003614ff9565b613315906008614d22565b63ffffffff1686613327836002614d59565b815181106133375761333761500c565b016020015160f81c901b91909117906001016132f6565b5063ffffffff81166004146133755760405162461bcd60e51b81526004016104ad906150ac565b5f805b60208110156133ca5761338c81601f614ff9565b613397906008614d22565b876133a3836006614d59565b815181106133b3576133b361500c565b016020015160f81c901b9190911790600101613378565b505f805b6008811015613429576133e2816007614ff9565b6133ed906008614d22565b6001600160401b031688613402836026614d59565b815181106134125761341261500c565b016020015160f81c901b91909117906001016133ce565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540783398151915291429190158061351c575060028301548151613518916001600160401b031690614d59565b8210155b15613542576001600160401b038516606082015281815260408101516020820152613561565b84816060018181516135549190614d39565b6001600160401b03169052505b60608101516135719060646150f3565b602082015160028501546001600160401b03929092169161359c9190600160401b900460ff16614d22565b10156136005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ad565b831561362957846001600160401b0316816040018181516136219190614d59565b905250613648565b846001600160401b0316816040018181516136449190614ff9565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d957604051631afcd79f60e31b815260040160405180910390fd5b565b6136e3613690565b6136ec81613daf565b611bf4608082013560a083013561370960e0850160c08601614a4f565b61371a610100860160e0870161512d565b61ffff16613730610120870161010088016151e9565b61374261014088016101208901615209565b613dd0565b61374f613690565b5f805160206153a78339815191526001600160a01b0382166137c85760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104ad565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526117e891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614014565b5f610a89825f805160206153a7833981519152546001600160a01b031690614075565b611bf4816001613436565b5f5f80516020615407833981519152426138956040860160208701614a4f565b6001600160401b0316116139075760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ad565b6139176040850160208601614a4f565b6001600160401b031661392d6202a30042614d59565b116139a05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ad565b83356139f85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ad565b83355f90815260098201602052604090205415613a685760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ad565b613a756040850185615224565b9050603014613adc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ad565b613ae58361386a565b5f80613b7f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2a9190614a4f565b6001600160401b03168152602001613b4560408a018a615224565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d7565b5f82815260078601602052604090209193509150613b9d82826152b1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bca908590600401614c46565b6020604051808303815f875af1158015613be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0a9190614bd9565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8c57613c8c614aeb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8191908e01908e01614a4f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db7613690565b613dbf61457c565b613dc761458c565b611bf481614594565b613dd8613690565b5f805160206153c783398151915283613e445760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104ad565b612710841115613e665760405162461bcd60e51b81526004016104ad90615148565b85871115613ece5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104ad565b5f8360ff1611613f3b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104ad565b600a60ff84161115613fad5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104ad565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140286001600160a01b03841683614741565b905080515f1415801561404c57508080602001905181019061404a9190615370565b155b156117e857604051635274afe760e01b81526001600160a01b03841660048201526024016104ad565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140df9190614bd9565b90506140f66001600160a01b03851633308661474e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061415e9190614bd9565b90508181116141c45760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104ad565b6141ce8282614ff9565b95945050505050565b5f60608260800151516030146142415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ad565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b857614278816001614ff9565b614283906008614d22565b5081515f9083908390811061429a5761429a61500c565b60200101906001600160f81b03191690815f1a905350600101614264565b505f5b6004811015614316576142cf816003614ff9565b6142da906008614d22565b505f826142e8836002614d59565b815181106142f8576142f861500c565b60200101906001600160f81b03191690815f1a9053506001016142bb565b505f5b602081101561437357845181602081106143355761433561500c565b1a60f81b82614345836006614d59565b815181106143555761435561500c565b60200101906001600160f81b03191690815f1a905350600101614319565b505f5b60208110156143d357846020015181602081106143955761439561500c565b1a60f81b826143a5836026614d59565b815181106143b5576143b561500c565b60200101906001600160f81b03191690815f1a905350600101614376565b505f5b6008811015614447576143ea816007614ff9565b6143f5906008614d22565b60ff1685604001516001600160401b0316901c60f81b828260466144199190614d59565b815181106144295761442961500c565b60200101906001600160f81b03191690815f1a9053506001016143d6565b505f5b60308110156144b257846080015181815181106144695761446961500c565b01602001516001600160f81b0319168261448483604e614d59565b815181106144945761449461500c565b60200101906001600160f81b03191690815f1a90535060010161444a565b505f5b6008811015614524576144c9816007614ff9565b6144d4906008614d22565b60608601516001600160401b0390811691161c60f81b826144f683607e614d59565b815181106145065761450661500c565b60200101906001600160f81b03191690815f1a9053506001016144b5565b50600281604051614535919061538b565b602060405180830381855afa158015614550573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145739190614bd9565b94909350915050565b614584613690565b6136d9614787565b6136d9613690565b61459c613690565b80355f8051602061540783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145e860808401606085016151e9565b60ff1611156146555760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104ad565b5f61466660808401606085016151e9565b60ff16116146ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104ad565b6146de60808301606084016151e9565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561470f6060830160408401614a4f565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126383835f61478f565b6040516001600160a01b038481166024830152838116604483015260648201839052610a739186918216906323b872dd90608401613815565b6130aa613690565b6060814710156147b45760405163cd78605960e01b81523060048201526024016104ad565b5f80856001600160a01b031684866040516147cf919061538b565b5f6040518083038185875af1925050503d805f8114614809576040519150601f19603f3d011682016040523d82523d5f602084013e61480e565b606091505b5091509150611be086838360608261482e5761482982614875565b611263565b815115801561484557506001600160a01b0384163b155b1561486e57604051639996b31560e01b81526001600160a01b03851660048201526024016104ad565b5080611263565b8051156148855780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148aa90614d6c565b5f825580601f106148b9575050565b601f0160209004905f5260205f2090810190611bf49190614919565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492d575f815560010161491a565b5090565b8015158114611bf4575f80fd5b803563ffffffff81168114614951575f80fd5b919050565b5f805f60608486031215614968575f80fd5b83359250602084013561497a81614931565b91506149886040850161493e565b90509250925092565b5f602082840312156149a1575f80fd5b5035919050565b6001600160a01b0381168114611bf4575f80fd5b5f808284036101608112156149cf575f80fd5b610140808212156149de575f80fd5b84935083013590506149ef816149a8565b809150509250929050565b5f60208284031215614a0a575f80fd5b6112638261493e565b5f8060408385031215614a24575f80fd5b614a2d8361493e565b946020939093013593505050565b6001600160401b0381168114611bf4575f80fd5b5f60208284031215614a5f575f80fd5b813561126381614a3b565b5f8060408385031215614a7b575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9d575f80fd5b84356001600160401b03811115614ab2575f80fd5b850160608188031215614ac3575f80fd5b93506040601f1982011215614ad6575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4b60408401826001600160a01b03169052565b506060830151614b6660608401826001600160401b03169052565b506080830151614b8160808401826001600160401b03169052565b5060a0830151614b9c60a08401826001600160401b03169052565b5060c0830151614bb760c08401826001600160401b03169052565b5060e0830151614bd260e08401826001600160401b03169052565b5092915050565b5f60208284031215614be9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd257614bd2614bf0565b5f5b83811015614c3e578181015183820152602001614c26565b50505f910152565b602081525f8251806020840152614c64816040850160208701614c24565b601f01601f19169190910160400192915050565b5f82614c9257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a8957610a89614bf0565b6001600160401b03818116838216019080821115614bd257614bd2614bf0565b80820180821115610a8957610a89614bf0565b600181811c90821680614d8057607f821691505b602082108103614d9e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614dfd81614d6c565b806020870152604060018084165f8114614e1e5760018114614e3a57614e67565b60ff19851660408a0152604084151560051b8a01019550614e67565b895f5260205f205f5b85811015614e5e5781548b8201860152908301908801614e43565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614e9057614e90614bf0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ed057614ed0614e9a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614efe57614efe614e9a565b604052919050565b805161495181614931565b5f8060408385031215614f22575f80fd5b82516001600160401b0380821115614f38575f80fd5b9084019060608287031215614f4b575f80fd5b614f53614eae565b82518152602080840151614f66816149a8565b82820152604084015183811115614f7b575f80fd5b80850194505087601f850112614f8f575f80fd5b835183811115614fa157614fa1614e9a565b614fb3601f8201601f19168301614ed6565b93508084528882828701011115614fc8575f80fd5b614fd781838601848801614c24565b50826040830152819550614fec818801614f06565b9450505050509250929050565b81810381811115610a8957610a89614bf0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461511657615116614bf0565b505092915050565b61ffff81168114611bf4575f80fd5b5f6020828403121561513d575f80fd5b81356112638161511e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561519e8161511e565b61ffff8116905081548161ffff19821617835560208401356151bf81614a3b565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151f9575f80fd5b813560ff81168114611263575f80fd5b5f60208284031215615219575f80fd5b8135611263816149a8565b5f808335601e19843603018112615239575f80fd5b8301803591506001600160401b03821115615252575f80fd5b602001915036819003821315615266575f80fd5b9250929050565b601f8211156117e857805f5260205f20601f840160051c810160208510156152925750805b601f840160051c820191505b81811015610fec575f815560010161529e565b81516001600160401b038111156152ca576152ca614e9a565b6152de816152d88454614d6c565b8461526d565b602080601f831160018114615311575f84156152fa5750858301515b5f19600386901b1c1916600185901b178555615368565b5f85815260208120601f198616915b8281101561533f57888601518255948401946001909101908401615320565b508582101561535c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615380575f80fd5b815161126381614931565b5f825161539c818460208701614c24565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,37 +370,6 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMS return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) } -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) -} - // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go index a1f6b6cc3..d343cda87 100644 --- a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -31,8 +31,8 @@ var ( // ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. var ExampleRewardCalculatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", - Bin: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6127106301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingStartTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stakingEndTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"uptimeSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b50604051610357380380610357833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516102d36100845f395f8181609e015261013a01526102d35ff3fe608060405234801561000f575f80fd5b506004361061004a575f3560e01c80635dcc93911461004e578063778c06b51461006c578063afba878a1461007f578063bb65b24214610099575b5f80fd5b6100596301e1338081565b6040519081526020015b60405180910390f35b61005961007a3660046101b6565b6100d9565b610087605081565b60405160ff9091168152602001610063565b6100c07f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610063565b5f60506100e68887610236565b6100f0919061025e565b67ffffffffffffffff1661010585606461025e565b67ffffffffffffffff16101561011c57505f61018f565b6127106301e1338061012e8888610236565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168b61016e919061028a565b610178919061028a565b61018291906102a7565b61018c91906102a7565b90505b979650505050505050565b803567ffffffffffffffff811681146101b1575f80fd5b919050565b5f805f805f805f60e0888a0312156101cc575f80fd5b873596506101dc6020890161019a565b95506101ea6040890161019a565b94506101f86060890161019a565b93506102066080890161019a565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561025757610257610222565b5092915050565b67ffffffffffffffff81811683821602808216919082811461028257610282610222565b505092915050565b80820281158282048414176102a1576102a1610222565b92915050565b5f826102c157634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -233,12 +233,43 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINY return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) if err != nil { return *new(*big.Int), err @@ -250,18 +281,18 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 validatorStartTime, uint64 stakingStartTime, uint64 stakingEndTime, uint64 uptimeSeconds, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, validatorStartTime uint64, stakingStartTime uint64, stakingEndTime uint64, uptimeSeconds uint64, arg5 *big.Int, arg6 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 2b0241b15..4486a3542 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,8 @@ 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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161526538038061526583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151188061014d5f395ff3fe608060405260043610610147575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103d8578063bee0a03f146103f7578063c599e24f14610416578063c974d1b614610429578063d5f20ff61461043d578063df93d8de14610469575f80fd5b806376f786211461033a57806380a8ad941461035957806398f3e2b41461036c578063a3a65e481461038b578063afba878a146103aa578063b771b3bc146103be575f80fd5b8063329c3e1211610104578063329c3e121461026457806335455ded14610296578063467ef06f146102be5780635297fae6146102dd57806362065856146102fc57806366435abf1461031b575f80fd5b80630118acc41461014b5780630322ed981461016c5780630cdd09851461018b578063151d30d1146101e85780631f7a9d8f1461020e5780632e2194d81461022d575b5f80fd5b348015610156575f80fd5b5061016a61016536600461468f565b61047f565b005b348015610177575f80fd5b5061016a6101863660046146ca565b6109a7565b348015610196575f80fd5b506101d56101a53660046146ca565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101f3575f80fd5b506101fc600a81565b60405160ff90911681526020016101df565b348015610219575f80fd5b5061016a6102283660046146e1565b610b77565b348015610238575f80fd5b5061024c6102473660046146ca565b610c54565b6040516001600160401b0390911681526020016101df565b34801561026f575f80fd5b5061027e6001600160991b0181565b6040516001600160a01b0390911681526020016101df565b3480156102a1575f80fd5b506102ab61271081565b60405161ffff90911681526020016101df565b3480156102c9575f80fd5b5061016a6102d83660046146f8565b610c6a565b3480156102e8575f80fd5b5061016a6102f7366004614711565b610d06565b348015610307575f80fd5b506101d561031636600461474d565b610ed6565b348015610326575f80fd5b5061024c6103353660046146ca565b610eef565b348015610345575f80fd5b5061016a61035436600461468f565b610f03565b6101d5610367366004614768565b611121565b348015610377575f80fd5b5061016a610386366004614711565b61114d565b348015610396575f80fd5b5061016a6103a53660046146f8565b6113b1565b3480156103b5575f80fd5b506101fc605081565b3480156103c9575f80fd5b5061027e6005600160991b0181565b3480156103e3575f80fd5b5061016a6103f23660046146ca565b61156e565b348015610402575f80fd5b5061016a6104113660046146ca565b6117f4565b6101d56104243660046146ca565b611903565b348015610434575f80fd5b506101fc601481565b348015610448575f80fd5b5061045c6104573660046146ca565b61190f565b6040516101df91906147d5565b348015610474575f80fd5b5061024c6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f8051602061506c833981519152949193919290829060ff1660048111156104e7576104e76147c1565b60048111156104f8576104f86147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105748361190f565b90504260028351600481111561058c5761058c6147c1565b146105de5760405162461bcd60e51b815260206004820152602a60248201525f8051602061508c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106435760405162461bcd60e51b815260206004820152603360248201525f8051602061508c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d5565b5f61064d856119ee565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561069a5761069a6147c1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610887575f6107738689611a70565b6001600160401b03169050605060ff168460c001518461079391906148c3565b61079d91906148e3565b6001600160401b03166107b182606461490e565b10610885578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107e98760600151610ed6565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa158015610850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108749190614925565b5f8b81526009890160205260409020555b505b60028351600581111561089c5761089c6147c1565b036108ae576108ae8460600151611d0c565b5f84606001518460a001516108c391906148c3565b90506108cf8682611d19565b5f6005600160991b0163ee5b48eb6108e8898686611d61565b6040518263ffffffff1660e01b8152600401610904919061495e565b6020604051808303815f875af1158015610920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109449190614925565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156109f5576109f56147c1565b6005811115610a0657610a066147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a8b57610a8b6147c1565b14610af05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb610b158584608001515f611d61565b6040518263ffffffff1660e01b8152600401610b31919061495e565b6020604051808303815f875af1158015610b4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b719190614925565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc0575080546001600160401b03808416911610155b15610bde5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0883611f80565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c6464e8d4a5100083614990565b92915050565b5f8051602061506c8339815191525f610c8283611f91565b9050600481516005811115610c9957610c996147c1565b03610ce7576040808201516001600160a01b0381165f908152600a85016020529190912054610cc89190612304565b6040808201516001600160a01b03165f908152600a8401602052908120555b610d018160400151610cfc8360600151610ed6565b612362565b505050565b5f8051602061506c8339815191525f610d1e84612379565b90505f80610d2f836040015161255a565b50915091505f610d3e8361190f565b9050816001600160401b031681608001516001600160401b03161015610d765760405162461bcd60e51b81526004016105d5906149af565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dbb5760405162461bcd60e51b81526004016105d5906149f1565b60015f87815260068701602052604090205460ff166004811115610de157610de16147c1565b14610e4a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d5565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c646001600160401b03831664e8d4a5100061490e565b5f610ef98261190f565b60a0015192915050565b5f8051602061506c8339815191525f610f1b85612795565b5f86815260058401602052604090205460c0820151919250610f4d91620100009091046001600160401b031690614a3a565b6001600160401b03168160e001516001600160401b03161015610fce5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105d5565b831561111a575f610fdf8685611a70565b9050605060ff168260c001518360e00151610ffa91906148c3565b61100491906148e3565b6001600160401b03166110188260646148e3565b6001600160401b031610611118578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6110598460600151610ed6565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190614925565b6040808401516001600160a01b03165f908152600a86016020529081208054909190611112908490614a5a565b90915550505b505b5050505050565b5f61112a612b3e565b611135838334612b75565b9050610c6460015f805160206150cc83398151915255565b5f8051602061506c8339815191525f61116584612379565b90505f80611176836040015161255a565b50915091505f6111858361190f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156111bf576111bf6147c1565b60048111156111d0576111d06147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561126f5760405162461bcd60e51b81526004016105d5906149af565b826001600160401b03168160e001516001600160401b031611156112a55760405162461bcd60e51b81526004016105d5906149f1565b6003815160048111156112ba576112ba6147c1565b1461130e5760405162461bcd60e51b815260206004820152603160248201525f8051602061508c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d5565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546113449190612304565b856009015f8881526020019081526020015f205f905561136f8160200151610cfc8360600151610ed6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206150ac8339815191525f6113c983612379565b90505f806113da8360400151612da3565b915091508061143c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d5565b5f8281526007850160205260408120805461145690614a6d565b9050118015611488575060015f83815260088601602052604090205460ff166005811115611486576114866147c1565b145b6114a45760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078501602052604081206114bc916145d7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061506c83398151915293929190829060ff1660048111156115cf576115cf6147c1565b60048111156115e0576115e06147c1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611667576116676147c1565b14806116855750600381516004811115611683576116836147c1565b145b6116d95760405162461bcd60e51b815260206004820152603260248201525f8051602061508c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105d5565b5f6116e7826040015161190f565b905080608001516001600160401b03165f0361176b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb611798846040015184608001518560a00151611d61565b6040518263ffffffff1660e01b81526004016117b4919061495e565b6020604051808303815f875af11580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190614925565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150ac83398151915292919061183c90614a6d565b905011801561186e575060015f83815260088301602052604090205460ff16600581111561186c5761186c6147c1565b145b61188a5760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c39190600401614ae6565b6020604051808303815f875af11580156118df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d019190614925565b5f610c64823334612f44565b61191761460e565b5f8281525f805160206150ec8339815191526020526040908190208151610100810190925280545f805160206150ac833981519152929190829060ff166005811115611965576119656147c1565b6005811115611976576119766147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150ec8339815191526020526040812060030180545f805160206150ac833981519152916001600160401b039091169083611a3183614b70565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611abb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ae29190810190614c20565b9150915080611b455760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190614925565b825114611c105760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d5565b60208201516001600160a01b031615611c865760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d5565b5f80611c95846040015161333f565b91509150818714611d025760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d5565b9695505050505050565b611d16815f613517565b50565b5f9182525f805160206150ec833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611dda57611d9a816001614d08565b611da590600861490e565b5081515f90839083908110611dbc57611dbc614d1b565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6004811015611e3d57611df1816003614d08565b611dfc90600861490e565b6001901c60f81b82611e0f836002614a5a565b81518110611e1f57611e1f614d1b565b60200101906001600160f81b03191690815f1a905350600101611ddd565b505f5b6020811015611e9f57611e5481601f614d08565b611e5f90600861490e565b86901c60f81b82611e71836006614a5a565b81518110611e8157611e81614d1b565b60200101906001600160f81b03191690815f1a905350600101611e40565b505f5b6008811015611f0a57611eb6816007614d08565b611ec190600861490e565b6001600160401b038616901c60f81b82611edc836026614a5a565b81518110611eec57611eec614d1b565b60200101906001600160f81b03191690815f1a905350600101611ea2565b505f5b6008811015611f7557611f21816007614d08565b611f2c90600861490e565b6001600160401b038516901c60f81b82611f4783602e614a5a565b81518110611f5757611f57614d1b565b60200101906001600160f81b03191690815f1a905350600101611f0d565b5090505b9392505050565b611f88613771565b611d16816137bc565b611f9961460e565b5f805160206150ac8339815191525f611fb184612379565b90505f80611fc28360400151612da3565b9150915080156120275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d5565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115612059576120596147c1565b600581111561206a5761206a6147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156120f1576120f16147c1565b148061210f575060018251600581111561210d5761210d6147c1565b145b61216e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d5565b600382516005811115612183576121836147c1565b0361219057506004612194565b5060055b6020808301515f908152600988019091526040812055818160058111156121bd576121bd6147c1565b908160058111156121d0576121d06147c1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612204576122046147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156122cf576122cf6147c1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612350575f80fd5b505af1158015611118573d5f803e3d5ffd5b6123756001600160a01b03831682613828565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206150ac8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124159190810190614c20565b915091508061247c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d5565b82548251146124df5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d5565b60208201516001600160a01b0316156125525760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d5565b509392505050565b5f805f835160361461257e5760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156125cd57612595816001614d08565b6125a090600861490e565b61ffff168682815181106125b6576125b6614d1b565b016020015160f81c901b9190911790600101612581565b5061ffff8116156125f05760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561264b57612607816003614d08565b61261290600861490e565b63ffffffff1687612624836002614a5a565b8151811061263457612634614d1b565b016020015160f81c901b91909117906001016125f3565b5063ffffffff81166003146126725760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156126c75761268981601f614d08565b61269490600861490e565b886126a0836006614a5a565b815181106126b0576126b0614d1b565b016020015160f81c901b9190911790600101612675565b505f805b6008811015612726576126df816007614d08565b6126ea90600861490e565b6001600160401b0316896126ff836026614a5a565b8151811061270f5761270f614d1b565b016020015160f81c901b91909117906001016126cb565b505f805b60088110156127855761273e816007614d08565b61274990600861490e565b6001600160401b03168a61275e83602e614a5a565b8151811061276e5761276e614d1b565b016020015160f81c901b919091179060010161272a565b5091989097509095509350505050565b61279d61460e565b5f8281525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156127eb576127eb6147c1565b60058111156127fc576127fc6147c1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612884576128846147c1565b146128e05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d5565b60408101516001600160a01b0316336001600160a01b03161461295a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d5565b6129678160a00151611d0c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156129ab576129ab6147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612a7785612a71816119ee565b5f611d61565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612aa690859060040161495e565b6020604051808303815f875af1158015612ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae69190614925565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f805160206150cc833981519152805460011901612b6f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061506c833981519152906001600160401b0316612bc1604086016020870161474d565b6001600160401b03161015612c305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105d5565b6003810154612c426020860186614e11565b61ffff1610158015612c665750612710612c5f6020860186614e11565b61ffff1611155b612c825760405162461bcd60e51b81526004016105d590614e2c565b8054831015612ce55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105d5565b8060010154831115612d4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105d5565b825f612d5782610c54565b90505f612d6488836138bb565b5f81815260058601602052604090209091508790612d828282614e77565b509098975050505050505050565b60015f805160206150cc83398151915255565b5f808251602714612dc65760405162461bcd60e51b81526004016105d590614d2f565b5f805b6002811015612e1557612ddd816001614d08565b612de890600861490e565b61ffff16858281518110612dfe57612dfe614d1b565b016020015160f81c901b9190911790600101612dc9565b5061ffff811615612e385760405162461bcd60e51b81526004016105d590614d78565b5f805b6004811015612e9357612e4f816003614d08565b612e5a90600861490e565b63ffffffff1686612e6c836002614a5a565b81518110612e7c57612e7c614d1b565b016020015160f81c901b9190911790600101612e3b565b5063ffffffff8116600214612eba5760405162461bcd60e51b81526004016105d590614dbb565b5f805b6020811015612f0f57612ed181601f614d08565b612edc90600861490e565b87612ee8836006614a5a565b81518110612ef857612ef8614d1b565b016020015160f81c901b9190911790600101612ebd565b505f86602681518110612f2457612f24614d1b565b016020015191976001600160f81b03199092161515965090945050505050565b5f612f4d612b3e565b5f8051602061506c8339815191525f612f6584610c54565b90505f612f718761190f565b9050600281516005811115612f8857612f886147c1565b14612fe75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d5565b612ff082613df5565b5f828260a001516130019190614a3a565b60048501546060840151919250613023916001600160401b03909116906148e3565b6001600160401b0316816001600160401b031611156130a25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105d5565b6130ac8882611d19565b5f6130b6896119ee565b90505f89826040516020016130e292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61311c8d8688611d61565b6040518263ffffffff1660e01b8152600401613138919061495e565b6020604051808303815f875af1158015613154573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131789190614925565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613200576132006147c1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f7960015f805160206150cc83398151915255565b5f808251602e146133625760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156133b157613379816001614d08565b61338490600861490e565b61ffff1685828151811061339a5761339a614d1b565b016020015160f81c901b9190911790600101613365565b5061ffff8116156133d45760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561342f576133eb816003614d08565b6133f690600861490e565b63ffffffff1686613408836002614a5a565b8151811061341857613418614d1b565b016020015160f81c901b91909117906001016133d7565b5063ffffffff81166004146134565760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156134ab5761346d81601f614d08565b61347890600861490e565b87613484836006614a5a565b8151811061349457613494614d1b565b016020015160f81c901b9190911790600101613459565b505f805b600881101561350a576134c3816007614d08565b6134ce90600861490e565b6001600160401b0316886134e3836026614a5a565b815181106134f3576134f3614d1b565b016020015160f81c901b91909117906001016134af565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150ac8339815191529142919015806135fd5750600283015481516135f9916001600160401b031690614a5a565b8210155b15613623576001600160401b038516606082015281815260408101516020820152613642565b84816060018181516136359190614a3a565b6001600160401b03169052505b60608101516136529060646148e3565b602082015160028501546001600160401b03929092169161367d9190600160401b900460ff1661490e565b10156136e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105d5565b831561370a57846001600160401b0316816040018181516137029190614a5a565b905250613729565b846001600160401b0316816040018181516137259190614d08565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137ba57604051631afcd79f60e31b815260040160405180910390fd5b565b6137c4613771565b6137cd81613e00565b611d16608082013560a08301356137ea60e0850160c0860161474d565b6137fb610100860160e08701614e11565b61ffff1661381161012087016101008801614ecd565b61382361014088016101208901614eed565b613e21565b8047101561384b5760405163cd78605960e01b81523060048201526024016105d5565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613894576040519150601f19603f3d011682016040523d82523d5f602084013e613899565b606091505b5050905080610d0157604051630a12f52160e11b815260040160405180910390fd5b5f5f805160206150ac833981519152426138db604086016020870161474d565b6001600160401b03161161394d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105d5565b61395d604085016020860161474d565b6001600160401b03166139736202a30042614a5a565b116139e65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105d5565b8335613a3e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d5565b83355f90815260098201602052604090205415613aae5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d5565b613abb6040850185614f08565b9050603014613b225760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d5565b613b2b83613df5565b5f80613bc56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b70919061474d565b6001600160401b03168152602001613b8b60408a018a614f08565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614065565b5f82815260078601602052604090209193509150613be38282614f95565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c1090859060040161495e565b6020604051808303815f875af1158015613c2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c509190614925565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613cd257613cd26147c1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613dc791908e01908e0161474d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611d16816001613517565b613e08613771565b613e1061440a565b613e1861441a565b611d1681614422565b613e29613771565b5f8051602061506c83398151915283613e955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105d5565b612710841115613eb75760405162461bcd60e51b81526004016105d590614e2c565b85871115613f1f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105d5565b5f8360ff1611613f8c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105d5565b600a60ff84161115613ffe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105d5565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140cf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561414657614106816001614d08565b61411190600861490e565b5081515f9083908390811061412857614128614d1b565b60200101906001600160f81b03191690815f1a9053506001016140f2565b505f5b60048110156141a45761415d816003614d08565b61416890600861490e565b505f82614176836002614a5a565b8151811061418657614186614d1b565b60200101906001600160f81b03191690815f1a905350600101614149565b505f5b602081101561420157845181602081106141c3576141c3614d1b565b1a60f81b826141d3836006614a5a565b815181106141e3576141e3614d1b565b60200101906001600160f81b03191690815f1a9053506001016141a7565b505f5b6020811015614261578460200151816020811061422357614223614d1b565b1a60f81b82614233836026614a5a565b8151811061424357614243614d1b565b60200101906001600160f81b03191690815f1a905350600101614204565b505f5b60088110156142d557614278816007614d08565b61428390600861490e565b60ff1685604001516001600160401b0316901c60f81b828260466142a79190614a5a565b815181106142b7576142b7614d1b565b60200101906001600160f81b03191690815f1a905350600101614264565b505f5b603081101561434057846080015181815181106142f7576142f7614d1b565b01602001516001600160f81b0319168261431283604e614a5a565b8151811061432257614322614d1b565b60200101906001600160f81b03191690815f1a9053506001016142d8565b505f5b60088110156143b257614357816007614d08565b61436290600861490e565b60608601516001600160401b0390811691161c60f81b8261438483607e614a5a565b8151811061439457614394614d1b565b60200101906001600160f81b03191690815f1a905350600101614343565b506002816040516143c39190615050565b602060405180830381855afa1580156143de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144019190614925565b94909350915050565b614412613771565b6137ba6145cf565b6137ba613771565b61442a613771565b80355f805160206150ac83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146144766080840160608501614ecd565b60ff1611156144e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105d5565b5f6144f46080840160608501614ecd565b60ff161161455c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105d5565b61456c6080830160608401614ecd565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561459d606083016040840161474d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612d90613771565b5080546145e390614a6d565b5f825580601f106145f2575050565b601f0160209004905f5260205f2090810190611d169190614652565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614666575f8155600101614653565b5090565b8015158114611d16575f80fd5b803563ffffffff8116811461468a575f80fd5b919050565b5f805f606084860312156146a1575f80fd5b8335925060208401356146b38161466a565b91506146c160408501614677565b90509250925092565b5f602082840312156146da575f80fd5b5035919050565b5f61014082840312156146f2575f80fd5b50919050565b5f60208284031215614708575f80fd5b611f7982614677565b5f8060408385031215614722575f80fd5b61472b83614677565b946020939093013593505050565b6001600160401b0381168114611d16575f80fd5b5f6020828403121561475d575f80fd5b8135611f7981614739565b5f80828403606081121561477a575f80fd5b83356001600160401b0381111561478f575f80fd5b8401606081870312156147a0575f80fd5b92506040601f19820112156147b3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147f957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161482160408401826001600160a01b03169052565b50606083015161483c60608401826001600160401b03169052565b50608083015161485760808401826001600160401b03169052565b5060a083015161487260a08401826001600160401b03169052565b5060c083015161488d60c08401826001600160401b03169052565b5060e08301516148a860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148a8576148a86148af565b6001600160401b03818116838216028082169190828114614906576149066148af565b505092915050565b8082028115828204841417610c6457610c646148af565b5f60208284031215614935575f80fd5b5051919050565b5f5b8381101561495657818101518382015260200161493e565b50505f910152565b602081525f825180602084015261497c81604085016020870161493c565b601f01601f19169190910160400192915050565b5f826149aa57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156148a8576148a86148af565b80820180821115610c6457610c646148af565b600181811c90821680614a8157607f821691505b6020821081036146f257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614af881614a6d565b806020870152604060018084165f8114614b195760018114614b3557614b62565b60ff19851660408a0152604084151560051b8a01019550614b62565b895f5260205f205f5b85811015614b595781548b8201860152908301908801614b3e565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b8b57614b8b6148af565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bcb57614bcb614b95565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bf957614bf9614b95565b604052919050565b6001600160a01b0381168114611d16575f80fd5b805161468a8161466a565b5f8060408385031215614c31575f80fd5b82516001600160401b0380821115614c47575f80fd5b9084019060608287031215614c5a575f80fd5b614c62614ba9565b82518152602080840151614c7581614c01565b82820152604084015183811115614c8a575f80fd5b80850194505087601f850112614c9e575f80fd5b835183811115614cb057614cb0614b95565b614cc2601f8201601f19168301614bd1565b93508084528882828701011115614cd7575f80fd5b614ce68183860184880161493c565b50826040830152819550614cfb818801614c15565b9450505050509250929050565b81810381811115610c6457610c646148af565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611d16575f80fd5b5f60208284031215614e21575f80fd5b8135611f7981614e02565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e8281614e02565b61ffff8116905081548161ffff1982161783556020840135614ea381614739565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614edd575f80fd5b813560ff81168114611f79575f80fd5b5f60208284031215614efd575f80fd5b8135611f7981614c01565b5f808335601e19843603018112614f1d575f80fd5b8301803591506001600160401b03821115614f36575f80fd5b602001915036819003821315614f4a575f80fd5b9250929050565b601f821115610d0157805f5260205f20601f840160051c81016020851015614f765750805b601f840160051c820191505b8181101561111a575f8155600101614f82565b81516001600160401b03811115614fae57614fae614b95565b614fc281614fbc8454614a6d565b84614f51565b602080601f831160018114614ff5575f8415614fde5750858301515b5f19600386901b1c1916600185901b178555611118565b5f85815260208120601f198616915b8281101561502357888601518255948401946001909101908401615004565b508582101561504057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f825161506181846020870161493c565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161524f38038061524f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151028061014d5f395ff3fe60806040526004361061013c575f3560e01c806366435abf116100b3578063ba3a4b971161006d578063ba3a4b97146103b9578063bee0a03f146103d8578063c599e24f146103f7578063c974d1b61461040a578063d5f20ff61461041e578063df93d8de1461044a575f80fd5b806366435abf1461031057806376f786211461032f57806380a8ad941461034e57806398f3e2b414610361578063a3a65e4814610380578063b771b3bc1461039f575f80fd5b80632e2194d8116101045780632e2194d814610222578063329c3e121461025957806335455ded1461028b578063467ef06f146102b35780635297fae6146102d257806362065856146102f1575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614679565b610460565b005b34801561016c575f80fd5b5061015f61017b3660046146b4565b6109b2565b34801561018b575f80fd5b506101ca61019a3660046146b4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d3660046146cb565b610b82565b34801561022d575f80fd5b5061024161023c3660046146b4565b610c5f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b506102736001600160991b0181565b6040516001600160a01b0390911681526020016101d4565b348015610296575f80fd5b506102a061271081565b60405161ffff90911681526020016101d4565b3480156102be575f80fd5b5061015f6102cd3660046146e2565b610c75565b3480156102dd575f80fd5b5061015f6102ec3660046146fb565b610d03565b3480156102fc575f80fd5b506101ca61030b366004614737565b610ed3565b34801561031b575f80fd5b5061024161032a3660046146b4565b610eec565b34801561033a575f80fd5b5061015f610349366004614679565b610f00565b6101ca61035c366004614752565b6110fa565b34801561036c575f80fd5b5061015f61037b3660046146fb565b611126565b34801561038b575f80fd5b5061015f61039a3660046146e2565b61138a565b3480156103aa575f80fd5b506102736005600160991b0181565b3480156103c4575f80fd5b5061015f6103d33660046146b4565b611547565b3480156103e3575f80fd5b5061015f6103f23660046146b4565b6117cd565b6101ca6104053660046146b4565b6118e1565b348015610415575f80fd5b506101f1601481565b348015610429575f80fd5b5061043d6104383660046146b4565b6118ed565b6040516101d491906147bf565b348015610455575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615056833981519152949193919290829060ff1660048111156104c8576104c86147ab565b60048111156104d9576104d96147ab565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f610555836118ed565b90504260028351600481111561056d5761056d6147ab565b146105bf5760405162461bcd60e51b815260206004820152602a60248201525f805160206150768339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106245760405162461bcd60e51b815260206004820152603360248201525f805160206150768339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b6565b5f61062e856119cc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561067b5761067b6147ab565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003918201805467ffffffffffffffff191691909316179091555f9084516005811115610759576107596147ab565b14806107775750600484516005811115610775576107756147ab565b145b1561079b57505f8581526009870160205260409020546001600160401b03166107ae565b88156107ae576107ab8689611a4e565b90505b8660040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107e18760600151610ed3565b60c0870151608089015160a08a01516040516001600160e01b031960e087901b16815260048101949094526001600160401b039283166024850152908216604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561085d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108819190614899565b5f8b81526007890160205260409020556002845160058111156108a6576108a66147ab565b036108b8576108b88560600151611cea565b5f85606001518560a001516108cd91906148c4565b90506108d98782611cf7565b5f6005600160991b0163ee5b48eb6108f28a8786611d3f565b6040518263ffffffff1660e01b815260040161090e9190614906565b6020604051808303815f875af115801561092a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094e9190614899565b604080516001600160401b038581168252888116602083015291810183905291925085169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206150d683398151915260205260408082208151610100810190925280545f8051602061509683398151915293929190829060ff166005811115610a0057610a006147ab565b6005811115610a1157610a116147ab565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a9657610a966147ab565b14610afb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b6565b6005600160991b016001600160a01b031663ee5b48eb610b208584608001515f611d3f565b6040518263ffffffff1660e01b8152600401610b3c9190614906565b6020604051808303815f875af1158015610b58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7c9190614899565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bcb575080546001600160401b03808416911610155b15610be95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c1383611f5e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c6f64e8d4a5100083614938565b92915050565b5f805160206150568339815191525f80610c8e84611f6f565b604082015191935091506001600160a01b0316610cab5750505050565b600482516005811115610cc057610cc06147ab565b03610ce9575f8181526008840160205260408082208054929055830151610ce790826122e6565b505b610b7c8260400151610cfe8460600151610ed3565b61234c565b5f805160206150568339815191525f610d1b84612363565b90505f80610d2c8360400151612544565b50915091505f610d3b836118ed565b9050816001600160401b031681608001516001600160401b03161015610d735760405162461bcd60e51b81526004016105b690614957565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610db85760405162461bcd60e51b81526004016105b690614999565b60015f87815260068701602052604090205460ff166004811115610dde57610dde6147ab565b14610e475760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b6565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c6f6001600160401b03831664e8d4a510006149e2565b5f610ef6826118ed565b60a0015192915050565b5f805160206150568339815191525f610f188561277f565b5f86815260058401602052604090205460c0820151919250610f4a91620100009091046001600160401b0316906149f9565b6001600160401b03168160e001516001600160401b03161015610fcb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b6565b83156110f3575f610fdc8685611a4e565b5f8781526009850160205260409020805467ffffffffffffffff19166001600160401b03831617905560048401546060840151919250600160401b90046001600160a01b03169063778c06b59061103290610ed3565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820181905260448201529181166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156110a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110cd9190614899565b5f878152600885016020526040812080549091906110ec908490614a19565b9091555050505b5050505050565b5f611103612b28565b61110e838334612b5f565b9050610c6f60015f805160206150b683398151915255565b5f805160206150568339815191525f61113e84612363565b90505f8061114f8360400151612544565b50915091505f61115e836118ed565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611198576111986147ab565b60048111156111a9576111a96147ab565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112485760405162461bcd60e51b81526004016105b690614957565b826001600160401b03168160e001516001600160401b0316111561127e5760405162461bcd60e51b81526004016105b690614999565b600381516004811115611293576112936147ab565b146112e75760405162461bcd60e51b815260206004820152603160248201525f805160206150768339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b6565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a019092529091205461131d91906122e6565b856007015f8881526020019081526020015f205f90556113488160200151610cfe8360600151610ed3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206150968339815191525f6113a283612363565b90505f806113b38360400151612d8d565b91509150806114155760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b6565b5f8281526007850160205260408120805461142f90614a2c565b9050118015611461575060015f83815260088601602052604090205460ff16600581111561145f5761145f6147ab565b145b61147d5760405162461bcd60e51b81526004016105b690614a5e565b5f8281526007850160205260408120611495916145c1565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061505683398151915293929190829060ff1660048111156115a8576115a86147ab565b60048111156115b9576115b96147ab565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611640576116406147ab565b148061165e575060038151600481111561165c5761165c6147ab565b145b6116b25760405162461bcd60e51b815260206004820152603260248201525f80516020615076833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b6565b5f6116c082604001516118ed565b905080608001516001600160401b03165f036117445760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b6565b6005600160991b016001600160a01b031663ee5b48eb611771846040015184608001518560a00151611d3f565b6040518263ffffffff1660e01b815260040161178d9190614906565b6020604051808303815f875af11580156117a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f39190614899565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061509683398151915292919061181590614a2c565b9050118015611847575060015f83815260088301602052604090205460ff166005811115611845576118456147ab565b145b6118635760405162461bcd60e51b81526004016105b690614a5e565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161189c9190600401614aa5565b6020604051808303815f875af11580156118b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dc9190614899565b505050565b5f610c6f823334612f2e565b6118f56145f8565b5f8281525f805160206150d68339815191526020526040908190208151610100810190925280545f80516020615096833981519152929190829060ff166005811115611943576119436147ab565b6005811115611954576119546147ab565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150d68339815191526020526040812060030180545f80516020615096833981519152916001600160401b039091169083611a0f83614b2f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ac09190810190614bdf565b9150915080611b235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b8a9190614899565b825114611bee5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b6565b60208201516001600160a01b031615611c645760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b6565b5f80611c738460400151613329565b91509150818714611ce05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b6565b9695505050505050565b611cf4815f613501565b50565b5f9182525f805160206150d6833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611db857611d78816001614cc7565b611d839060086149e2565b5081515f90839083908110611d9a57611d9a614cda565b60200101906001600160f81b03191690815f1a905350600101611d64565b505f5b6004811015611e1b57611dcf816003614cc7565b611dda9060086149e2565b6001901c60f81b82611ded836002614a19565b81518110611dfd57611dfd614cda565b60200101906001600160f81b03191690815f1a905350600101611dbb565b505f5b6020811015611e7d57611e3281601f614cc7565b611e3d9060086149e2565b86901c60f81b82611e4f836006614a19565b81518110611e5f57611e5f614cda565b60200101906001600160f81b03191690815f1a905350600101611e1e565b505f5b6008811015611ee857611e94816007614cc7565b611e9f9060086149e2565b6001600160401b038616901c60f81b82611eba836026614a19565b81518110611eca57611eca614cda565b60200101906001600160f81b03191690815f1a905350600101611e80565b505f5b6008811015611f5357611eff816007614cc7565b611f0a9060086149e2565b6001600160401b038516901c60f81b82611f2583602e614a19565b81518110611f3557611f35614cda565b60200101906001600160f81b03191690815f1a905350600101611eeb565b5090505b9392505050565b611f6661375b565b611cf4816137a6565b611f776145f8565b5f5f8051602061509683398151915281611f9085612363565b90505f80611fa18360400151612d8d565b9150915080156120065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b6565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115612038576120386147ab565b6005811115612049576120496147ab565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156120d0576120d06147ab565b14806120ee57506001825160058111156120ec576120ec6147ab565b145b61214d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b6565b600382516005811115612162576121626147ab565b0361216f57506004612173565b5060055b6020808301515f9081526009880190915260408120558181600581111561219c5761219c6147ab565b908160058111156121af576121af6147ab565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156121e3576121e36147ab565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156122ae576122ae6147ab565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509791965090945050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612332575f80fd5b505af1158015612344573d5f803e3d5ffd5b505050505050565b61235f6001600160a01b03831682613812565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206150968339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123d8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123ff9190810190614bdf565b91509150806124665760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b6565b82548251146124c95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b6565b60208201516001600160a01b03161561253c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b6565b509392505050565b5f805f83516036146125685760405162461bcd60e51b81526004016105b690614cee565b5f805b60028110156125b75761257f816001614cc7565b61258a9060086149e2565b61ffff168682815181106125a0576125a0614cda565b016020015160f81c901b919091179060010161256b565b5061ffff8116156125da5760405162461bcd60e51b81526004016105b690614d37565b5f805b6004811015612635576125f1816003614cc7565b6125fc9060086149e2565b63ffffffff168761260e836002614a19565b8151811061261e5761261e614cda565b016020015160f81c901b91909117906001016125dd565b5063ffffffff811660031461265c5760405162461bcd60e51b81526004016105b690614d7a565b5f805b60208110156126b15761267381601f614cc7565b61267e9060086149e2565b8861268a836006614a19565b8151811061269a5761269a614cda565b016020015160f81c901b919091179060010161265f565b505f805b6008811015612710576126c9816007614cc7565b6126d49060086149e2565b6001600160401b0316896126e9836026614a19565b815181106126f9576126f9614cda565b016020015160f81c901b91909117906001016126b5565b505f805b600881101561276f57612728816007614cc7565b6127339060086149e2565b6001600160401b03168a61274883602e614a19565b8151811061275857612758614cda565b016020015160f81c901b9190911790600101612714565b5091989097509095509350505050565b6127876145f8565b5f8281525f805160206150d683398151915260205260408082208151610100810190925280545f8051602061509683398151915293929190829060ff1660058111156127d5576127d56147ab565b60058111156127e6576127e66147ab565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561286e5761286e6147ab565b146128ca5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b6565b60408101516001600160a01b0316336001600160a01b0316146129445760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b6565b6129518160a00151611cea565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115612995576129956147ab565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612a6185612a5b816119cc565b5f611d3f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612a90908590600401614906565b6020604051808303815f875af1158015612aac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad09190614899565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f805160206150b6833981519152805460011901612b5957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615056833981519152906001600160401b0316612bab6040860160208701614737565b6001600160401b03161015612c1a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b6565b6003810154612c2c6020860186614dd0565b61ffff1610158015612c505750612710612c496020860186614dd0565b61ffff1611155b612c6c5760405162461bcd60e51b81526004016105b690614deb565b8054831015612ccf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b6565b8060010154831115612d365760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b6565b825f612d4182610c5f565b90505f612d4e88836138a5565b5f81815260058601602052604090209091508790612d6c8282614e36565b509098975050505050505050565b60015f805160206150b683398151915255565b5f808251602714612db05760405162461bcd60e51b81526004016105b690614cee565b5f805b6002811015612dff57612dc7816001614cc7565b612dd29060086149e2565b61ffff16858281518110612de857612de8614cda565b016020015160f81c901b9190911790600101612db3565b5061ffff811615612e225760405162461bcd60e51b81526004016105b690614d37565b5f805b6004811015612e7d57612e39816003614cc7565b612e449060086149e2565b63ffffffff1686612e56836002614a19565b81518110612e6657612e66614cda565b016020015160f81c901b9190911790600101612e25565b5063ffffffff8116600214612ea45760405162461bcd60e51b81526004016105b690614d7a565b5f805b6020811015612ef957612ebb81601f614cc7565b612ec69060086149e2565b87612ed2836006614a19565b81518110612ee257612ee2614cda565b016020015160f81c901b9190911790600101612ea7565b505f86602681518110612f0e57612f0e614cda565b016020015191976001600160f81b03199092161515965090945050505050565b5f612f37612b28565b5f805160206150568339815191525f612f4f84610c5f565b90505f612f5b876118ed565b9050600281516005811115612f7257612f726147ab565b14612fd15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b6565b612fda82613ddf565b5f828260a00151612feb91906149f9565b6004850154606084015191925061300d916001600160401b0390911690614e8c565b6001600160401b0316816001600160401b0316111561308c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b6565b6130968882611cf7565b5f6130a0896119cc565b90505f89826040516020016130cc92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6131068d8688611d3f565b6040518263ffffffff1660e01b81526004016131229190614906565b6020604051808303815f875af115801561313e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131629190614899565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156131ea576131ea6147ab565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f5760015f805160206150b683398151915255565b5f808251602e1461334c5760405162461bcd60e51b81526004016105b690614cee565b5f805b600281101561339b57613363816001614cc7565b61336e9060086149e2565b61ffff1685828151811061338457613384614cda565b016020015160f81c901b919091179060010161334f565b5061ffff8116156133be5760405162461bcd60e51b81526004016105b690614d37565b5f805b6004811015613419576133d5816003614cc7565b6133e09060086149e2565b63ffffffff16866133f2836002614a19565b8151811061340257613402614cda565b016020015160f81c901b91909117906001016133c1565b5063ffffffff81166004146134405760405162461bcd60e51b81526004016105b690614d7a565b5f805b60208110156134955761345781601f614cc7565b6134629060086149e2565b8761346e836006614a19565b8151811061347e5761347e614cda565b016020015160f81c901b9190911790600101613443565b505f805b60088110156134f4576134ad816007614cc7565b6134b89060086149e2565b6001600160401b0316886134cd836026614a19565b815181106134dd576134dd614cda565b016020015160f81c901b9190911790600101613499565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150968339815191529142919015806135e75750600283015481516135e3916001600160401b031690614a19565b8210155b1561360d576001600160401b03851660608201528181526040810151602082015261362c565b848160600181815161361f91906149f9565b6001600160401b03169052505b606081015161363c906064614e8c565b602082015160028501546001600160401b0392909216916136679190600160401b900460ff166149e2565b10156136cb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b6565b83156136f457846001600160401b0316816040018181516136ec9190614a19565b905250613713565b846001600160401b03168160400181815161370f9190614cc7565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137a457604051631afcd79f60e31b815260040160405180910390fd5b565b6137ae61375b565b6137b781613dea565b611cf4608082013560a08301356137d460e0850160c08601614737565b6137e5610100860160e08701614dd0565b61ffff166137fb61012087016101008801614eb7565b61380d61014088016101208901614ed7565b613e0b565b804710156138355760405163cd78605960e01b81523060048201526024016105b6565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461387e576040519150601f19603f3d011682016040523d82523d5f602084013e613883565b606091505b50509050806118dc57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020615096833981519152426138c56040860160208701614737565b6001600160401b0316116139375760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b6565b6139476040850160208601614737565b6001600160401b031661395d6202a30042614a19565b116139d05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b6565b8335613a285760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b6565b83355f90815260098201602052604090205415613a985760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b6565b613aa56040850185614ef2565b9050603014613b0c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b6565b613b1583613ddf565b5f80613baf6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b5a9190614737565b6001600160401b03168152602001613b7560408a018a614ef2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061404f565b5f82815260078601602052604090209193509150613bcd8282614f7f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bfa908590600401614906565b6020604051808303815f875af1158015613c16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c3a9190614899565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613cbc57613cbc6147ab565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613db191908e01908e01614737565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611cf4816001613501565b613df261375b565b613dfa6143f4565b613e02614404565b611cf48161440c565b613e1361375b565b5f8051602061505683398151915283613e7f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b6565b612710841115613ea15760405162461bcd60e51b81526004016105b690614deb565b85871115613f095760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b6565b5f8360ff1611613f765760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b6565b600a60ff84161115613fe85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b6565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140b95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614130576140f0816001614cc7565b6140fb9060086149e2565b5081515f9083908390811061411257614112614cda565b60200101906001600160f81b03191690815f1a9053506001016140dc565b505f5b600481101561418e57614147816003614cc7565b6141529060086149e2565b505f82614160836002614a19565b8151811061417057614170614cda565b60200101906001600160f81b03191690815f1a905350600101614133565b505f5b60208110156141eb57845181602081106141ad576141ad614cda565b1a60f81b826141bd836006614a19565b815181106141cd576141cd614cda565b60200101906001600160f81b03191690815f1a905350600101614191565b505f5b602081101561424b578460200151816020811061420d5761420d614cda565b1a60f81b8261421d836026614a19565b8151811061422d5761422d614cda565b60200101906001600160f81b03191690815f1a9053506001016141ee565b505f5b60088110156142bf57614262816007614cc7565b61426d9060086149e2565b60ff1685604001516001600160401b0316901c60f81b828260466142919190614a19565b815181106142a1576142a1614cda565b60200101906001600160f81b03191690815f1a90535060010161424e565b505f5b603081101561432a57846080015181815181106142e1576142e1614cda565b01602001516001600160f81b031916826142fc83604e614a19565b8151811061430c5761430c614cda565b60200101906001600160f81b03191690815f1a9053506001016142c2565b505f5b600881101561439c57614341816007614cc7565b61434c9060086149e2565b60608601516001600160401b0390811691161c60f81b8261436e83607e614a19565b8151811061437e5761437e614cda565b60200101906001600160f81b03191690815f1a90535060010161432d565b506002816040516143ad919061503a565b602060405180830381855afa1580156143c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143eb9190614899565b94909350915050565b6143fc61375b565b6137a46145b9565b6137a461375b565b61441461375b565b80355f8051602061509683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146144606080840160608501614eb7565b60ff1611156144cd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b6565b5f6144de6080840160608501614eb7565b60ff16116145465760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b6565b6145566080830160608401614eb7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556145876060830160408401614737565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612d7a61375b565b5080546145cd90614a2c565b5f825580601f106145dc575050565b601f0160209004905f5260205f2090810190611cf4919061463c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614650575f815560010161463d565b5090565b8015158114611cf4575f80fd5b803563ffffffff81168114614674575f80fd5b919050565b5f805f6060848603121561468b575f80fd5b83359250602084013561469d81614654565b91506146ab60408501614661565b90509250925092565b5f602082840312156146c4575f80fd5b5035919050565b5f61014082840312156146dc575f80fd5b50919050565b5f602082840312156146f2575f80fd5b611f5782614661565b5f806040838503121561470c575f80fd5b61471583614661565b946020939093013593505050565b6001600160401b0381168114611cf4575f80fd5b5f60208284031215614747575f80fd5b8135611f5781614723565b5f808284036060811215614764575f80fd5b83356001600160401b03811115614779575f80fd5b84016060818703121561478a575f80fd5b92506040601f198201121561479d575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147e357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161480b60408401826001600160a01b03169052565b50606083015161482660608401826001600160401b03169052565b50608083015161484160808401826001600160401b03169052565b5060a083015161485c60a08401826001600160401b03169052565b5060c083015161487760c08401826001600160401b03169052565b5060e083015161489260e08401826001600160401b03169052565b5092915050565b5f602082840312156148a9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614892576148926148b0565b5f5b838110156148fe5781810151838201526020016148e6565b50505f910152565b602081525f82518060208401526149248160408501602087016148e4565b601f01601f19169190910160400192915050565b5f8261495257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610c6f57610c6f6148b0565b6001600160401b03818116838216019080821115614892576148926148b0565b80820180821115610c6f57610c6f6148b0565b600181811c90821680614a4057607f821691505b6020821081036146dc57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614ab781614a2c565b806020870152604060018084165f8114614ad85760018114614af457614b21565b60ff19851660408a0152604084151560051b8a01019550614b21565b895f5260205f205f5b85811015614b185781548b8201860152908301908801614afd565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b4a57614b4a6148b0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b8a57614b8a614b54565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bb857614bb8614b54565b604052919050565b6001600160a01b0381168114611cf4575f80fd5b805161467481614654565b5f8060408385031215614bf0575f80fd5b82516001600160401b0380821115614c06575f80fd5b9084019060608287031215614c19575f80fd5b614c21614b68565b82518152602080840151614c3481614bc0565b82820152604084015183811115614c49575f80fd5b80850194505087601f850112614c5d575f80fd5b835183811115614c6f57614c6f614b54565b614c81601f8201601f19168301614b90565b93508084528882828701011115614c96575f80fd5b614ca5818386018488016148e4565b50826040830152819550614cba818801614bd4565b9450505050509250929050565b81810381811115610c6f57610c6f6148b0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611cf4575f80fd5b5f60208284031215614de0575f80fd5b8135611f5781614dc1565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e4181614dc1565b61ffff8116905081548161ffff1982161783556020840135614e6281614723565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614eaf57614eaf6148b0565b505092915050565b5f60208284031215614ec7575f80fd5b813560ff81168114611f57575f80fd5b5f60208284031215614ee7575f80fd5b8135611f5781614bc0565b5f808335601e19843603018112614f07575f80fd5b8301803591506001600160401b03821115614f20575f80fd5b602001915036819003821315614f34575f80fd5b9250929050565b601f8211156118dc57805f5260205f20601f840160051c81016020851015614f605750805b601f840160051c820191505b818110156110f3575f8155600101614f6c565b81516001600160401b03811115614f9857614f98614b54565b614fac81614fa68454614a2c565b84614f3b565b602080601f831160018114614fdf575f8415614fc85750858301515b5f19600386901b1c1916600185901b178555612344565b5f85815260208120601f198616915b8281101561500d57888601518255948401946001909101908401614fee565b508582101561502a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f825161504b8184602087016148e4565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -401,37 +401,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVE return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) } -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) -} - // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 72ba36594..f5b19ac3c 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -59,7 +59,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161300338038061300383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612eb68061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612713565b6102b3565b005b610152610122366004612713565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461272a565b610488565b610112610186366004612768565b610495565b61019e610199366004612713565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc3660046127bf565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612713565b6105e6565b61011261023636600461272a565b6105ef565b6101fd6005600160991b0181565b610112610257366004612713565b6107ac565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612713565b6108c0565b60405161015c9190612821565b61019e6202a30081565b6101126102ae3660046128fb565b61099f565b5f8181525f80516020612e8a83398151915260205260408082208151610100810190925280545f80516020612e6a83398151915293929190829060ff1660058111156103015761030161280d565b60058111156103125761031261280d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156103975761039761280d565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b81526004016104429190612938565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610482919061296a565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c0565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6104918161158b565b5f80516020612e6a8339815191525f61060783611934565b90505f806106188360400151611b15565b915091508061067a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069490612981565b90501180156106c6575060015f83815260088601602052604090205460ff1660058111156106c4576106c461280d565b145b6106e25760405162461bcd60e51b81526004016103f8906129b9565b5f82815260078501602052604081206106fa91612680565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612e6a8339815191529291906107f490612981565b9050118015610826575060015f83815260088301602052604090205460ff1660058111156108245761082461280d565b145b6108425760405162461bcd60e51b81526004016103f8906129b9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087b9190600401612a00565b6020604051808303815f875af1158015610897573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bb919061296a565b505050565b6108c86126b7565b5f8281525f80516020612e8a8339815191526020526040908190208151610100810190925280545f80516020612e6a833981519152929190829060ff1660058111156109165761091661280d565b60058111156109275761092761280d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109a7610f86565b6001600160a01b0381166109d057604051631e4fbdf760e01b81525f60048201526024016103f8565b6109d981610fe1565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612ab2565b610a20906008612ac5565b5081515f90839083908110610a3757610a37612adc565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612ab2565b610a77906008612ac5565b6001901c60f81b82610a8a836002612af0565b81518110610a9a57610a9a612adc565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612ab2565b610ada906008612ac5565b86901c60f81b82610aec836006612af0565b81518110610afc57610afc612adc565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612ab2565b610b3c906008612ac5565b6001600160401b038616901c60f81b82610b57836026612af0565b81518110610b6757610b67612adc565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612ab2565b610ba7906008612ac5565b6001600160401b038516901c60f81b82610bc283602e612af0565b81518110610bd257610bd2612adc565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016126b7565b5f80516020612e6a8339815191525f610c1984611934565b90505f80610c2a8360400151611b15565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc161280d565b6005811115610cd257610cd261280d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d5961280d565b1480610d775750600182516005811115610d7557610d7561280d565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb61280d565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e2561280d565b90816005811115610e3857610e3861280d565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c61280d565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f3761280d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611d74565b610f7d82611dbd565b61049181611dde565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612e6a833981519152426110716040860160208701612b03565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612b03565b6001600160401b03166111096202a30042612af0565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612b1c565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c183611def565b5f8061135b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113069190612b03565b6001600160401b0316815260200161132160408a018a612b1c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611dfa565b5f828152600786016020526040902091935091506113798282612bb0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a6908590600401612938565b6020604051808303815f875af11580156113c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e6919061296a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156114685761146861280d565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155d91908e01908e01612b03565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6115936126b7565b5f8281525f80516020612e8a83398151915260205260408082208151610100810190925280545f80516020612e6a83398151915293929190829060ff1660058111156115e1576115e161280d565b60058111156115f2576115f261280d565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167a5761167a61280d565b146116d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117505760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b61175d8160a0015161219f565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156117a1576117a161280d565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61186d85611867816121a9565b5f6109dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061189c908590600401612938565b6020604051808303815f875af11580156118b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dc919061296a565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612e6a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d09190810190612cd6565b9150915080611a375760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a9a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611b0d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611b7a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611bc957611b91816001612ab2565b611b9c906008612ac5565b61ffff16858281518110611bb257611bb2612adc565b016020015160f81c901b9190911790600101611b7d565b5061ffff811615611c285760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611c8357611c3f816003612ab2565b611c4a906008612ac5565b63ffffffff1686611c5c836002612af0565b81518110611c6c57611c6c612adc565b016020015160f81c901b9190911790600101611c2b565b5063ffffffff8116600214611cea5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611d3f57611d0181601f612ab2565b611d0c906008612ac5565b87611d18836006612af0565b81518110611d2857611d28612adc565b016020015160f81c901b9190911790600101611ced565b505f86602681518110611d5457611d54612adc565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611dc5611d74565b611dcd61222b565b611dd561223b565b6109d981612243565b611de6611d74565b6109d9816123f0565b6109d98160016123f8565b5f6060826080015151603014611e645760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611edb57611e9b816001612ab2565b611ea6906008612ac5565b5081515f90839083908110611ebd57611ebd612adc565b60200101906001600160f81b03191690815f1a905350600101611e87565b505f5b6004811015611f3957611ef2816003612ab2565b611efd906008612ac5565b505f82611f0b836002612af0565b81518110611f1b57611f1b612adc565b60200101906001600160f81b03191690815f1a905350600101611ede565b505f5b6020811015611f965784518160208110611f5857611f58612adc565b1a60f81b82611f68836006612af0565b81518110611f7857611f78612adc565b60200101906001600160f81b03191690815f1a905350600101611f3c565b505f5b6020811015611ff65784602001518160208110611fb857611fb8612adc565b1a60f81b82611fc8836026612af0565b81518110611fd857611fd8612adc565b60200101906001600160f81b03191690815f1a905350600101611f99565b505f5b600881101561206a5761200d816007612ab2565b612018906008612ac5565b60ff1685604001516001600160401b0316901c60f81b8282604661203c9190612af0565b8151811061204c5761204c612adc565b60200101906001600160f81b03191690815f1a905350600101611ff9565b505f5b60308110156120d5578460800151818151811061208c5761208c612adc565b01602001516001600160f81b031916826120a783604e612af0565b815181106120b7576120b7612adc565b60200101906001600160f81b03191690815f1a90535060010161206d565b505f5b6008811015612147576120ec816007612ab2565b6120f7906008612ac5565b60608601516001600160401b0390811691161c60f81b8261211983607e612af0565b8151811061212957612129612adc565b60200101906001600160f81b03191690815f1a9053506001016120d8565b506002816040516121589190612dbe565b602060405180830381855afa158015612173573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612196919061296a565b94909350915050565b6109d9815f6123f8565b5f8181525f80516020612e8a8339815191526020526040812060030180545f80516020612e6a833981519152916001600160401b0390911690836121ec83612dd9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612233611d74565b6105c8612652565b6105c8611d74565b61224b611d74565b80355f80516020612e6a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146122976080840160608501612dfe565b60ff1611156123045760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f6123156080840160608501612dfe565b60ff161161237d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b61238d6080830160608401612dfe565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556123be6060830160408401612b03565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109a7611d74565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612e6a8339815191529142919015806124de5750600283015481516124da916001600160401b031690612af0565b8210155b15612504576001600160401b038516606082015281815260408101516020820152612523565b84816060018181516125169190612e1e565b6001600160401b03169052505b6060810151612533906064612e3e565b602082015160028501546001600160401b03929092169161255e9190600160401b900460ff16612ac5565b10156125c25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b83156125eb57846001600160401b0316816040018181516125e39190612af0565b90525061260a565b846001600160401b0316816040018181516126069190612ab2565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61265a611d74565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461268c90612981565b5f825580601f1061269b575050565b601f0160209004905f5260205f20908101906109d991906126fb565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561270f575f81556001016126fc565b5090565b5f60208284031215612723575f80fd5b5035919050565b5f6020828403121561273a575f80fd5b813563ffffffff8116811461274d575f80fd5b9392505050565b6001600160a01b03811681146109d9575f80fd5b5f8082840360a081121561277a575f80fd5b6080811215612787575f80fd5b50829150608083013561279981612754565b809150509250929050565b80356001600160401b03811681146127ba575f80fd5b919050565b5f80604083850312156127d0575f80fd5b82356001600160401b038111156127e5575f80fd5b8301606081860312156127f6575f80fd5b9150612804602084016127a4565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061284557634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161286d60408401826001600160a01b03169052565b50606083015161288860608401826001600160401b03169052565b5060808301516128a360808401826001600160401b03169052565b5060a08301516128be60a08401826001600160401b03169052565b5060c08301516128d960c08401826001600160401b03169052565b5060e08301516128f460e08401826001600160401b03169052565b5092915050565b5f6020828403121561290b575f80fd5b813561274d81612754565b5f5b83811015612930578181015183820152602001612918565b50505f910152565b602081525f8251806020840152612956816040850160208701612916565b601f01601f19169190910160400192915050565b5f6020828403121561297a575f80fd5b5051919050565b600181811c9082168061299557607f821691505b6020821081036129b357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a1281612981565b806020870152604060018084165f8114612a335760018114612a4f57612a7c565b60ff19851660408a0152604084151560051b8a01019550612a7c565b895f5260205f205f5b85811015612a735781548b8201860152908301908801612a58565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612a9e565b80820281158282048414176105e0576105e0612a9e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612a9e565b5f60208284031215612b13575f80fd5b6105dd826127a4565b5f808335601e19843603018112612b31575f80fd5b8301803591506001600160401b03821115612b4a575f80fd5b602001915036819003821315612b5e575f80fd5b9250929050565b601f8211156108bb57805f5260205f20601f840160051c81016020851015612b8a5750805b601f840160051c820191505b81811015612ba9575f8155600101612b96565b5050505050565b81516001600160401b03811115612bc957612bc9612a8a565b612bdd81612bd78454612981565b84612b65565b602080601f831160018114612c10575f8415612bf95750858301515b5f19600386901b1c1916600185901b178555612c67565b5f85815260208120601f198616915b82811015612c3e57888601518255948401946001909101908401612c1f565b5085821015612c5b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612c9157612c91612a8a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cbf57612cbf612a8a565b604052919050565b805180151581146127ba575f80fd5b5f8060408385031215612ce7575f80fd5b82516001600160401b0380821115612cfd575f80fd5b9084019060608287031215612d10575f80fd5b612d18612c6f565b82518152602080840151612d2b81612754565b82820152604084015183811115612d40575f80fd5b80850194505087601f850112612d54575f80fd5b835183811115612d6657612d66612a8a565b612d78601f8201601f19168301612c97565b93508084528882828701011115612d8d575f80fd5b612d9c81838601848801612916565b50826040830152819550612db1818801612cc7565b9450505050509250929050565b5f8251612dcf818460208701612916565b9190910192915050565b5f6001600160401b03808316818103612df457612df4612a9e565b6001019392505050565b5f60208284031215612e0e575f80fd5b813560ff8116811461274d575f80fd5b6001600160401b038181168382160190808211156128f4576128f4612a9e565b6001600160401b03818116838216028082169190828114612e6157612e61612a9e565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161300738038061300783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612eba8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612717565b6102b3565b005b610152610122366004612717565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461272e565b610488565b61011261018636600461276c565b610496565b61019e610199366004612717565b6105a4565b6040516001600160401b03909116815260200161015c565b6101126105b8565b6101526101cc3660046127c3565b6105cb565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612717565b6105e7565b61011261023636600461272e565b6105f4565b6101fd6005600160991b0181565b610112610257366004612717565b6107b1565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612717565b6108c0565b60405161015c9190612825565b61019e6202a30081565b6101126102ae3660046128ff565b61099f565b5f8181525f80516020612e8e83398151915260205260408082208151610100810190925280545f80516020612e6e83398151915293929190829060ff16600581111561030157610301612811565b600581111561031257610312612811565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612811565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b8152600401610442919061293c565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610482919061296e565b50505050565b61049181610bf9565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104da5750825b90505f826001600160401b031660011480156104f55750303b155b905081158015610503575080155b156105215760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054b57845460ff60401b1916600160401b1785555b6105558787610f70565b831561059b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ae826108c0565b60a0015192915050565b6105c0610f8a565b6105c95f610fe5565b565b5f6105d4610f8a565b6105de8383611055565b90505b92915050565b6105f08161158f565b5050565b5f80516020612e6e8339815191525f61060c83611938565b90505f8061061d8360400151611b19565b915091508061067f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069990612985565b90501180156106cb575060015f83815260088601602052604090205460ff1660058111156106c9576106c9612811565b145b6106e75760405162461bcd60e51b81526004016103f8906129bd565b5f82815260078501602052604081206106ff91612684565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612e6e8339815191529291906107f990612985565b905011801561082b575060015f83815260088301602052604090205460ff16600581111561082957610829612811565b145b6108475760405162461bcd60e51b81526004016103f8906129bd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108809190600401612a04565b6020604051808303815f875af115801561089c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610491919061296e565b6108c86126bb565b5f8281525f80516020612e8e8339815191526020526040908190208151610100810190925280545f80516020612e6e833981519152929190829060ff16600581111561091657610916612811565b600581111561092757610927612811565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109a7610f8a565b6001600160a01b0381166109d057604051631e4fbdf760e01b81525f60048201526024016103f8565b6109d981610fe5565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612ab6565b610a20906008612ac9565b5081515f90839083908110610a3757610a37612ae0565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612ab6565b610a77906008612ac9565b6001901c60f81b82610a8a836002612af4565b81518110610a9a57610a9a612ae0565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612ab6565b610ada906008612ac9565b86901c60f81b82610aec836006612af4565b81518110610afc57610afc612ae0565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612ab6565b610b3c906008612ac9565b6001600160401b038616901c60f81b82610b57836026612af4565b81518110610b6757610b67612ae0565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612ab6565b610ba7906008612ac9565b6001600160401b038516901c60f81b82610bc283602e612af4565b81518110610bd257610bd2612ae0565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016126bb565b5f5f80516020612e6e83398151915281610c1a85611938565b90505f80610c2b8360400151611b19565b915091508015610c905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc257610cc2612811565b6005811115610cd357610cd3612811565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5a57610d5a612811565b1480610d785750600182516005811115610d7657610d76612811565b145b610dd75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610dec57610dec612811565b03610df957506004610dfd565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2657610e26612811565b90816005811115610e3957610e39612811565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6d57610e6d612811565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3857610f38612811565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509791965090945050505050565b610f78611d78565b610f8182611dc1565b6105f081611de2565b33610fbc7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c95760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612e6e833981519152426110756040860160208701612b07565b6001600160401b0316116110e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f76040850160208601612b07565b6001600160401b031661110d6202a30042612af4565b116111805760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112485760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112556040850185612b20565b90506030146112bc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c583611df3565b5f8061135f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061130a9190612b07565b6001600160401b0316815260200161132560408a018a612b20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611dfe565b5f8281526007860160205260409020919350915061137d8282612bb4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113aa90859060040161293c565b6020604051808303815f875af11580156113c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ea919061296e565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146c5761146c612811565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161156191908e01908e01612b07565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6115976126bb565b5f8281525f80516020612e8e83398151915260205260408082208151610100810190925280545f80516020612e6e83398151915293929190829060ff1660058111156115e5576115e5612811565b60058111156115f6576115f6612811565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167e5761167e612811565b146116da5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117545760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b6117618160a001516121a3565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156117a5576117a5612811565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118718561186b816121ad565b5f6109dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906118a090859060040161293c565b6020604051808303815f875af11580156118bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e0919061296e565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612e6e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119ad573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d49190810190612cda565b9150915080611a3b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a9e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611b115760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611b7e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611bcd57611b95816001612ab6565b611ba0906008612ac9565b61ffff16858281518110611bb657611bb6612ae0565b016020015160f81c901b9190911790600101611b81565b5061ffff811615611c2c5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611c8757611c43816003612ab6565b611c4e906008612ac9565b63ffffffff1686611c60836002612af4565b81518110611c7057611c70612ae0565b016020015160f81c901b9190911790600101611c2f565b5063ffffffff8116600214611cee5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611d4357611d0581601f612ab6565b611d10906008612ac9565b87611d1c836006612af4565b81518110611d2c57611d2c612ae0565b016020015160f81c901b9190911790600101611cf1565b505f86602681518110611d5857611d58612ae0565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c957604051631afcd79f60e31b815260040160405180910390fd5b611dc9611d78565b611dd161222f565b611dd961223f565b6109d981612247565b611dea611d78565b6109d9816123f4565b6109d98160016123fc565b5f6060826080015151603014611e685760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611edf57611e9f816001612ab6565b611eaa906008612ac9565b5081515f90839083908110611ec157611ec1612ae0565b60200101906001600160f81b03191690815f1a905350600101611e8b565b505f5b6004811015611f3d57611ef6816003612ab6565b611f01906008612ac9565b505f82611f0f836002612af4565b81518110611f1f57611f1f612ae0565b60200101906001600160f81b03191690815f1a905350600101611ee2565b505f5b6020811015611f9a5784518160208110611f5c57611f5c612ae0565b1a60f81b82611f6c836006612af4565b81518110611f7c57611f7c612ae0565b60200101906001600160f81b03191690815f1a905350600101611f40565b505f5b6020811015611ffa5784602001518160208110611fbc57611fbc612ae0565b1a60f81b82611fcc836026612af4565b81518110611fdc57611fdc612ae0565b60200101906001600160f81b03191690815f1a905350600101611f9d565b505f5b600881101561206e57612011816007612ab6565b61201c906008612ac9565b60ff1685604001516001600160401b0316901c60f81b828260466120409190612af4565b8151811061205057612050612ae0565b60200101906001600160f81b03191690815f1a905350600101611ffd565b505f5b60308110156120d9578460800151818151811061209057612090612ae0565b01602001516001600160f81b031916826120ab83604e612af4565b815181106120bb576120bb612ae0565b60200101906001600160f81b03191690815f1a905350600101612071565b505f5b600881101561214b576120f0816007612ab6565b6120fb906008612ac9565b60608601516001600160401b0390811691161c60f81b8261211d83607e612af4565b8151811061212d5761212d612ae0565b60200101906001600160f81b03191690815f1a9053506001016120dc565b5060028160405161215c9190612dc2565b602060405180830381855afa158015612177573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061219a919061296e565b94909350915050565b6109d9815f6123fc565b5f8181525f80516020612e8e8339815191526020526040812060030180545f80516020612e6e833981519152916001600160401b0390911690836121f083612ddd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612237611d78565b6105c9612656565b6105c9611d78565b61224f611d78565b80355f80516020612e6e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461229b6080840160608501612e02565b60ff1611156123085760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f6123196080840160608501612e02565b60ff16116123815760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6123916080830160608401612e02565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556123c26060830160408401612b07565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109a7611d78565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612e6e8339815191529142919015806124e25750600283015481516124de916001600160401b031690612af4565b8210155b15612508576001600160401b038516606082015281815260408101516020820152612527565b848160600181815161251a9190612e22565b6001600160401b03169052505b6060810151612537906064612e42565b602082015160028501546001600160401b0392909216916125629190600160401b900460ff16612ac9565b10156125c65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b83156125ef57846001600160401b0316816040018181516125e79190612af4565b90525061260e565b846001600160401b03168160400181815161260a9190612ab6565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61265e611d78565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461269090612985565b5f825580601f1061269f575050565b601f0160209004905f5260205f20908101906109d991906126ff565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612713575f8155600101612700565b5090565b5f60208284031215612727575f80fd5b5035919050565b5f6020828403121561273e575f80fd5b813563ffffffff81168114612751575f80fd5b9392505050565b6001600160a01b03811681146109d9575f80fd5b5f8082840360a081121561277e575f80fd5b608081121561278b575f80fd5b50829150608083013561279d81612758565b809150509250929050565b80356001600160401b03811681146127be575f80fd5b919050565b5f80604083850312156127d4575f80fd5b82356001600160401b038111156127e9575f80fd5b8301606081860312156127fa575f80fd5b9150612808602084016127a8565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061284957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161287160408401826001600160a01b03169052565b50606083015161288c60608401826001600160401b03169052565b5060808301516128a760808401826001600160401b03169052565b5060a08301516128c260a08401826001600160401b03169052565b5060c08301516128dd60c08401826001600160401b03169052565b5060e08301516128f860e08401826001600160401b03169052565b5092915050565b5f6020828403121561290f575f80fd5b813561275181612758565b5f5b8381101561293457818101518382015260200161291c565b50505f910152565b602081525f825180602084015261295a81604085016020870161291a565b601f01601f19169190910160400192915050565b5f6020828403121561297e575f80fd5b5051919050565b600181811c9082168061299957607f821691505b6020821081036129b757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a1681612985565b806020870152604060018084165f8114612a375760018114612a5357612a80565b60ff19851660408a0152604084151560051b8a01019550612a80565b895f5260205f205f5b85811015612a775781548b8201860152908301908801612a5c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e1576105e1612aa2565b80820281158282048414176105e1576105e1612aa2565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e1576105e1612aa2565b5f60208284031215612b17575f80fd5b6105de826127a8565b5f808335601e19843603018112612b35575f80fd5b8301803591506001600160401b03821115612b4e575f80fd5b602001915036819003821315612b62575f80fd5b9250929050565b601f82111561049157805f5260205f20601f840160051c81016020851015612b8e5750805b601f840160051c820191505b81811015612bad575f8155600101612b9a565b5050505050565b81516001600160401b03811115612bcd57612bcd612a8e565b612be181612bdb8454612985565b84612b69565b602080601f831160018114612c14575f8415612bfd5750858301515b5f19600386901b1c1916600185901b178555612c6b565b5f85815260208120601f198616915b82811015612c4257888601518255948401946001909101908401612c23565b5085821015612c5f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612c9557612c95612a8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cc357612cc3612a8e565b604052919050565b805180151581146127be575f80fd5b5f8060408385031215612ceb575f80fd5b82516001600160401b0380821115612d01575f80fd5b9084019060608287031215612d14575f80fd5b612d1c612c73565b82518152602080840151612d2f81612758565b82820152604084015183811115612d44575f80fd5b80850194505087601f850112612d58575f80fd5b835183811115612d6a57612d6a612a8e565b612d7c601f8201601f19168301612c9b565b93508084528882828701011115612d91575f80fd5b612da08183860184880161291a565b50826040830152819550612db5818801612ccb565b9450505050509250929050565b5f8251612dd381846020870161291a565b9190910192915050565b5f6001600160401b03808316818103612df857612df8612aa2565b6001019392505050565b5f60208284031215612e12575f80fd5b813560ff81168114612751575f80fd5b6001600160401b038181168382160190808211156128f8576128f8612aa2565b6001600160401b03818116838216028082169190828114612e6557612e65612aa2565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 39e84a194..79740d61a 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -10,6 +10,8 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculator is IRewardCalculator { uint256 public constant SECONDS_IN_YEAR = 31536000; + uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; + uint64 public immutable rewardBasisPoints; constructor(uint64 rewardBasisPoints_) { @@ -21,11 +23,23 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 validatorStartTime, + uint64 stakingStartTime, + uint64 stakingEndTime, + uint64 uptimeSeconds, uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 10000; + // Equivalent to uptimeSeconds/(validator.endedAt - validator.startedAt) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 + // Rearranged to prevent integer division truncation. + if ( + uptimeSeconds * 100 + < (stakingEndTime - validatorStartTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + return 0; + } + + return (stakeAmount * rewardBasisPoints * (stakingEndTime - stakingStartTime)) + / SECONDS_IN_YEAR / 10000; } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 33527bbe4..66a4c5bec 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -50,14 +50,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager mapping(bytes32 validationID => PoSValidatorRequirements) _validatorRequirements; /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the delegationID to pending register delegator messages. - mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; - /// @notice Maps the delegationID to pending end delegator messages. - mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; /// @notice Maps the delegationID to its pending staking rewards. mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; /// @notice Maps the validator owner address to its pending staking rewards. - mapping(address validatorOwner => uint256) _redeemableValidatorRewards; + mapping(bytes32 validationID => uint256) _redeemableValidatorRewards; + /// @notice Saves the uptime of a pending completed or completed validation period so that delegators can collect rewards. + mapping(bytes32 validationID => uint64) _completedValidationUptimeSeconds; } // solhint-enable private-vars-leading-underscore @@ -68,8 +66,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; - uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; - uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; // solhint-disable ordering @@ -150,32 +146,35 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); if (includeUptimeProof) { - uint64 uptime = _getUptime(validationID, messageIndex); - if ( - uptime * 100 - >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE - ) { - $._redeemableValidatorRewards[validator.owner] += $ - ._rewardCalculator - .calculateReward( - weightToValue(validator.startingWeight), - validator.startedAt, - validator.endedAt, - 0, - 0 - ); - } + uint64 uptimeSeconds = _getUptime(validationID, messageIndex); + $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; + + $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(validator.startingWeight), + validatorStartTime: validator.startedAt, + stakingStartTime: validator.startedAt, + stakingEndTime: validator.endedAt, + uptimeSeconds: uptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); } } function completeEndValidation(uint32 messageIndex) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - Validator memory validator = _completeEndValidation(messageIndex); + (Validator memory validator, bytes32 validationID) = _completeEndValidation(messageIndex); + + // PoA or initial validator case + if (validator.owner == address(0)) { + return; + } if (validator.status == ValidatorStatus.Completed) { - _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); - delete $._redeemableValidatorRewards[validator.owner]; + uint256 rewards = $._redeemableValidatorRewards[validationID]; + delete $._redeemableValidatorRewards[validationID]; + _reward(validator.owner, rewards); } // We unlock the state whether the validation period is completed or invalidated. @@ -383,18 +382,26 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._delegatorStakes[delegationID] = delegator; - if (includeUptimeProof) { - uint256 uptime = _getUptime(validationID, messageIndex); - if ( - uptime * 100 - >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE - ) { - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( - weightToValue(delegator.weight), delegator.startedAt, delegator.endedAt, 0, 0 - ); - } + uint64 validatorUptimeSeconds; + if ( + validator.status == ValidatorStatus.PendingRemoved + || validator.status == ValidatorStatus.Completed + ) { + validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; + } else if (includeUptimeProof) { + validatorUptimeSeconds = _getUptime(validationID, messageIndex); } + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(delegator.weight), + validatorStartTime: validator.startedAt, + stakingStartTime: delegator.startedAt, + stakingEndTime: delegator.endedAt, + uptimeSeconds: validatorUptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); + // Check that removing this delegator would not exceed the maximum churn rate. // We only need to check this is the validator is still active. If the validator ends its validation // period, the weight of all its delegators will be added to the churn tracker at that time. Ending diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 80eedca85..6b6bfcab7 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -306,7 +306,10 @@ abstract contract ValidatorManager is * {registrationExpiry} being reached. * @return The Validator instance representing the completed validation period */ - function _completeEndValidation(uint32 messageIndex) internal returns (Validator memory) { + function _completeEndValidation(uint32 messageIndex) + internal + returns (Validator memory, bytes32) + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Get the Warp message. @@ -339,12 +342,10 @@ abstract contract ValidatorManager is validator.status = endStatus; $._validationPeriods[validationID] = validator; - // TODO: Unlock the stake. - // Emit event. emit ValidationPeriodEnded(validationID, validator.status); - return validator; + return (validator, validationID); } /** diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index 51fffb6a7..b7f9a35c4 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -8,8 +8,10 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 validatorStartTime, + uint64 stakingStartTime, + uint64 stakingEndTime, + uint64 uptimeSeconds, uint256 initialSupply, uint256 endSupply ) external view returns (uint256); diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index 22a41368c..87b18020c 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -7,13 +7,15 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculatorTest is Test { - ExampleRewardCalculator public exampleRewardCalculator; + IRewardCalculator public exampleRewardCalculator; uint256 public constant DEFAULT_STAKE_AMOUNT = 1e12; uint64 public constant DEFAULT_START_TIME = 1000; uint64 public constant DEFAULT_END_TIME = 31537000; // a year + 1000 seonds + uint64 public constant DEFAULT_UPTIME = (DEFAULT_END_TIME - DEFAULT_START_TIME) * 80 / 100; uint64 public constant DEFAULT_REWARD_BASIS_POINTS = 42; function setUp() public { @@ -21,9 +23,28 @@ contract ExampleRewardCalculatorTest is Test { } function testRewardCalculation() public view { - uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 - ); + uint256 output = exampleRewardCalculator.calculateReward({ + stakeAmount: DEFAULT_STAKE_AMOUNT, + validatorStartTime: DEFAULT_START_TIME, + stakingStartTime: DEFAULT_START_TIME, + stakingEndTime: DEFAULT_END_TIME, + uptimeSeconds: DEFAULT_UPTIME, + initialSupply: 0, + endSupply: 0 + }); assertEq(output, 42e8); } + + function testInsufficientUptime() public view { + uint256 output = exampleRewardCalculator.calculateReward({ + stakeAmount: DEFAULT_STAKE_AMOUNT, + validatorStartTime: DEFAULT_START_TIME, + stakingStartTime: DEFAULT_START_TIME, + stakingEndTime: DEFAULT_END_TIME, + uptimeSeconds: DEFAULT_UPTIME - 1, + initialSupply: 0, + endSupply: 0 + }); + assertEq(output, 0); + } } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 1941b7eb3..53d76c22b 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -213,6 +213,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { data: "", // implies receive() returnData: "" }); + // Because we don vm.deal(account, account.balance + amount); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index dee49c225..225ecb4c3 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.25; -import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import {PoSValidatorRequirements} from "../interfaces/IPoSValidatorManager.sol"; @@ -14,7 +14,7 @@ import { IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {ValidatorRegistrationInput} from "../interfaces/IValidatorManager.sol"; +import {ValidatorRegistrationInput, ValidatorStatus} from "../interfaces/IValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); @@ -27,6 +27,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + address public constant DEFAULT_VALIDATOR_OWNER_ADDRESS = + address(0x2345234523452345234523452345234523452345); uint64 public constant DEFAULT_REWARD_RATE = uint64(10); uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; @@ -34,7 +36,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; - ExampleRewardCalculator public rewardCalculator; + IRewardCalculator public rewardCalculator; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); @@ -493,7 +495,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -502,18 +505,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegation() public { - uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - - uint256 registrationExpiry = - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + registrationDuration; - bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: uint64(registrationExpiry), + registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: uint64(registrationExpiry) + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, @@ -530,47 +528,38 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); + uint64 delgationEndTime = + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; _setUpInitializeEndDelegation({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - endDelegationTimestamp: uint64(registrationExpiry), + endDelegationTimestamp: delgationEndTime, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); - address delegator = DEFAULT_DELEGATOR_ADDRESS; - uint256 balanceBefore = _getStakeAssetBalance(delegator); - uint256 expectedReward = rewardCalculator.calculateReward( - _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - uint64(registrationExpiry), - 0, - 0 - ); - _expectStakeUnlock(delegator, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); - _expectRewardIssuance(delegator, expectedReward); + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: delgationEndTime, + uptimeSeconds: delgationEndTime - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); _setUpCompleteEndDelegation({ validationID: validationID, delegationID: delegationID, - delegator: delegator, + delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, expectedReward: expectedReward, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); - - uint256 balanceAfter = _getStakeAssetBalance(delegator); - vm.assertEq(balanceAfter, balanceAfter); - vm.assertEq(expectedReward, expectedReward); - uint256 balanceChange = balanceAfter - balanceBefore; - require( - balanceChange == _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedReward, - "delegator should have received their stake back and been rewarded" - ); } function testCompleteEndDelegationWrongNonce() public { @@ -698,7 +687,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -707,7 +696,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -719,13 +708,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID1, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: rewardCalculator.calculateReward( - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - 0, - 0 - ), + expectedReward: 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, + initialSupply: 0, + endSupply: 0 + }), validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -733,36 +724,46 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndValidation() public virtual override { - uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - - uint256 registrationExpiry = DEFAULT_REGISTRATION_TIMESTAMP + registrationDuration; - bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: uint64(registrationExpiry), + registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: uint64(registrationExpiry), + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, includeUptime: true }); - uint256 balanceBefore = _getStakeAssetBalance(address(this)); - - uint256 expectedReward = _weightToValue(DEFAULT_WEIGHT) * DEFAULT_REWARD_RATE - * registrationDuration / 10000 / SECONDS_IN_YEAR; - - _expectStakeUnlock(address(this), _weightToValue(DEFAULT_WEIGHT)); - _expectRewardIssuance(address(this), expectedReward); + 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, + initialSupply: 0, + endSupply: 0 + }); - _testCompleteEndValidation(validationID); + _setUpCompleteEndValidation({ + validationID: validationID, + validatorOwner: address(this), + expectedReward: expectedReward, + validatorWeight: DEFAULT_WEIGHT + }); + } - uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; - require( - balanceChange == _weightToValue(DEFAULT_WEIGHT) + expectedReward, - "validator should have received their stake back and been rewarded" - ); + function testInitializeEndValidation() public virtual override { + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); } function testValueToWeight() public view { @@ -894,11 +895,37 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return delegationID; } + function _setUpCompleteEndValidation( + bytes32 validationID, + address validatorOwner, + uint256 expectedReward, + uint64 validatorWeight + ) internal { + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + uint256 balanceBefore = _getStakeAssetBalance(validatorOwner); + + _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); + _expectRewardIssuance(validatorOwner, expectedReward); + + posValidatorManager.completeEndValidation(0); + + assertEq( + _getStakeAssetBalance(validatorOwner), + balanceBefore + _weightToValue(validatorWeight) + expectedReward + ); + } + function _setUpCompleteEndDelegation( bytes32 validationID, bytes32 delegationID, address delegator, - uint256 delegatorWeight, + uint64 delegatorWeight, uint256 expectedReward, uint64 validatorWeight, uint64 expectedValidatorWeight, @@ -911,10 +938,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(delegationID, validationID, expectedNonce); - _expectStakeUnlock(delegator, delegatorWeight); + uint256 balanceBefore = _getStakeAssetBalance(delegator); + + _expectStakeUnlock(delegator, _weightToValue(delegatorWeight)); _expectRewardIssuance(delegator, expectedReward); + posValidatorManager.completeEndDelegation(0, delegationID); + assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); + assertEq( + _getStakeAssetBalance(delegator), + balanceBefore + _weightToValue(delegatorWeight) + expectedReward + ); return delegationID; } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 180cf70f7..1f5bbc3c1 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -170,7 +170,15 @@ abstract contract ValidatorManagerTest is Test { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); - _testCompleteEndValidation(validationID); + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + + validatorManager.completeEndValidation(0); } function testCompleteInvalidatedValidation() public { @@ -368,7 +376,7 @@ abstract contract ValidatorManagerTest is Test { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); if (includeUptime) { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, registrationExpiry - registrationTimestamp + validationID, completionTimestamp - registrationTimestamp ); _mockGetVerifiedWarpMessage(uptimeMsg, true); _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); @@ -379,18 +387,6 @@ abstract contract ValidatorManagerTest is Test { _initializeEndValidation(validationID, includeUptime); } - function _testCompleteEndValidation(bytes32 validationID) internal virtual { - bytes memory subnetValidatorRegistrationMessage = - ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); - - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); - - validatorManager.completeEndValidation(0); - } - function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, From 901908551184ae73a734fc8374fed50e2c32072d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:41:09 -0400 Subject: [PATCH 16/36] Remove unneccessary comment --- contracts/staking/NativeTokenStakingManager.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index f08264082..b00581c66 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -88,7 +88,6 @@ contract NativeTokenStakingManager is payable(to).sendValue(value); } - // solhint-disable-next-line no-empty-blocks function _reward(address account, uint256 amount) internal virtual override { NATIVE_MINTER.mintNativeCoin(account, amount); } From 2109a68c08976192a1ae5fd0f11a86962c5ee961 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:51:31 -0400 Subject: [PATCH 17/36] Add comments --- contracts/staking/PoSValidatorManager.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 66a4c5bec..f40f2021b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -146,7 +146,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); if (includeUptimeProof) { + // Uptime proofs include the absolute number of seconds the validator has been active. uint64 uptimeSeconds = _getUptime(validationID, messageIndex); + // Save this value for use by this validator's delegators. $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ @@ -387,8 +389,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.status == ValidatorStatus.PendingRemoved || validator.status == ValidatorStatus.Completed ) { + // If the validation period has already ended, we have saved the uptime. validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; } else if (includeUptimeProof) { + // Uptime proofs include the absolute number of seconds the validator has been active. validatorUptimeSeconds = _getUptime(validationID, messageIndex); } From 8d2969a72844d0074b190fd4784d66b901c0ca8f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:16:49 -0400 Subject: [PATCH 18/36] Update contracts/staking/PoSValidatorManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 4deeb75f6..04026a464 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -168,7 +168,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager (Validator memory validator, bytes32 validationID) = _completeEndValidation(messageIndex); - // PoA or initial validator case + // Return now if this was originally a PoA validator that was later migrated to this PoS manager if (validator.owner == address(0)) { return; } From b465fba85ef1373e49e768863e380dbbc4d8660c Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:17:03 -0400 Subject: [PATCH 19/36] Update contracts/staking/PoSValidatorManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/staking/PoSValidatorManager.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 04026a464..51e6d62d8 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -378,6 +378,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.endedAt = uint64(block.timestamp); } else { // If the validation period has already ended, we have saved the uptime. + // Further, it is impossible to retrieve an uptime proof for an already ended validation, + // so there's no need to check any uptime proof provided in this function call. validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; delegator.endingNonce = validator.messageNonce; From c215b3ca0021f87206d61d542ffbf5b69e373835 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:17:49 -0400 Subject: [PATCH 20/36] Update contracts/staking/PoSValidatorManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 51e6d62d8..9040e3684 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -179,7 +179,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _reward(validator.owner, rewards); } - // We unlock the state whether the validation period is completed or invalidated. + // We unlock the stake whether the validation period is completed or invalidated. _unlock(validator.owner, weightToValue(validator.startingWeight)); } From d9ae361b06eba6f795369976638b2f1d2f452bb1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:33:09 -0400 Subject: [PATCH 21/36] fix comment --- contracts/staking/tests/NativeTokenStakingManagerTests.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 53d76c22b..e4a95a23f 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -213,7 +213,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { data: "", // implies receive() returnData: "" }); - // Because we don + // Units tests don't have access to the native minter precompile, so use vm.deal instead. vm.deal(account, account.balance + amount); } From 9bbfde259f884748474a332914268920221d66fa Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 14:11:38 -0400 Subject: [PATCH 22/36] review fixes --- contracts/staking/interfaces/IERC20Mintable.sol | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/staking/interfaces/IERC20Mintable.sol index fd28ad6b1..855647257 100644 --- a/contracts/staking/interfaces/IERC20Mintable.sol +++ b/contracts/staking/interfaces/IERC20Mintable.sol @@ -7,6 +7,13 @@ pragma solidity 0.8.25; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; + interface IERC20Mintable is IERC20 { + /** + * @notice Mint tokens to the specified address. + * @param account The address to mint tokens to. + * @param amount How many tokens to mint. + * @dev This function should have appropriate user controls to ensure that only the staking contract can mint. + */ function mint(address account, uint256 amount) external; } From ebe122e6b3b87637b2821537c216a1dcfe9a10bc Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 14:21:02 -0400 Subject: [PATCH 23/36] lint --- contracts/staking/interfaces/IERC20Mintable.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/staking/interfaces/IERC20Mintable.sol index 855647257..dd2225ceb 100644 --- a/contracts/staking/interfaces/IERC20Mintable.sol +++ b/contracts/staking/interfaces/IERC20Mintable.sol @@ -7,7 +7,6 @@ pragma solidity 0.8.25; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; - interface IERC20Mintable is IERC20 { /** * @notice Mint tokens to the specified address. From 13e210b97c629d855315c68d6e3b2df585c3c662 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:02:28 -0400 Subject: [PATCH 24/36] Review fixes --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 22 ++++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 7c508d3ba..ead1c87ba 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615e8b380380615e8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d3e8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f3660046150a1565b6103bf565b005b6101846101943660046150dc565b610862565b6101d76101a73660046150dc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b6102176102123660046150dc565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d366004615107565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004615145565b610b10565b61018461027f36600461515e565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615186565b610d85565b6101d76102c23660046151ea565b6113b9565b6102176102d53660046150dc565b6113d2565b6101846102e83660046150a1565b6113e6565b6101f2603081565b61018461030336600461515e565b6115e0565b6101d7610316366004615203565b611862565b610184610329366004615145565b61188e565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b6101846103623660046150dc565b611a46565b6101846103753660046150dc565b611ccc565b6101f2601481565b6103956103903660046150dc565b611de0565b6040516101e19190615237565b6102176202a30081565b6101d76103ba3660046152fe565b611ea8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615c92833981519152949193919290829060ff16600481111561042757610427615223565b600481111561043857610438615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611de0565b90506002825160048111156104cb576104cb615223565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615cb28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615cb28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e615223565b036105f55786156105b6576105b38487611edd565b90505b5f836060015183608001516105cb9190615377565b90506105d78582612179565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615397565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c615223565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff1660058111156108af576108af615223565b60058111156108c0576108c0615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f615223565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f6122d0565b6040518263ffffffff1660e01b81526004016109d591906153d0565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615397565b50505050565b5f610a2b64e8d4a5100083615402565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac384846124f7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615c928339815191525f80610b2984612511565b91509150610b368261285b565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e615223565b03610b93575f83815260088501602052604081208054919055610b918282612896565b505b610ba981610ba484604001516113b9565b61290c565b5050505050565b5f80516020615c928339815191525f610bc88461292f565b90505f80610bd98360400151612b09565b50915091505f610be883611de0565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b815260040161051490615421565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615463565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b615223565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615cd28339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615397565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc60608501604086016154ac565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c60608501856154c7565b91505f9050843560208601356014610f9a6060890160408a016154ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a60608901896154c7565b8363ffffffff168181106110305761103061550c565b90506020028101906110429190615520565b61104b906155d0565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615667565b84825f0151836020015184604001516040516020016110a094939291906156af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906156fe565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615397565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b8615223565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b91168661570f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c290615722565b9050610ffe565b50600584018190555f6112db8661292f565b90505f6112eb8260400151612d44565b9050806002856040516112fe91906156fe565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615397565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a51000615744565b5f6113dc82611de0565b6080015192915050565b5f80516020615c928339815191525f6113fe85612eb6565b5f86815260058401602052604090205460a082015191925061143191600160b01b9091046001600160401b03169061575b565b6001600160401b03168160c001516001600160401b031610156114b25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114c38685611edd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061151a906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b49190615397565b5f878152600885016020526040812080549091906115d390849061570f565b9091555050505050505050565b6115e8613131565b5f80516020615c928339815191525f6116008461292f565b90505f806116118360400151612b09565b50915091505f61162083611de0565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561165a5761165a615223565b600481111561166b5761166b615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561170a5760405162461bcd60e51b815260040161051490615421565b826001600160401b03168160e001516001600160401b031611156117405760405162461bcd60e51b815260040161051490615463565b60038151600481111561175557611755615223565b146117a95760405162461bcd60e51b815260206004820152603160248201525f80516020615cb28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546117df9190612896565b856007015f8881526020019081526020015f205f905561180a8160200151610ba483606001516113b9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061185e60015f80516020615cf283398151915255565b5050565b5f61186b613131565b61187683338461317b565b9050610a2b60015f80516020615cf283398151915255565b5f80516020615cd28339815191525f6118a68361292f565b90505f806118b78360400151613535565b91509150806119195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119339061577b565b9050118015611965575060015f83815260088601602052604090205460ff16600581111561196357611963615223565b145b6119815760405162461bcd60e51b8152600401610514906157b3565b5f828152600785016020526040812061199991614ff1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615c9283398151915293929190829060ff166004811115611aa757611aa7615223565b6004811115611ab857611ab8615223565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3f57611b3f615223565b1480611b5d5750600381516004811115611b5b57611b5b615223565b145b611bb15760405162461bcd60e51b815260206004820152603260248201525f80516020615cb2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611bbf8260400151611de0565b905080606001516001600160401b03165f03611c435760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611c708460400151846060015185608001516122d0565b6040518263ffffffff1660e01b8152600401611c8c91906153d0565b6020604051808303815f875af1158015611ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615397565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615cd2833981519152929190611d149061577b565b9050118015611d46575060015f83815260088301602052604090205460ff166005811115611d4457611d44615223565b145b611d625760405162461bcd60e51b8152600401610514906157b3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9b91906004016157fa565b6020604051808303815f875af1158015611db7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ddb9190615397565b505050565b611de8615028565b5f8281525f80516020615d12833981519152602052604090819020815160e0810190925280545f80516020615cd2833981519152929190829060ff166005811115611e3557611e35615223565b6005811115611e4657611e46615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611eb1613131565b611ebd858585856136d6565b9050611ed560015f80516020615cf283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f28573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f4f919081019061588f565b9150915080611fb25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120199190615397565b82511461207d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156120f35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f80612102846040015161394b565b9150915081871461216f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615d12833981519152602052604081206002015481905f80516020615cd283398151915290600160801b90046001600160401b03166121c18582613b23565b5f6121cb87613d31565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61221b8a858b6122d0565b6040518263ffffffff1660e01b815260040161223791906153d0565b6020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190615397565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561234957612309816001615961565b612314906008615744565b5081515f9083908390811061232b5761232b61550c565b60200101906001600160f81b03191690815f1a9053506001016122f5565b505f5b60048110156123b457612360816003615961565b61236b906008615744565b600263ffffffff16901c60f81b82826002612386919061570f565b815181106123965761239661550c565b60200101906001600160f81b03191690815f1a90535060010161234c565b505f5b6020811015612416576123cb81601f615961565b6123d6906008615744565b86901c60f81b826123e883600661570f565b815181106123f8576123f861550c565b60200101906001600160f81b03191690815f1a9053506001016123b7565b505f5b60088110156124815761242d816007615961565b612438906008615744565b6001600160401b038616901c60f81b8261245383602661570f565b815181106124635761246361550c565b60200101906001600160f81b03191690815f1a905350600101612419565b505f5b60088110156124ec57612498816007615961565b6124a3906008615744565b6001600160401b038516901c60f81b826124be83602e61570f565b815181106124ce576124ce61550c565b60200101906001600160f81b03191690815f1a905350600101612484565b5090505b9392505050565b6124ff613dc1565b61250882613e0c565b61185e81613e83565b5f61251a615028565b5f80516020615cd28339815191525f6125328561292f565b90505f806125438360400151613535565b9150915080156125a85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156125d9576125d9615223565b60058111156125ea576125ea615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561265b5761265b615223565b1480612679575060018251600581111561267757612677615223565b145b6126d85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b6003825160058111156126ed576126ed615223565b036126fa575060046126fe565b5060055b6020808301515f9081526009880190915260408120558181600581111561272757612727615223565b9081600581111561273a5761273a615223565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561276e5761276e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561282257612822615223565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615c7283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156128f1575f80fd5b505af1158015612903573d5f803e3d5ffd5b50505050505050565b5f80516020615c728339815191525461185e906001600160a01b03168383613f24565b60408051606080820183525f8083526020830181905292820152905f80516020615cd28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156129a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129cb919081019061588f565b9150915080612a2b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612a8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612b015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612b2d5760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612b7c57612b44816001615961565b612b4f906008615744565b61ffff16868281518110612b6557612b6561550c565b016020015160f81c901b9190911790600101612b30565b5061ffff811615612b9f5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612bfa57612bb6816003615961565b612bc1906008615744565b63ffffffff1687612bd383600261570f565b81518110612be357612be361550c565b016020015160f81c901b9190911790600101612ba2565b5063ffffffff8116600414612c215760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612c7657612c3881601f615961565b612c43906008615744565b88612c4f83600661570f565b81518110612c5f57612c5f61550c565b016020015160f81c901b9190911790600101612c24565b505f805b6008811015612cd557612c8e816007615961565b612c99906008615744565b6001600160401b031689612cae83602661570f565b81518110612cbe57612cbe61550c565b016020015160f81c901b9190911790600101612c7a565b505f805b6008811015612d3457612ced816007615961565b612cf8906008615744565b6001600160401b03168a612d0d83602e61570f565b81518110612d1d57612d1d61550c565b016020015160f81c901b9190911790600101612cd9565b5091989097509095509350505050565b5f8151602614612d665760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612db557612d7d816001615961565b612d88906008615744565b61ffff16848281518110612d9e57612d9e61550c565b016020015160f81c901b9190911790600101612d69565b5061ffff811615612dd85760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612e3357612def816003615961565b612dfa906008615744565b63ffffffff1685612e0c83600261570f565b81518110612e1c57612e1c61550c565b016020015160f81c901b9190911790600101612ddb565b5063ffffffff811615612e585760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612ead57612e6f81601f615961565b612e7a906008615744565b86612e8683600661570f565b81518110612e9657612e9661550c565b016020015160f81c901b9190911790600101612e5b565b50949350505050565b612ebe615028565b5f8281525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff166005811115612f0b57612f0b615223565b6005811115612f1c57612f1c615223565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f8e57612f8e615223565b14612fea5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561302e5761302e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130da8582612179565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615cf283398151915280546001190161316257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615cf283398151915255565b5f5f80516020615c928339815191528161319761021285613f83565b90505f6131a387611de0565b90506131ae8761285b565b61320b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b60028151600581111561322057613220615223565b1461327f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f828260800151613290919061575b565b600485015460408401519192506132b2916001600160401b0390911690615a47565b6001600160401b0316816001600160401b031611156133315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f8061333d8a84612179565b915091505f8a8360405160200161336b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561340657613406615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135585760405162461bcd60e51b815260040161051490615974565b5f805b60028110156135a75761356f816001615961565b61357a906008615744565b61ffff168582815181106135905761359061550c565b016020015160f81c901b919091179060010161355b565b5061ffff8116156135ca5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613625576135e1816003615961565b6135ec906008615744565b63ffffffff16866135fe83600261570f565b8151811061360e5761360e61550c565b016020015160f81c901b91909117906001016135cd565b5063ffffffff811660031461364c5760405162461bcd60e51b815260040161051490615a00565b5f805b60208110156136a15761366381601f615961565b61366e906008615744565b8761367a83600661570f565b8151811061368a5761368a61550c565b016020015160f81c901b919091179060010161364f565b505f866026815181106136b6576136b661550c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615c928339815191529061ffff861610801590613722575061271061ffff861611155b61373e5760405162461bcd60e51b815260040161051490615a72565b60028101546001600160401b0390811690851610156137b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b805483101561381a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156138815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61388b84613f83565b90505f61389782610a1b565b90505f6138a48983613fa6565b905060405180606001604052806138b83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461396e5760405162461bcd60e51b815260040161051490615974565b5f805b60028110156139bd57613985816001615961565b613990906008615744565b61ffff168582815181106139a6576139a661550c565b016020015160f81c901b9190911790600101613971565b5061ffff8116156139e05760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613a3b576139f7816003615961565b613a02906008615744565b63ffffffff1686613a1483600261570f565b81518110613a2457613a2461550c565b016020015160f81c901b91909117906001016139e3565b5063ffffffff8116600514613a625760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015613ab757613a7981601f615961565b613a84906008615744565b87613a9083600661570f565b81518110613aa057613aa061550c565b016020015160f81c901b9190911790600101613a65565b505f805b6008811015613b1657613acf816007615961565b613ada906008615744565b6001600160401b031688613aef83602661570f565b81518110613aff57613aff61550c565b016020015160f81c901b9190911790600101613abb565b5090969095509350505050565b5f80516020615cd28339815191525f6001600160401b038084169085161115613b5757613b508385615377565b9050613b64565b613b618484615377565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613bc6575060028401548151613bc2916001600160401b03169061570f565b8210155b15613bec576001600160401b038316606082015281815260408101516020820152613c0b565b8281606001818151613bfe919061575b565b6001600160401b03169052505b6060810151613c1b906064615a47565b602082015160028601546001600160401b039290921691613c469190600160401b900460ff16615744565b1015613caa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613cc5919061570f565b9052506040810180516001600160401b0387169190613ce5908390615961565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d128339815191526020526040812060020180545f80516020615cd283398151915291600160401b9091046001600160401b0316906008613d7b83615abd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e0a57604051631afcd79f60e31b815260040160405180910390fd5b565b613e14613dc1565b613e1d8161450b565b613e25614524565b613e80608082013560a0830135613e4260e0850160c086016151ea565b613e53610100860160e08701615ad8565b61ffff16613e6961012087016101008801615af1565b613e7b610140880161012089016154ac565b614534565b50565b613e8b613dc1565b5f80516020615c728339815191526001600160a01b038216613f045760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ddb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614778565b5f610a2b825f80516020615c72833981519152546001600160a01b0316906147d9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615cd28339815191524261405060408601602087016151ea565b6001600160401b0316116140c25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b6140d260408501602086016151ea565b6001600160401b03166140e86202a3004261570f565b1161415b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356141b35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156141e25760405162461bcd60e51b815260040161051490615667565b60306141f16040860186615b11565b9050146142565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614260835f613b23565b5f806142fa6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906142a591906151ea565b6001600160401b031681526020016142c060408a018a615b11565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061493b565b5f828152600786016020526040902091935091506143188282615b97565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143459085906004016153d0565b6020604051808303815f875af1158015614361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143859190615397565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143fd576143fd615223565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144dd918e01908e016151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614513613dc1565b61451b614cea565b613e8081614cf2565b61452c613dc1565b613e0a614e94565b61453c613dc1565b5f80516020615c92833981519152836145a85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b6127108411156145ca5760405162461bcd60e51b815260040161051490615a72565b858711156146325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff161161469f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61478c6001600160a01b03841683614e9c565b905080515f141580156147b05750808060200190518101906147ae9190615c56565b155b15611ddb57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148439190615397565b905061485a6001600160a01b038516333086614ea9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c29190615397565b90508181116149285760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149328282615961565b95945050505050565b5f60608260800151516030146149a55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614a1c576149dc816001615961565b6149e7906008615744565b5081515f908390839081106149fe576149fe61550c565b60200101906001600160f81b03191690815f1a9053506001016149c8565b505f5b6004811015614a8457614a33816003615961565b614a3e906008615744565b600160ff919091161c60f81b82614a5683600261570f565b81518110614a6657614a6661550c565b60200101906001600160f81b03191690815f1a905350600101614a1f565b505f5b6020811015614ae15784518160208110614aa357614aa361550c565b1a60f81b82614ab383600661570f565b81518110614ac357614ac361550c565b60200101906001600160f81b03191690815f1a905350600101614a87565b505f5b6020811015614b415784602001518160208110614b0357614b0361550c565b1a60f81b82614b1383602661570f565b81518110614b2357614b2361550c565b60200101906001600160f81b03191690815f1a905350600101614ae4565b505f5b6008811015614bb557614b58816007615961565b614b63906008615744565b60ff1685604001516001600160401b0316901c60f81b82826046614b87919061570f565b81518110614b9757614b9761550c565b60200101906001600160f81b03191690815f1a905350600101614b44565b505f5b6030811015614c205784608001518181518110614bd757614bd761550c565b01602001516001600160f81b03191682614bf283604e61570f565b81518110614c0257614c0261550c565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c9257614c37816007615961565b614c42906008615744565b60608601516001600160401b0390811691161c60f81b82614c6483607e61570f565b81518110614c7457614c7461550c565b60200101906001600160f81b03191690815f1a905350600101614c23565b50600281604051614ca391906156fe565b602060405180830381855afa158015614cbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ce19190615397565b94909350915050565b613e0a613dc1565b614cfa613dc1565b80355f80516020615cd283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614d466080840160608501615af1565b60ff161115614db35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614dc46080840160608501615af1565b60ff1611614e2c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614e3c6080830160608401615af1565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614e6d60608301604084016151ea565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613168613dc1565b60606124f083835f614ee2565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613f51565b606081471015614f075760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614f2291906156fe565b5f6040518083038185875af1925050503d805f8114614f5c576040519150601f19603f3d011682016040523d82523d5f602084013e614f61565b606091505b509150915061216f868383606082614f8157614f7c82614fc8565b6124f0565b8151158015614f9857506001600160a01b0384163b155b15614fc157604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b50806124f0565b805115614fd85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ffd9061577b565b5f825580601f1061500c575050565b601f0160209004905f5260205f2090810190613e809190615064565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615078575f8155600101615065565b5090565b8015158114613e80575f80fd5b803563ffffffff8116811461509c575f80fd5b919050565b5f805f606084860312156150b3575f80fd5b8335925060208401356150c58161507c565b91506150d360408501615089565b90509250925092565b5f602082840312156150ec575f80fd5b5035919050565b6001600160a01b0381168114613e80575f80fd5b5f8082840361016081121561511a575f80fd5b61014080821215615129575f80fd5b849350830135905061513a816150f3565b809150509250929050565b5f60208284031215615155575f80fd5b6124f082615089565b5f806040838503121561516f575f80fd5b61517883615089565b946020939093013593505050565b5f8060408385031215615197575f80fd5b82356001600160401b038111156151ac575f80fd5b8301608081860312156151bd575f80fd5b91506151cb60208401615089565b90509250929050565b80356001600160401b038116811461509c575f80fd5b5f602082840312156151fa575f80fd5b6124f0826151d4565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061525a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161529560608401826001600160401b03169052565b5060808301516152b060808401826001600160401b03169052565b5060a08301516152cb60a08401826001600160401b03169052565b5060c08301516152e660c08401826001600160401b03169052565b5092915050565b803561ffff8116811461509c575f80fd5b5f805f8060808587031215615311575f80fd5b84356001600160401b03811115615326575f80fd5b850160608188031215615337575f80fd5b9350615345602086016152ed565b9250615353604086016151d4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152e6576152e6615363565b5f602082840312156153a7575f80fd5b5051919050565b5f5b838110156153c85781810151838201526020016153b0565b50505f910152565b602081525f82518060208401526153ee8160408501602087016153ae565b601f01601f19169190910160400192915050565b5f8261541c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156154bc575f80fd5b81356124f0816150f3565b5f808335601e198436030181126154dc575f80fd5b8301803591506001600160401b038211156154f5575f80fd5b6020019150600581901b36038213156122c9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615534575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155745761557461553e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156155a2576155a261553e565b604052919050565b5f6001600160401b038211156155c2576155c261553e565b50601f01601f191660200190565b5f606082360312156155e0575f80fd5b6155e8615552565b8235815260206155f98185016151d4565b8183015260408401356001600160401b03811115615615575f80fd5b840136601f820112615625575f80fd5b8035615638615633826155aa565b61557a565b818152368483850101111561564b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516156c0818460208a016153ae565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156f08160288401602088016153ae565b016028019695505050505050565b5f82516155348184602087016153ae565b80820180821115610a2b57610a2b615363565b5f63ffffffff80831681810361573a5761573a615363565b6001019392505050565b8082028115828204841417610a2b57610a2b615363565b6001600160401b038181168382160190808211156152e6576152e6615363565b600181811c9082168061578f57607f821691505b6020821081036157ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461580c8161577b565b806020870152604060018084165f811461582d576001811461584957615876565b60ff19851660408a0152604084151560051b8a01019550615876565b895f5260205f205f5b8581101561586d5781548b8201860152908301908801615852565b8a016040019650505b509398975050505050505050565b805161509c8161507c565b5f80604083850312156158a0575f80fd5b82516001600160401b03808211156158b6575f80fd5b90840190606082870312156158c9575f80fd5b6158d1615552565b825181526020808401516158e4816150f3565b828201526040840151838111156158f9575f80fd5b80850194505087601f85011261590d575f80fd5b8351925061591d615633846155aa565b8381528882858701011115615930575f80fd5b61593f848383018488016153ae565b80604084015250819550615954818801615884565b9450505050509250929050565b81810381811115610a2b57610a2b615363565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a6a57615a6a615363565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361573a5761573a615363565b5f60208284031215615ae8575f80fd5b6124f0826152ed565b5f60208284031215615b01575f80fd5b813560ff811681146124f0575f80fd5b5f808335601e19843603018112615b26575f80fd5b8301803591506001600160401b03821115615b3f575f80fd5b6020019150368190038213156122c9575f80fd5b601f821115611ddb57805f5260205f20601f840160051c81016020851015615b785750805b601f840160051c820191505b81811015610ba9575f8155600101615b84565b81516001600160401b03811115615bb057615bb061553e565b615bc481615bbe845461577b565b84615b53565b602080601f831160018114615bf7575f8415615be05750858301515b5f19600386901b1c1916600185901b178555615c4e565b5f85815260208120601f198616915b82811015615c2557888601518255948401946001909101908401615c06565b5085821015615c4257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615c66575f80fd5b81516124f08161507c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615f2d380380615f2d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615de08061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004615143565b6103bf565b005b61018461019436600461517e565b610862565b6101d76101a736600461517e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b61021761021236600461517e565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d3660046151a9565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c3660046151e7565b610b10565b61018461027f366004615200565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615228565b610d85565b6101d76102c236600461528c565b6113b9565b6102176102d536600461517e565b6113d2565b6101846102e8366004615143565b6113e6565b6101f2603081565b610184610303366004615200565b6115f2565b6101d76103163660046152a5565b611904565b6101846103293660046151e7565b611930565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b61018461036236600461517e565b611ae8565b61018461037536600461517e565b611d6e565b6101f2601481565b61039561039036600461517e565b611e82565b6040516101e191906152d9565b6102176202a30081565b6101d76103ba3660046153a0565b611f4a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615d34833981519152949193919290829060ff166004811115610427576104276152c5565b6004811115610438576104386152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611e82565b90506002825160048111156104cb576104cb6152c5565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615d548339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615d548339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e6152c5565b036105f55786156105b6576105b38487611f7f565b90505b5f836060015183608001516105cb9190615419565b90506105d7858261221b565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615439565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c6152c5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff1660058111156108af576108af6152c5565b60058111156108c0576108c06152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f6152c5565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f612372565b6040518263ffffffff1660e01b81526004016109d59190615472565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615439565b50505050565b5f610a2b64e8d4a51000836154a4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac38484612599565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615d348339815191525f80610b29846125b3565b91509150610b36826128fd565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e6152c5565b03610b93575f83815260088501602052604081208054919055610b918282612938565b505b610ba981610ba484604001516113b9565b6129ae565b5050505050565b5f80516020615d348339815191525f610bc8846129d1565b90505f80610bd98360400151612bab565b50915091505f610be883611e82565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b8152600401610514906154c3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615505565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b6152c5565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615d748339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615439565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc606085016040860161554e565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c6060850185615569565b91505f9050843560208601356014610f9a6060890160408a0161554e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a6060890189615569565b8363ffffffff16818110611030576110306155ae565b905060200281019061104291906155c2565b61104b90615672565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615709565b84825f0151836020015184604001516040516020016110a09493929190615751565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906157a0565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615439565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b86152c5565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b9116866157b1565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c2906157c4565b9050610ffe565b50600584018190555f6112db866129d1565b90505f6112eb8260400151612de6565b9050806002856040516112fe91906157a0565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615439565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a510006157e6565b5f6113dc82611e82565b6080015192915050565b5f80516020615d348339815191525f6113fe85612f58565b9050611409856128fd565b611414575050505050565b5f85815260058301602052604090205460a082015161144391600160b01b90046001600160401b0316906157fd565b6001600160401b03168160c001516001600160401b031610156114c45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114d58685611f7f565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061152c906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190615439565b5f878152600885016020526040812080549091906115e59084906157b1565b9091555050505050505050565b6115fa6131d3565b5f80516020615d348339815191525f611612846129d1565b90505f806116238360400151612bab565b50915091505f61163283611e82565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561166c5761166c6152c5565b600481111561167d5761167d6152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561171c5760405162461bcd60e51b8152600401610514906154c3565b826001600160401b03168160e001516001600160401b031611156117525760405162461bcd60e51b815260040161051490615505565b600381516004811115611767576117676152c5565b146117bb5760405162461bcd60e51b815260206004820152603160248201525f80516020615d548339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a01909252822054909190612710906118119061ffff600160a01b90910416846157e6565b61181b91906154a4565b905080886008015f8881526020019081526020015f205f82825461183f91906157b1565b9091555050602083015161185c90611857838561581d565b612938565b6118718360200151610ba485606001516113b9565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a4505050505050505061190060015f80516020615d9483398151915255565b5050565b5f61190d6131d3565b61191883338461321d565b9050610a2b60015f80516020615d9483398151915255565b5f80516020615d748339815191525f611948836129d1565b90505f8061195983604001516135d7565b91509150806119bb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119d590615830565b9050118015611a07575060015f83815260088601602052604090205460ff166005811115611a0557611a056152c5565b145b611a235760405162461bcd60e51b815260040161051490615868565b5f8281526007850160205260408120611a3b91615093565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615d3483398151915293929190829060ff166004811115611b4957611b496152c5565b6004811115611b5a57611b5a6152c5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611be157611be16152c5565b1480611bff5750600381516004811115611bfd57611bfd6152c5565b145b611c535760405162461bcd60e51b815260206004820152603260248201525f80516020615d54833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611c618260400151611e82565b905080606001516001600160401b03165f03611ce55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611d12846040015184606001518560800151612372565b6040518263ffffffff1660e01b8152600401611d2e9190615472565b6020604051808303815f875af1158015611d4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615439565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615d74833981519152929190611db690615830565b9050118015611de8575060015f83815260088301602052604090205460ff166005811115611de657611de66152c5565b145b611e045760405162461bcd60e51b815260040161051490615868565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611e3d91906004016158af565b6020604051808303815f875af1158015611e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7d9190615439565b505050565b611e8a6150ca565b5f8281525f80516020615db4833981519152602052604090819020815160e0810190925280545f80516020615d74833981519152929190829060ff166005811115611ed757611ed76152c5565b6005811115611ee857611ee86152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611f536131d3565b611f5f85858585613778565b9050611f7760015f80516020615d9483398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611fca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ff19190810190615944565b91509150806120545760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120bb9190615439565b82511461211f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156121955760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f806121a484604001516139ed565b915091508187146122115760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615db4833981519152602052604081206002015481905f80516020615d7483398151915290600160801b90046001600160401b03166122638582613bc5565b5f61226d87613dd3565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6122bd8a858b612372565b6040518263ffffffff1660e01b81526004016122d99190615472565b6020604051808303815f875af11580156122f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123199190615439565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156123eb576123ab81600161581d565b6123b69060086157e6565b5081515f908390839081106123cd576123cd6155ae565b60200101906001600160f81b03191690815f1a905350600101612397565b505f5b60048110156124565761240281600361581d565b61240d9060086157e6565b600263ffffffff16901c60f81b8282600261242891906157b1565b81518110612438576124386155ae565b60200101906001600160f81b03191690815f1a9053506001016123ee565b505f5b60208110156124b85761246d81601f61581d565b6124789060086157e6565b86901c60f81b8261248a8360066157b1565b8151811061249a5761249a6155ae565b60200101906001600160f81b03191690815f1a905350600101612459565b505f5b6008811015612523576124cf81600761581d565b6124da9060086157e6565b6001600160401b038616901c60f81b826124f58360266157b1565b81518110612505576125056155ae565b60200101906001600160f81b03191690815f1a9053506001016124bb565b505f5b600881101561258e5761253a81600761581d565b6125459060086157e6565b6001600160401b038516901c60f81b8261256083602e6157b1565b81518110612570576125706155ae565b60200101906001600160f81b03191690815f1a905350600101612526565b5090505b9392505050565b6125a1613e63565b6125aa82613eae565b61190081613f25565b5f6125bc6150ca565b5f80516020615d748339815191525f6125d4856129d1565b90505f806125e583604001516135d7565b91509150801561264a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561267b5761267b6152c5565b600581111561268c5761268c6152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156126fd576126fd6152c5565b148061271b5750600182516005811115612719576127196152c5565b145b61277a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b60038251600581111561278f5761278f6152c5565b0361279c575060046127a0565b5060055b6020808301515f908152600988019091526040812055818160058111156127c9576127c96152c5565b908160058111156127dc576127dc6152c5565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612810576128106152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156128c4576128c46152c5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615d1483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612993575f80fd5b505af11580156129a5573d5f803e3d5ffd5b50505050505050565b5f80516020615d1483398151915254611900906001600160a01b03168383613fc6565b60408051606080820183525f8083526020830181905292820152905f80516020615d748339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a6d9190810190615944565b9150915080612acd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612b305760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612ba35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612bcf5760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612c1e57612be681600161581d565b612bf19060086157e6565b61ffff16868281518110612c0757612c076155ae565b016020015160f81c901b9190911790600101612bd2565b5061ffff811615612c415760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612c9c57612c5881600361581d565b612c639060086157e6565b63ffffffff1687612c758360026157b1565b81518110612c8557612c856155ae565b016020015160f81c901b9190911790600101612c44565b5063ffffffff8116600414612cc35760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612d1857612cda81601f61581d565b612ce59060086157e6565b88612cf18360066157b1565b81518110612d0157612d016155ae565b016020015160f81c901b9190911790600101612cc6565b505f805b6008811015612d7757612d3081600761581d565b612d3b9060086157e6565b6001600160401b031689612d508360266157b1565b81518110612d6057612d606155ae565b016020015160f81c901b9190911790600101612d1c565b505f805b6008811015612dd657612d8f81600761581d565b612d9a9060086157e6565b6001600160401b03168a612daf83602e6157b1565b81518110612dbf57612dbf6155ae565b016020015160f81c901b9190911790600101612d7b565b5091989097509095509350505050565b5f8151602614612e085760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612e5757612e1f81600161581d565b612e2a9060086157e6565b61ffff16848281518110612e4057612e406155ae565b016020015160f81c901b9190911790600101612e0b565b5061ffff811615612e7a5760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612ed557612e9181600361581d565b612e9c9060086157e6565b63ffffffff1685612eae8360026157b1565b81518110612ebe57612ebe6155ae565b016020015160f81c901b9190911790600101612e7d565b5063ffffffff811615612efa5760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612f4f57612f1181601f61581d565b612f1c9060086157e6565b86612f288360066157b1565b81518110612f3857612f386155ae565b016020015160f81c901b9190911790600101612efd565b50949350505050565b612f606150ca565b5f8281525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff166005811115612fad57612fad6152c5565b6005811115612fbe57612fbe6152c5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613030576130306152c5565b1461308c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156130d0576130d06152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61317c858261221b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615d9483398151915280546001190161320457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615d9483398151915255565b5f5f80516020615d348339815191528161323961021285614025565b90505f61324587611e82565b9050613250876128fd565b6132ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b6002815160058111156132c2576132c26152c5565b146133215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f82826080015161333291906157fd565b60048501546040840151919250613354916001600160401b0390911690615ae9565b6001600160401b0316816001600160401b031611156133d35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f806133df8a8461221b565b915091505f8a8360405160200161340d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156134a8576134a86152c5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135fa5760405162461bcd60e51b815260040161051490615a16565b5f805b60028110156136495761361181600161581d565b61361c9060086157e6565b61ffff16858281518110613632576136326155ae565b016020015160f81c901b91909117906001016135fd565b5061ffff81161561366c5760405162461bcd60e51b815260040161051490615a5f565b5f805b60048110156136c75761368381600361581d565b61368e9060086157e6565b63ffffffff16866136a08360026157b1565b815181106136b0576136b06155ae565b016020015160f81c901b919091179060010161366f565b5063ffffffff81166003146136ee5760405162461bcd60e51b815260040161051490615aa2565b5f805b60208110156137435761370581601f61581d565b6137109060086157e6565b8761371c8360066157b1565b8151811061372c5761372c6155ae565b016020015160f81c901b91909117906001016136f1565b505f86602681518110613758576137586155ae565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615d348339815191529061ffff8616108015906137c4575061271061ffff861611155b6137e05760405162461bcd60e51b815260040161051490615b14565b60028101546001600160401b0390811690851610156138595760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b80548310156138bc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156139235760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61392d84614025565b90505f61393982610a1b565b90505f6139468983614048565b9050604051806060016040528061395a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613a105760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015613a5f57613a2781600161581d565b613a329060086157e6565b61ffff16858281518110613a4857613a486155ae565b016020015160f81c901b9190911790600101613a13565b5061ffff811615613a825760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015613add57613a9981600361581d565b613aa49060086157e6565b63ffffffff1686613ab68360026157b1565b81518110613ac657613ac66155ae565b016020015160f81c901b9190911790600101613a85565b5063ffffffff8116600514613b045760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015613b5957613b1b81601f61581d565b613b269060086157e6565b87613b328360066157b1565b81518110613b4257613b426155ae565b016020015160f81c901b9190911790600101613b07565b505f805b6008811015613bb857613b7181600761581d565b613b7c9060086157e6565b6001600160401b031688613b918360266157b1565b81518110613ba157613ba16155ae565b016020015160f81c901b9190911790600101613b5d565b5090969095509350505050565b5f80516020615d748339815191525f6001600160401b038084169085161115613bf957613bf28385615419565b9050613c06565b613c038484615419565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613c68575060028401548151613c64916001600160401b0316906157b1565b8210155b15613c8e576001600160401b038316606082015281815260408101516020820152613cad565b8281606001818151613ca091906157fd565b6001600160401b03169052505b6060810151613cbd906064615ae9565b602082015160028601546001600160401b039290921691613ce89190600160401b900460ff166157e6565b1015613d4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613d6791906157b1565b9052506040810180516001600160401b0387169190613d8790839061581d565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615db48339815191526020526040812060020180545f80516020615d7483398151915291600160401b9091046001600160401b0316906008613e1d83615b5f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613eac57604051631afcd79f60e31b815260040160405180910390fd5b565b613eb6613e63565b613ebf816145ad565b613ec76145c6565b613f22608082013560a0830135613ee460e0850160c0860161528c565b613ef5610100860160e08701615b7a565b61ffff16613f0b61012087016101008801615b93565b613f1d6101408801610120890161554e565b6145d6565b50565b613f2d613e63565b5f80516020615d148339815191526001600160a01b038216613fa65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611e7d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061481a565b5f610a2b825f80516020615d14833981519152546001600160a01b03169061487b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140d35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615d74833981519152426140f2604086016020870161528c565b6001600160401b0316116141645760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b614174604085016020860161528c565b6001600160401b031661418a6202a300426157b1565b116141fd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356142555760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156142845760405162461bcd60e51b815260040161051490615709565b60306142936040860186615bb3565b9050146142f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614302835f613bc5565b5f8061439c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614347919061528c565b6001600160401b0316815260200161436260408a018a615bb3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149dd565b5f828152600786016020526040902091935091506143ba8282615c39565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143e7908590600401615472565b6020604051808303815f875af1158015614403573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144279190615439565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561449f5761449f6152c5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161457f918e01908e0161528c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6145b5613e63565b6145bd614d8c565b613f2281614d94565b6145ce613e63565b613eac614f36565b6145de613e63565b5f80516020615d348339815191528361464a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b61271084111561466c5760405162461bcd60e51b815260040161051490615b14565b858711156146d45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff16116147415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147b35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61482e6001600160a01b03841683614f3e565b905080515f141580156148525750808060200190518101906148509190615cf8565b155b15611e7d57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e59190615439565b90506148fc6001600160a01b038516333086614f4b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614940573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149649190615439565b90508181116149ca5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149d4828261581d565b95945050505050565b5f6060826080015151603014614a475760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614abe57614a7e81600161581d565b614a899060086157e6565b5081515f90839083908110614aa057614aa06155ae565b60200101906001600160f81b03191690815f1a905350600101614a6a565b505f5b6004811015614b2657614ad581600361581d565b614ae09060086157e6565b600160ff919091161c60f81b82614af88360026157b1565b81518110614b0857614b086155ae565b60200101906001600160f81b03191690815f1a905350600101614ac1565b505f5b6020811015614b835784518160208110614b4557614b456155ae565b1a60f81b82614b558360066157b1565b81518110614b6557614b656155ae565b60200101906001600160f81b03191690815f1a905350600101614b29565b505f5b6020811015614be35784602001518160208110614ba557614ba56155ae565b1a60f81b82614bb58360266157b1565b81518110614bc557614bc56155ae565b60200101906001600160f81b03191690815f1a905350600101614b86565b505f5b6008811015614c5757614bfa81600761581d565b614c059060086157e6565b60ff1685604001516001600160401b0316901c60f81b82826046614c2991906157b1565b81518110614c3957614c396155ae565b60200101906001600160f81b03191690815f1a905350600101614be6565b505f5b6030811015614cc25784608001518181518110614c7957614c796155ae565b01602001516001600160f81b03191682614c9483604e6157b1565b81518110614ca457614ca46155ae565b60200101906001600160f81b03191690815f1a905350600101614c5a565b505f5b6008811015614d3457614cd981600761581d565b614ce49060086157e6565b60608601516001600160401b0390811691161c60f81b82614d0683607e6157b1565b81518110614d1657614d166155ae565b60200101906001600160f81b03191690815f1a905350600101614cc5565b50600281604051614d4591906157a0565b602060405180830381855afa158015614d60573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d839190615439565b94909350915050565b613eac613e63565b614d9c613e63565b80355f80516020615d7483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614de86080840160608501615b93565b60ff161115614e555760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614e666080840160608501615b93565b60ff1611614ece5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614ede6080830160608401615b93565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f0f606083016040840161528c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61320a613e63565b606061259283835f614f84565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613ff3565b606081471015614fa95760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614fc491906157a0565b5f6040518083038185875af1925050503d805f8114614ffe576040519150601f19603f3d011682016040523d82523d5f602084013e615003565b606091505b50915091506122118683836060826150235761501e8261506a565b612592565b815115801561503a57506001600160a01b0384163b155b1561506357604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b5080612592565b80511561507a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461509f90615830565b5f825580601f106150ae575050565b601f0160209004905f5260205f2090810190613f229190615106565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561511a575f8155600101615107565b5090565b8015158114613f22575f80fd5b803563ffffffff8116811461513e575f80fd5b919050565b5f805f60608486031215615155575f80fd5b8335925060208401356151678161511e565b91506151756040850161512b565b90509250925092565b5f6020828403121561518e575f80fd5b5035919050565b6001600160a01b0381168114613f22575f80fd5b5f808284036101608112156151bc575f80fd5b610140808212156151cb575f80fd5b84935083013590506151dc81615195565b809150509250929050565b5f602082840312156151f7575f80fd5b6125928261512b565b5f8060408385031215615211575f80fd5b61521a8361512b565b946020939093013593505050565b5f8060408385031215615239575f80fd5b82356001600160401b0381111561524e575f80fd5b83016080818603121561525f575f80fd5b915061526d6020840161512b565b90509250929050565b80356001600160401b038116811461513e575f80fd5b5f6020828403121561529c575f80fd5b61259282615276565b5f80604083850312156152b6575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106152fc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161533760608401826001600160401b03169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538860c08401826001600160401b03169052565b5092915050565b803561ffff8116811461513e575f80fd5b5f805f80608085870312156153b3575f80fd5b84356001600160401b038111156153c8575f80fd5b8501606081880312156153d9575f80fd5b93506153e76020860161538f565b92506153f560408601615276565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561538857615388615405565b5f60208284031215615449575f80fd5b5051919050565b5f5b8381101561546a578181015183820152602001615452565b50505f910152565b602081525f8251806020840152615490816040850160208701615450565b601f01601f19169190910160400192915050565b5f826154be57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561555e575f80fd5b813561259281615195565b5f808335601e1984360301811261557e575f80fd5b8301803591506001600160401b03821115615597575f80fd5b6020019150600581901b360382131561236b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155d6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615616576156166155e0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615644576156446155e0565b604052919050565b5f6001600160401b03821115615664576156646155e0565b50601f01601f191660200190565b5f60608236031215615682575f80fd5b61568a6155f4565b82358152602061569b818501615276565b8183015260408401356001600160401b038111156156b7575f80fd5b840136601f8201126156c7575f80fd5b80356156da6156d58261564c565b61561c565b81815236848385010111156156ed575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615762818460208a01615450565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615792816028840160208801615450565b016028019695505050505050565b5f82516155d6818460208701615450565b80820180821115610a2b57610a2b615405565b5f63ffffffff8083168181036157dc576157dc615405565b6001019392505050565b8082028115828204841417610a2b57610a2b615405565b6001600160401b0381811683821601908082111561538857615388615405565b81810381811115610a2b57610a2b615405565b600181811c9082168061584457607f821691505b60208210810361586257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546158c181615830565b806020870152604060018084165f81146158e257600181146158fe5761592b565b60ff19851660408a0152604084151560051b8a0101955061592b565b895f5260205f205f5b858110156159225781548b8201860152908301908801615907565b8a016040019650505b509398975050505050505050565b805161513e8161511e565b5f8060408385031215615955575f80fd5b82516001600160401b038082111561596b575f80fd5b908401906060828703121561597e575f80fd5b6159866155f4565b8251815260208084015161599981615195565b828201526040840151838111156159ae575f80fd5b80850194505087601f8501126159c2575f80fd5b835192506159d26156d58461564c565b83815288828587010111156159e5575f80fd5b6159f484838301848801615450565b80604084015250819550615a09818801615939565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615b0c57615b0c615405565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036157dc576157dc615405565b5f60208284031215615b8a575f80fd5b6125928261538f565b5f60208284031215615ba3575f80fd5b813560ff81168114612592575f80fd5b5f808335601e19843603018112615bc8575f80fd5b8301803591506001600160401b03821115615be1575f80fd5b60200191503681900382131561236b575f80fd5b601f821115611e7d57805f5260205f20601f840160051c81016020851015615c1a5750805b601f840160051c820191505b81811015610ba9575f8155600101615c26565b81516001600160401b03811115615c5257615c526155e0565b615c6681615c608454615830565b84615bf5565b602080601f831160018114615c99575f8415615c825750858301515b5f19600386901b1c1916600185901b178555615cf0565b5f85815260208120601f198616915b82811015615cc757888601518255948401946001909101908401615ca8565b5085821015615ce457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615d08575f80fd5b81516125928161511e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 9cf250ac3..ce232b703 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615b3d380380615b3d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159f08061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614df0565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614e2b565b61099e565b3480156101ca575f80fd5b506102096101d9366004614e2b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614e42565b610b57565b34801561026c575f80fd5b5061028061027b366004614e2b565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614e80565b610c4a565b348015610310575f80fd5b5061019e61031f366004614ed4565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614eed565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614f15565b610ef3565b348015610396575f80fd5b506102096103a5366004614f63565b611527565b3480156103b5575f80fd5b506102806103c4366004614e2b565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614df0565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614eed565b61174e565b348015610426575f80fd5b5061019e610435366004614ed4565b6119d0565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614e2b565b611b88565b34801561047e575f80fd5b5061019e61048d366004614e2b565b611e0e565b6102096104a0366004614e2b565b611f22565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614e2b565b611f53565b6040516102139190614f90565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615944833981519152949193919290829060ff16600481111561056357610563614f7c565b600481111561057457610574614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611f53565b905060028251600481111561060757610607614f7c565b146106595760405162461bcd60e51b815260206004820152602a60248201525f805160206159648339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f805160206159648339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da614f7c565b036107315786156106f2576106ef848761201b565b90505b5f83606001518360800151610707919061505a565b905061071385826122b7565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061507a565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561087857610878614f7c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156109eb576109eb614f7c565b60058111156109fc576109fc614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b614f7c565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f61240e565b6040518263ffffffff1660e01b8152600401610b1191906150b3565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061507a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be883612633565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a51000836150e5565b92915050565b5f610c53612647565b610c5f8484843461267e565b9050610c7760015f805160206159a483398151915255565b9392505050565b5f805160206159448339815191525f80610c97846128fb565b91509150610ca482612c45565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc614f7c565b03610d01575f83815260088501602052604081208054919055610cff8282612c80565b505b610d1781610d128460400151611527565b612ce6565b5050505050565b5f805160206159448339815191525f610d3684612cf9565b90505f80610d478360400151612ed3565b50915091505f610d5683611f53565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b815260040161065090615104565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b815260040161065090615146565b60015f87815260068701602052604090205460ff166004811115610df957610df9614f7c565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206159848339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061507a565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a60608501604086016151a3565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea60608501856151be565b91505f90508435602086013560146111086060890160408a016151a3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f61118860608901896151be565b8363ffffffff1681811061119e5761119e615203565b90506020028101906111b09190615217565b6111b9906152c7565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b81526004016106509061535e565b84825f01518360200151846040015160405160200161120e94939291906153a6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c91906153f5565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061507a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561132657611326614f7c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d9911686615406565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061143090615419565b905061116c565b50600584018190555f61144986612cf9565b90505f611459826040015161310e565b90508060028560405161146c91906153f5565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061507a565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a5100061543b565b5f61154a82611f53565b6080015192915050565b5f805160206159448339815191525f61156c85613277565b5f86815260058401602052604090205460a082015191925061159f91600160b01b9091046001600160401b031690615452565b6001600160401b03168160c001516001600160401b031610156116205760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f611631868561201b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061168890611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611722919061507a565b5f87815260088501602052604081208054909190611741908490615406565b9091555050505050505050565b611756612647565b5f805160206159448339815191525f61176e84612cf9565b90505f8061177f8360400151612ed3565b50915091505f61178e83611f53565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117c8576117c8614f7c565b60048111156117d9576117d9614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156118785760405162461bcd60e51b815260040161065090615104565b826001600160401b03168160e001516001600160401b031611156118ae5760405162461bcd60e51b815260040161065090615146565b6003815160048111156118c3576118c3614f7c565b146119175760405162461bcd60e51b815260206004820152603160248201525f805160206159648339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a019092529091205461194d9190612c80565b856007015f8881526020019081526020015f205f90556119788160200151610d128360600151611527565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506119cc60015f805160206159a483398151915255565b5050565b5f805160206159848339815191525f6119e883612cf9565b90505f806119f983604001516134f2565b9150915080611a5b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611a7590615472565b9050118015611aa7575060015f83815260088601602052604090205460ff166005811115611aa557611aa5614f7c565b145b611ac35760405162461bcd60e51b8152600401610650906154a4565b5f8281526007850160205260408120611adb91614d45565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061594483398151915293929190829060ff166004811115611be957611be9614f7c565b6004811115611bfa57611bfa614f7c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611c8157611c81614f7c565b1480611c9f5750600381516004811115611c9d57611c9d614f7c565b145b611cf35760405162461bcd60e51b815260206004820152603260248201525f80516020615964833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611d018260400151611f53565b905080606001516001600160401b03165f03611d855760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611db284604001518460600151856080015161240e565b6040518263ffffffff1660e01b8152600401611dce91906150b3565b6020604051808303815f875af1158015611dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061507a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615984833981519152929190611e5690615472565b9050118015611e88575060015f83815260088301602052604090205460ff166005811115611e8657611e86614f7c565b145b611ea45760405162461bcd60e51b8152600401610650906154a4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611edd91906004016154eb565b6020604051808303815f875af1158015611ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1d919061507a565b505050565b5f611f2b612647565b611f36823334613693565b9050611f4e60015f805160206159a483398151915255565b919050565b611f5b614d7c565b5f8281525f805160206159c4833981519152602052604090819020815160e0810190925280545f80516020615984833981519152929190829060ff166005811115611fa857611fa8614f7c565b6005811115611fb957611fb9614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612066573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208d9190810190615580565b91509150806120f05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612133573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612157919061507a565b8251146121bb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122315760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122408460400151613a4a565b915091508187146122ad5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f805160206159c4833981519152602052604081206002015481905f8051602061598483398151915290600160801b90046001600160401b03166122ff8582613c22565b5f61230987613e30565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123598a858b61240e565b6040518263ffffffff1660e01b815260040161237591906150b3565b6020604051808303815f875af1158015612391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b5919061507a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561248757612447816001615652565b61245290600861543b565b5081515f9083908390811061246957612469615203565b60200101906001600160f81b03191690815f1a905350600101612433565b505f5b60048110156124f25761249e816003615652565b6124a990600861543b565b600263ffffffff16901c60f81b828260026124c49190615406565b815181106124d4576124d4615203565b60200101906001600160f81b03191690815f1a90535060010161248a565b505f5b60208110156125545761250981601f615652565b61251490600861543b565b86901c60f81b82612526836006615406565b8151811061253657612536615203565b60200101906001600160f81b03191690815f1a9053506001016124f5565b505f5b60088110156125bf5761256b816007615652565b61257690600861543b565b6001600160401b038616901c60f81b82612591836026615406565b815181106125a1576125a1615203565b60200101906001600160f81b03191690815f1a905350600101612557565b505f5b600881101561262a576125d6816007615652565b6125e190600861543b565b6001600160401b038516901c60f81b826125fc83602e615406565b8151811061260c5761260c615203565b60200101906001600160f81b03191690815f1a9053506001016125c2565b50949350505050565b61263b613ec0565b61264481613f0b565b50565b5f805160206159a483398151915280546001190161267857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159448339815191529061ffff8616108015906126ca575061271061ffff861611155b6126e65760405162461bcd60e51b815260040161065090615665565b60028101546001600160401b03908116908516101561275f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156127c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f61283482610c34565b90505f6128418983613f7f565b905060405180606001604052806128553390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206159a483398151915255565b5f612904614d7c565b5f805160206159848339815191525f61291c85612cf9565b90505f8061292d83604001516134f2565b9150915080156129925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156129c3576129c3614f7c565b60058111156129d4576129d4614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612a4557612a45614f7c565b1480612a635750600182516005811115612a6157612a61614f7c565b145b612ac25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612ad757612ad7614f7c565b03612ae457506004612ae8565b5060055b6020808301515f90815260098801909152604081205581816005811115612b1157612b11614f7c565b90816005811115612b2457612b24614f7c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612b5857612b58614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612c0c57612c0c614f7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ccc575f80fd5b505af1158015612cde573d5f803e3d5ffd5b505050505050565b6119cc6001600160a01b038316826144e4565b60408051606080820183525f8083526020830181905292820152905f805160206159848339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d6e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d959190810190615580565b9150915080612df55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612e585760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612ecb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612ef75760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015612f4657612f0e816001615652565b612f1990600861543b565b61ffff16868281518110612f2f57612f2f615203565b016020015160f81c901b9190911790600101612efa565b5061ffff811615612f695760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015612fc457612f80816003615652565b612f8b90600861543b565b63ffffffff1687612f9d836002615406565b81518110612fad57612fad615203565b016020015160f81c901b9190911790600101612f6c565b5063ffffffff8116600414612feb5760405162461bcd60e51b81526004016106509061573c565b5f805b60208110156130405761300281601f615652565b61300d90600861543b565b88613019836006615406565b8151811061302957613029615203565b016020015160f81c901b9190911790600101612fee565b505f805b600881101561309f57613058816007615652565b61306390600861543b565b6001600160401b031689613078836026615406565b8151811061308857613088615203565b016020015160f81c901b9190911790600101613044565b505f805b60088110156130fe576130b7816007615652565b6130c290600861543b565b6001600160401b03168a6130d783602e615406565b815181106130e7576130e7615203565b016020015160f81c901b91909117906001016130a3565b5091989097509095509350505050565b5f81516026146131305760405162461bcd60e51b8152600401610650906156b0565b5f805b600281101561317f57613147816001615652565b61315290600861543b565b61ffff1684828151811061316857613168615203565b016020015160f81c901b9190911790600101613133565b5061ffff8116156131a25760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156131fd576131b9816003615652565b6131c490600861543b565b63ffffffff16856131d6836002615406565b815181106131e6576131e6615203565b016020015160f81c901b91909117906001016131a5565b5063ffffffff8116156132225760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561262a5761323981601f615652565b61324490600861543b565b86613250836006615406565b8151811061326057613260615203565b016020015160f81c901b9190911790600101613225565b61327f614d7c565b5f8281525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156132cc576132cc614f7c565b60058111156132dd576132dd614f7c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561334f5761334f614f7c565b146133ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156133ef576133ef614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61349b85826122b7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135155760405162461bcd60e51b8152600401610650906156b0565b5f805b60028110156135645761352c816001615652565b61353790600861543b565b61ffff1685828151811061354d5761354d615203565b016020015160f81c901b9190911790600101613518565b5061ffff8116156135875760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156135e25761359e816003615652565b6135a990600861543b565b63ffffffff16866135bb836002615406565b815181106135cb576135cb615203565b016020015160f81c901b919091179060010161358a565b5063ffffffff81166003146136095760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561365e5761362081601f615652565b61362b90600861543b565b87613637836006615406565b8151811061364757613647615203565b016020015160f81c901b919091179060010161360c565b505f8660268151811061367357613673615203565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615944833981519152816136ac84610c34565b90505f6136b887611f53565b90506136c387612c45565b6137205760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b60028151600581111561373557613735614f7c565b146137945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f8282608001516137a59190615452565b600485015460408401519192506137c7916001600160401b0390911690615783565b6001600160401b0316816001600160401b031611156138465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138528a846122b7565b915091505f8a8360405160200161388092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561391b5761391b614f7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613a6d5760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015613abc57613a84816001615652565b613a8f90600861543b565b61ffff16858281518110613aa557613aa5615203565b016020015160f81c901b9190911790600101613a70565b5061ffff811615613adf5760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015613b3a57613af6816003615652565b613b0190600861543b565b63ffffffff1686613b13836002615406565b81518110613b2357613b23615203565b016020015160f81c901b9190911790600101613ae2565b5063ffffffff8116600514613b615760405162461bcd60e51b81526004016106509061573c565b5f805b6020811015613bb657613b7881601f615652565b613b8390600861543b565b87613b8f836006615406565b81518110613b9f57613b9f615203565b016020015160f81c901b9190911790600101613b64565b505f805b6008811015613c1557613bce816007615652565b613bd990600861543b565b6001600160401b031688613bee836026615406565b81518110613bfe57613bfe615203565b016020015160f81c901b9190911790600101613bba565b5090969095509350505050565b5f805160206159848339815191525f6001600160401b038084169085161115613c5657613c4f838561505a565b9050613c63565b613c60848461505a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613cc5575060028401548151613cc1916001600160401b031690615406565b8210155b15613ceb576001600160401b038316606082015281815260408101516020820152613d0a565b8281606001818151613cfd9190615452565b6001600160401b03169052505b6060810151613d1a906064615783565b602082015160028601546001600160401b039290921691613d459190600160401b900460ff1661543b565b1015613da95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613dc49190615406565b9052506040810180516001600160401b0387169190613de4908390615652565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159c48339815191526020526040812060020180545f8051602061598483398151915291600160401b9091046001600160401b0316906008613e7a836157ae565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f0957604051631afcd79f60e31b815260040160405180910390fd5b565b613f13613ec0565b613f1c81614577565b613f24614590565b612644608082013560a0830135613f4160e0850160c08601614f63565b613f52610100860160e087016157c9565b61ffff16613f68610120870161010088016157e2565b613f7a610140880161012089016151a3565b6145a0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661400a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615984833981519152426140296040860160208701614f63565b6001600160401b03161161409b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b6140ab6040850160208601614f63565b6001600160401b03166140c16202a30042615406565b116141345760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561418c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f908152600982016020526040902054156141bb5760405162461bcd60e51b81526004016106509061535e565b60306141ca6040860186615802565b90501461422f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b614239835f613c22565b5f806142d36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061427e9190614f63565b6001600160401b0316815260200161429960408a018a615802565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147e4565b5f828152600786016020526040902091935091506142f18282615888565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061431e9085906004016150b3565b6020604051808303815f875af115801561433a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435e919061507a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143d6576143d6614f7c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144b6918e01908e01614f63565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145075760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614550576040519150601f19603f3d011682016040523d82523d5f602084013e614555565b606091505b5050905080611f1d57604051630a12f52160e11b815260040160405180910390fd5b61457f613ec0565b614587614b93565b61264481614b9b565b614598613ec0565b613f09614d3d565b6145a8613ec0565b5f80516020615944833981519152836146145760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146365760405162461bcd60e51b815260040161065090615665565b8587111561469e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff161161470b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561477d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461484e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156148c557614885816001615652565b61489090600861543b565b5081515f908390839081106148a7576148a7615203565b60200101906001600160f81b03191690815f1a905350600101614871565b505f5b600481101561492d576148dc816003615652565b6148e790600861543b565b600160ff919091161c60f81b826148ff836002615406565b8151811061490f5761490f615203565b60200101906001600160f81b03191690815f1a9053506001016148c8565b505f5b602081101561498a578451816020811061494c5761494c615203565b1a60f81b8261495c836006615406565b8151811061496c5761496c615203565b60200101906001600160f81b03191690815f1a905350600101614930565b505f5b60208110156149ea57846020015181602081106149ac576149ac615203565b1a60f81b826149bc836026615406565b815181106149cc576149cc615203565b60200101906001600160f81b03191690815f1a90535060010161498d565b505f5b6008811015614a5e57614a01816007615652565b614a0c90600861543b565b60ff1685604001516001600160401b0316901c60f81b82826046614a309190615406565b81518110614a4057614a40615203565b60200101906001600160f81b03191690815f1a9053506001016149ed565b505f5b6030811015614ac95784608001518181518110614a8057614a80615203565b01602001516001600160f81b03191682614a9b83604e615406565b81518110614aab57614aab615203565b60200101906001600160f81b03191690815f1a905350600101614a61565b505f5b6008811015614b3b57614ae0816007615652565b614aeb90600861543b565b60608601516001600160401b0390811691161c60f81b82614b0d83607e615406565b81518110614b1d57614b1d615203565b60200101906001600160f81b03191690815f1a905350600101614acc565b50600281604051614b4c91906153f5565b602060405180830381855afa158015614b67573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8a919061507a565b94909350915050565b613f09613ec0565b614ba3613ec0565b80355f8051602061598483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614bef60808401606085016157e2565b60ff161115614c5c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614c6d60808401606085016157e2565b60ff1611614cd55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614ce560808301606084016157e2565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d166060830160408401614f63565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6128e8613ec0565b508054614d5190615472565b5f825580601f10614d60575050565b601f0160209004905f5260205f20908101906126449190614db8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614dcc575f8155600101614db9565b5090565b8015158114612644575f80fd5b803563ffffffff81168114611f4e575f80fd5b5f805f60608486031215614e02575f80fd5b833592506020840135614e1481614dd0565b9150614e2260408501614ddd565b90509250925092565b5f60208284031215614e3b575f80fd5b5035919050565b5f6101408284031215614e53575f80fd5b50919050565b803561ffff81168114611f4e575f80fd5b80356001600160401b0381168114611f4e575f80fd5b5f805f60608486031215614e92575f80fd5b83356001600160401b03811115614ea7575f80fd5b840160608187031215614eb8575f80fd5b9250614ec660208501614e59565b9150614e2260408501614e6a565b5f60208284031215614ee4575f80fd5b610c7782614ddd565b5f8060408385031215614efe575f80fd5b614f0783614ddd565b946020939093013593505050565b5f8060408385031215614f26575f80fd5b82356001600160401b03811115614f3b575f80fd5b830160808186031215614f4c575f80fd5b9150614f5a60208401614ddd565b90509250929050565b5f60208284031215614f73575f80fd5b610c7782614e6a565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614fb357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614fee60608401826001600160401b03169052565b50608083015161500960808401826001600160401b03169052565b5060a083015161502460a08401826001600160401b03169052565b5060c083015161503f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561503f5761503f615046565b5f6020828403121561508a575f80fd5b5051919050565b5f5b838110156150ab578181015183820152602001615093565b50505f910152565b602081525f82518060208401526150d1816040850160208701615091565b601f01601f19169190910160400192915050565b5f826150ff57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612644575f80fd5b5f602082840312156151b3575f80fd5b8135610c778161518f565b5f808335601e198436030181126151d3575f80fd5b8301803591506001600160401b038211156151ec575f80fd5b6020019150600581901b3603821315612407575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261522b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561526b5761526b615235565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529957615299615235565b604052919050565b5f6001600160401b038211156152b9576152b9615235565b50601f01601f191660200190565b5f606082360312156152d7575f80fd5b6152df615249565b8235815260206152f0818501614e6a565b8183015260408401356001600160401b0381111561530c575f80fd5b840136601f82011261531c575f80fd5b803561532f61532a826152a1565b615271565b8181523684838501011115615342575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153b7818460208a01615091565b80830190508581526001600160401b0360c01b8560c01b16602082015283516153e7816028840160208801615091565b016028019695505050505050565b5f825161522b818460208701615091565b80820180821115610c4457610c44615046565b5f63ffffffff80831681810361543157615431615046565b6001019392505050565b8082028115828204841417610c4457610c44615046565b6001600160401b0381811683821601908082111561503f5761503f615046565b600181811c9082168061548657607f821691505b602082108103614e5357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546154fd81615472565b806020870152604060018084165f811461551e576001811461553a57615567565b60ff19851660408a0152604084151560051b8a01019550615567565b895f5260205f205f5b8581101561555e5781548b8201860152908301908801615543565b8a016040019650505b509398975050505050505050565b8051611f4e81614dd0565b5f8060408385031215615591575f80fd5b82516001600160401b03808211156155a7575f80fd5b90840190606082870312156155ba575f80fd5b6155c2615249565b825181526020808401516155d58161518f565b828201526040840151838111156155ea575f80fd5b80850194505087601f8501126155fe575f80fd5b8351925061560e61532a846152a1565b8381528882858701011115615621575f80fd5b61563084838301848801615091565b80604084015250819550615645818801615575565b9450505050509250929050565b81810381811115610c4457610c44615046565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157a6576157a6615046565b505092915050565b5f6001600160401b0380831681810361543157615431615046565b5f602082840312156157d9575f80fd5b610c7782614e59565b5f602082840312156157f2575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e19843603018112615817575f80fd5b8301803591506001600160401b03821115615830575f80fd5b602001915036819003821315612407575f80fd5b601f821115611f1d57805f5260205f20601f840160051c810160208510156158695750805b601f840160051c820191505b81811015610d17575f8155600101615875565b81516001600160401b038111156158a1576158a1615235565b6158b5816158af8454615472565b84615844565b602080601f8311600181146158e8575f84156158d15750858301515b5f19600386901b1c1916600185901b178555612cde565b5f85815260208120601f198616915b82811015615916578886015182559484019460019091019084016158f7565b508582101561593357878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615bdf380380615bdf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a928061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614e92565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614ecd565b61099e565b3480156101ca575f80fd5b506102096101d9366004614ecd565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614ee4565b610b57565b34801561026c575f80fd5b5061028061027b366004614ecd565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614f22565b610c4a565b348015610310575f80fd5b5061019e61031f366004614f76565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614f8f565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614fb7565b610ef3565b348015610396575f80fd5b506102096103a5366004615005565b611527565b3480156103b5575f80fd5b506102806103c4366004614ecd565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614e92565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614f8f565b611760565b348015610426575f80fd5b5061019e610435366004614f76565b611a72565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614ecd565b611c2a565b34801561047e575f80fd5b5061019e61048d366004614ecd565b611eb0565b6102096104a0366004614ecd565b611fc4565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614ecd565b611ff5565b6040516102139190615032565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206159e6833981519152949193919290829060ff1660048111156105635761056361501e565b60048111156105745761057461501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611ff5565b90506002825160048111156106075761060761501e565b146106595760405162461bcd60e51b815260206004820152602a60248201525f80516020615a068339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f80516020615a068339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da61501e565b036107315786156106f2576106ef84876120bd565b90505b5f8360600151836080015161070791906150fc565b90506107138582612359565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061511c565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108785761087861501e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff1660058111156109eb576109eb61501e565b60058111156109fc576109fc61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b61501e565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f6124b0565b6040518263ffffffff1660e01b8152600401610b119190615155565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061511c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be8836126d5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a5100083615187565b92915050565b5f610c536126e9565b610c5f84848434612720565b9050610c7760015f80516020615a4683398151915255565b9392505050565b5f805160206159e68339815191525f80610c978461299d565b91509150610ca482612ce7565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc61501e565b03610d01575f83815260088501602052604081208054919055610cff8282612d22565b505b610d1781610d128460400151611527565b612d88565b5050505050565b5f805160206159e68339815191525f610d3684612d9b565b90505f80610d478360400151612f75565b50915091505f610d5683611ff5565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b8152600401610650906151a6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b8152600401610650906151e8565b60015f87815260068701602052604090205460ff166004811115610df957610df961501e565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615a268339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061511c565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a6060850160408601615245565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea6060850185615260565b91505f90508435602086013560146111086060890160408a01615245565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f6111886060890189615260565b8363ffffffff1681811061119e5761119e6152a5565b90506020028101906111b091906152b9565b6111b990615369565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b815260040161065090615400565b84825f01518360200151846040015160405160200161120e9493929190615448565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c9190615497565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061511c565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113265761132661501e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d99116866154a8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611430906154bb565b905061116c565b50600584018190555f61144986612d9b565b90505f61145982604001516131b0565b90508060028560405161146c9190615497565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061511c565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a510006154dd565b5f61154a82611ff5565b6080015192915050565b5f805160206159e68339815191525f61156c85613319565b905061157785612ce7565b611582575050505050565b5f85815260058301602052604090205460a08201516115b191600160b01b90046001600160401b0316906154f4565b6001600160401b03168160c001516001600160401b031610156116325760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f61164386856120bd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061169a90611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611710573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611734919061511c565b5f878152600885016020526040812080549091906117539084906154a8565b9091555050505050505050565b6117686126e9565b5f805160206159e68339815191525f61178084612d9b565b90505f806117918360400151612f75565b50915091505f6117a083611ff5565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117da576117da61501e565b60048111156117eb576117eb61501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561188a5760405162461bcd60e51b8152600401610650906151a6565b826001600160401b03168160e001516001600160401b031611156118c05760405162461bcd60e51b8152600401610650906151e8565b6003815160048111156118d5576118d561501e565b146119295760405162461bcd60e51b815260206004820152603160248201525f80516020615a068339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061197f9061ffff600160a01b90910416846154dd565b6119899190615187565b905080886008015f8881526020019081526020015f205f8282546119ad91906154a8565b909155505060208301516119ca906119c58385615514565b612d22565b6119df8360200151610d128560600151611527565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a6e60015f80516020615a4683398151915255565b5050565b5f80516020615a268339815191525f611a8a83612d9b565b90505f80611a9b8360400151613594565b9150915080611afd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611b1790615527565b9050118015611b49575060015f83815260088601602052604090205460ff166005811115611b4757611b4761501e565b145b611b655760405162461bcd60e51b815260040161065090615559565b5f8281526007850160205260408120611b7d91614de7565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206159e683398151915293929190829060ff166004811115611c8b57611c8b61501e565b6004811115611c9c57611c9c61501e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d2357611d2361501e565b1480611d415750600381516004811115611d3f57611d3f61501e565b145b611d955760405162461bcd60e51b815260206004820152603260248201525f80516020615a06833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611da38260400151611ff5565b905080606001516001600160401b03165f03611e275760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611e548460400151846060015185608001516124b0565b6040518263ffffffff1660e01b8152600401611e709190615155565b6020604051808303815f875af1158015611e8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061511c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615a26833981519152929190611ef890615527565b9050118015611f2a575060015f83815260088301602052604090205460ff166005811115611f2857611f2861501e565b145b611f465760405162461bcd60e51b815260040161065090615559565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f7f91906004016155a0565b6020604051808303815f875af1158015611f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fbf919061511c565b505050565b5f611fcd6126e9565b611fd8823334613735565b9050611ff060015f80516020615a4683398151915255565b919050565b611ffd614e1e565b5f8281525f80516020615a66833981519152602052604090819020815160e0810190925280545f80516020615a26833981519152929190829060ff16600581111561204a5761204a61501e565b600581111561205b5761205b61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261212f9190810190615635565b91509150806121925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f9919061511c565b82511461225d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122d35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122e28460400151613aec565b9150915081871461234f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f80516020615a66833981519152602052604081206002015481905f80516020615a2683398151915290600160801b90046001600160401b03166123a18582613cc4565b5f6123ab87613ed2565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123fb8a858b6124b0565b6040518263ffffffff1660e01b81526004016124179190615155565b6020604051808303815f875af1158015612433573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612457919061511c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612529576124e9816001615514565b6124f49060086154dd565b5081515f9083908390811061250b5761250b6152a5565b60200101906001600160f81b03191690815f1a9053506001016124d5565b505f5b600481101561259457612540816003615514565b61254b9060086154dd565b600263ffffffff16901c60f81b8282600261256691906154a8565b81518110612576576125766152a5565b60200101906001600160f81b03191690815f1a90535060010161252c565b505f5b60208110156125f6576125ab81601f615514565b6125b69060086154dd565b86901c60f81b826125c88360066154a8565b815181106125d8576125d86152a5565b60200101906001600160f81b03191690815f1a905350600101612597565b505f5b60088110156126615761260d816007615514565b6126189060086154dd565b6001600160401b038616901c60f81b826126338360266154a8565b81518110612643576126436152a5565b60200101906001600160f81b03191690815f1a9053506001016125f9565b505f5b60088110156126cc57612678816007615514565b6126839060086154dd565b6001600160401b038516901c60f81b8261269e83602e6154a8565b815181106126ae576126ae6152a5565b60200101906001600160f81b03191690815f1a905350600101612664565b50949350505050565b6126dd613f62565b6126e681613fad565b50565b5f80516020615a4683398151915280546001190161271a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159e68339815191529061ffff86161080159061276c575061271061ffff861611155b6127885760405162461bcd60e51b815260040161065090615707565b60028101546001600160401b0390811690851610156128015760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156128645760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128cb5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f6128d682610c34565b90505f6128e38983614021565b905060405180606001604052806128f73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615a4683398151915255565b5f6129a6614e1e565b5f80516020615a268339815191525f6129be85612d9b565b90505f806129cf8360400151613594565b915091508015612a345760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612a6557612a6561501e565b6005811115612a7657612a7661501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612ae757612ae761501e565b1480612b055750600182516005811115612b0357612b0361501e565b145b612b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612b7957612b7961501e565b03612b8657506004612b8a565b5060055b6020808301515f90815260098801909152604081205581816005811115612bb357612bb361501e565b90816005811115612bc657612bc661501e565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612bfa57612bfa61501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612cae57612cae61501e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d6e575f80fd5b505af1158015612d80573d5f803e3d5ffd5b505050505050565b611a6e6001600160a01b03831682614586565b60408051606080820183525f8083526020830181905292820152905f80516020615a268339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612e10573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612e379190810190615635565b9150915080612e975760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612efa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612f6d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612f995760405162461bcd60e51b815260040161065090615752565b5f805b6002811015612fe857612fb0816001615514565b612fbb9060086154dd565b61ffff16868281518110612fd157612fd16152a5565b016020015160f81c901b9190911790600101612f9c565b5061ffff81161561300b5760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561306657613022816003615514565b61302d9060086154dd565b63ffffffff168761303f8360026154a8565b8151811061304f5761304f6152a5565b016020015160f81c901b919091179060010161300e565b5063ffffffff811660041461308d5760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156130e2576130a481601f615514565b6130af9060086154dd565b886130bb8360066154a8565b815181106130cb576130cb6152a5565b016020015160f81c901b9190911790600101613090565b505f805b6008811015613141576130fa816007615514565b6131059060086154dd565b6001600160401b03168961311a8360266154a8565b8151811061312a5761312a6152a5565b016020015160f81c901b91909117906001016130e6565b505f805b60088110156131a057613159816007615514565b6131649060086154dd565b6001600160401b03168a61317983602e6154a8565b81518110613189576131896152a5565b016020015160f81c901b9190911790600101613145565b5091989097509095509350505050565b5f81516026146131d25760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613221576131e9816001615514565b6131f49060086154dd565b61ffff1684828151811061320a5761320a6152a5565b016020015160f81c901b91909117906001016131d5565b5061ffff8116156132445760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561329f5761325b816003615514565b6132669060086154dd565b63ffffffff16856132788360026154a8565b81518110613288576132886152a5565b016020015160f81c901b9190911790600101613247565b5063ffffffff8116156132c45760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156126cc576132db81601f615514565b6132e69060086154dd565b866132f28360066154a8565b81518110613302576133026152a5565b016020015160f81c901b91909117906001016132c7565b613321614e1e565b5f8281525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff16600581111561336e5761336e61501e565b600581111561337f5761337f61501e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156133f1576133f161501e565b1461344d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156134915761349161501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61353d8582612359565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135b75760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613606576135ce816001615514565b6135d99060086154dd565b61ffff168582815181106135ef576135ef6152a5565b016020015160f81c901b91909117906001016135ba565b5061ffff8116156136295760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561368457613640816003615514565b61364b9060086154dd565b63ffffffff168661365d8360026154a8565b8151811061366d5761366d6152a5565b016020015160f81c901b919091179060010161362c565b5063ffffffff81166003146136ab5760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613700576136c281601f615514565b6136cd9060086154dd565b876136d98360066154a8565b815181106136e9576136e96152a5565b016020015160f81c901b91909117906001016136ae565b505f86602681518110613715576137156152a5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206159e68339815191528161374e84610c34565b90505f61375a87611ff5565b905061376587612ce7565b6137c25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b6002815160058111156137d7576137d761501e565b146138365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f82826080015161384791906154f4565b60048501546040840151919250613869916001600160401b0390911690615825565b6001600160401b0316816001600160401b031611156138e85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138f48a84612359565b915091505f8a8360405160200161392292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156139bd576139bd61501e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613b0f5760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613b5e57613b26816001615514565b613b319060086154dd565b61ffff16858281518110613b4757613b476152a5565b016020015160f81c901b9190911790600101613b12565b5061ffff811615613b815760405162461bcd60e51b81526004016106509061579b565b5f805b6004811015613bdc57613b98816003615514565b613ba39060086154dd565b63ffffffff1686613bb58360026154a8565b81518110613bc557613bc56152a5565b016020015160f81c901b9190911790600101613b84565b5063ffffffff8116600514613c035760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613c5857613c1a81601f615514565b613c259060086154dd565b87613c318360066154a8565b81518110613c4157613c416152a5565b016020015160f81c901b9190911790600101613c06565b505f805b6008811015613cb757613c70816007615514565b613c7b9060086154dd565b6001600160401b031688613c908360266154a8565b81518110613ca057613ca06152a5565b016020015160f81c901b9190911790600101613c5c565b5090969095509350505050565b5f80516020615a268339815191525f6001600160401b038084169085161115613cf857613cf183856150fc565b9050613d05565b613d0284846150fc565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613d67575060028401548151613d63916001600160401b0316906154a8565b8210155b15613d8d576001600160401b038316606082015281815260408101516020820152613dac565b8281606001818151613d9f91906154f4565b6001600160401b03169052505b6060810151613dbc906064615825565b602082015160028601546001600160401b039290921691613de79190600160401b900460ff166154dd565b1015613e4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613e6691906154a8565b9052506040810180516001600160401b0387169190613e86908390615514565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a668339815191526020526040812060020180545f80516020615a2683398151915291600160401b9091046001600160401b0316906008613f1c83615850565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fab57604051631afcd79f60e31b815260040160405180910390fd5b565b613fb5613f62565b613fbe81614619565b613fc6614632565b6126e6608082013560a0830135613fe360e0850160c08601615005565b613ff4610100860160e0870161586b565b61ffff1661400a61012087016101008801615884565b61401c61014088016101208901615245565b614642565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140ac5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615a26833981519152426140cb6040860160208701615005565b6001600160401b03161161413d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b61414d6040850160208601615005565b6001600160401b03166141636202a300426154a8565b116141d65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561422e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f9081526009820160205260409020541561425d5760405162461bcd60e51b815260040161065090615400565b603061426c60408601866158a4565b9050146142d15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b6142db835f613cc4565b5f806143756040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906143209190615005565b6001600160401b0316815260200161433b60408a018a6158a4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614886565b5f82815260078601602052604090209193509150614393828261592a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143c0908590600401615155565b6020604051808303815f875af11580156143dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614400919061511c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156144785761447861501e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614558918e01908e01615005565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145a95760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146145f2576040519150601f19603f3d011682016040523d82523d5f602084013e6145f7565b606091505b5050905080611fbf57604051630a12f52160e11b815260040160405180910390fd5b614621613f62565b614629614c35565b6126e681614c3d565b61463a613f62565b613fab614ddf565b61464a613f62565b5f805160206159e6833981519152836146b65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146d85760405162461bcd60e51b815260040161065090615707565b858711156147405760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff16116147ad5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561481f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146148f05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561496757614927816001615514565b6149329060086154dd565b5081515f90839083908110614949576149496152a5565b60200101906001600160f81b03191690815f1a905350600101614913565b505f5b60048110156149cf5761497e816003615514565b6149899060086154dd565b600160ff919091161c60f81b826149a18360026154a8565b815181106149b1576149b16152a5565b60200101906001600160f81b03191690815f1a90535060010161496a565b505f5b6020811015614a2c57845181602081106149ee576149ee6152a5565b1a60f81b826149fe8360066154a8565b81518110614a0e57614a0e6152a5565b60200101906001600160f81b03191690815f1a9053506001016149d2565b505f5b6020811015614a8c5784602001518160208110614a4e57614a4e6152a5565b1a60f81b82614a5e8360266154a8565b81518110614a6e57614a6e6152a5565b60200101906001600160f81b03191690815f1a905350600101614a2f565b505f5b6008811015614b0057614aa3816007615514565b614aae9060086154dd565b60ff1685604001516001600160401b0316901c60f81b82826046614ad291906154a8565b81518110614ae257614ae26152a5565b60200101906001600160f81b03191690815f1a905350600101614a8f565b505f5b6030811015614b6b5784608001518181518110614b2257614b226152a5565b01602001516001600160f81b03191682614b3d83604e6154a8565b81518110614b4d57614b4d6152a5565b60200101906001600160f81b03191690815f1a905350600101614b03565b505f5b6008811015614bdd57614b82816007615514565b614b8d9060086154dd565b60608601516001600160401b0390811691161c60f81b82614baf83607e6154a8565b81518110614bbf57614bbf6152a5565b60200101906001600160f81b03191690815f1a905350600101614b6e565b50600281604051614bee9190615497565b602060405180830381855afa158015614c09573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c2c919061511c565b94909350915050565b613fab613f62565b614c45613f62565b80355f80516020615a2683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c916080840160608501615884565b60ff161115614cfe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614d0f6080840160608501615884565b60ff1611614d775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614d876080830160608401615884565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614db86060830160408401615005565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61298a613f62565b508054614df390615527565b5f825580601f10614e02575050565b601f0160209004905f5260205f20908101906126e69190614e5a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614e6e575f8155600101614e5b565b5090565b80151581146126e6575f80fd5b803563ffffffff81168114611ff0575f80fd5b5f805f60608486031215614ea4575f80fd5b833592506020840135614eb681614e72565b9150614ec460408501614e7f565b90509250925092565b5f60208284031215614edd575f80fd5b5035919050565b5f6101408284031215614ef5575f80fd5b50919050565b803561ffff81168114611ff0575f80fd5b80356001600160401b0381168114611ff0575f80fd5b5f805f60608486031215614f34575f80fd5b83356001600160401b03811115614f49575f80fd5b840160608187031215614f5a575f80fd5b9250614f6860208501614efb565b9150614ec460408501614f0c565b5f60208284031215614f86575f80fd5b610c7782614e7f565b5f8060408385031215614fa0575f80fd5b614fa983614e7f565b946020939093013593505050565b5f8060408385031215614fc8575f80fd5b82356001600160401b03811115614fdd575f80fd5b830160808186031215614fee575f80fd5b9150614ffc60208401614e7f565b90509250929050565b5f60208284031215615015575f80fd5b610c7782614f0c565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061505557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161509060608401826001600160401b03169052565b5060808301516150ab60808401826001600160401b03169052565b5060a08301516150c660a08401826001600160401b03169052565b5060c08301516150e160c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156150e1576150e16150e8565b5f6020828403121561512c575f80fd5b5051919050565b5f5b8381101561514d578181015183820152602001615135565b50505f910152565b602081525f8251806020840152615173816040850160208701615133565b601f01601f19169190910160400192915050565b5f826151a157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146126e6575f80fd5b5f60208284031215615255575f80fd5b8135610c7781615231565b5f808335601e19843603018112615275575f80fd5b8301803591506001600160401b0382111561528e575f80fd5b6020019150600581901b36038213156124a9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152cd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561530d5761530d6152d7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561533b5761533b6152d7565b604052919050565b5f6001600160401b0382111561535b5761535b6152d7565b50601f01601f191660200190565b5f60608236031215615379575f80fd5b6153816152eb565b823581526020615392818501614f0c565b8183015260408401356001600160401b038111156153ae575f80fd5b840136601f8201126153be575f80fd5b80356153d16153cc82615343565b615313565b81815236848385010111156153e4575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615459818460208a01615133565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615489816028840160208801615133565b016028019695505050505050565b5f82516152cd818460208701615133565b80820180821115610c4457610c446150e8565b5f63ffffffff8083168181036154d3576154d36150e8565b6001019392505050565b8082028115828204841417610c4457610c446150e8565b6001600160401b038181168382160190808211156150e1576150e16150e8565b81810381811115610c4457610c446150e8565b600181811c9082168061553b57607f821691505b602082108103614ef557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546155b281615527565b806020870152604060018084165f81146155d357600181146155ef5761561c565b60ff19851660408a0152604084151560051b8a0101955061561c565b895f5260205f205f5b858110156156135781548b82018601529083019088016155f8565b8a016040019650505b509398975050505050505050565b8051611ff081614e72565b5f8060408385031215615646575f80fd5b82516001600160401b038082111561565c575f80fd5b908401906060828703121561566f575f80fd5b6156776152eb565b8251815260208084015161568a81615231565b8282015260408401518381111561569f575f80fd5b80850194505087601f8501126156b3575f80fd5b835192506156c36153cc84615343565b83815288828587010111156156d6575f80fd5b6156e584838301848801615133565b806040840152508195506156fa81880161562a565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615848576158486150e8565b505092915050565b5f6001600160401b038083168181036154d3576154d36150e8565b5f6020828403121561587b575f80fd5b610c7782614efb565b5f60208284031215615894575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e198436030181126158b9575f80fd5b8301803591506001600160401b038211156158d2575f80fd5b6020019150368190038213156124a9575f80fd5b601f821115611fbf57805f5260205f20601f840160051c8101602085101561590b5750805b601f840160051c820191505b81811015610d17575f8155600101615917565b81516001600160401b03811115615943576159436152d7565b615957816159518454615527565b846158e6565b602080601f83116001811461598a575f84156159735750858301515b5f19600386901b1c1916600185901b178555612d80565b5f85815260208120601f198616915b828110156159b857888601518255948401946001909101908401615999565b50858210156159d557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e52abcb67..352e18632 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -54,11 +54,11 @@ abstract contract PoSValidatorManager is IRewardCalculator _rewardCalculator; /// @notice Maps the validation ID to its requirements. mapping(bytes32 validationID => PoSValidatorRequirements) _validatorRequirements; - /// @notice Maps the delegationID to the delegator information. + /// @notice Maps the delegation ID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the delegationID to its pending staking rewards. + /// @notice Maps the delegation ID to its pending staking rewards. mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; - /// @notice Maps the validator owner address to its pending staking rewards. + /// @notice Maps the validation ID to its pending staking rewards. mapping(bytes32 validationID => uint256) _redeemableValidatorRewards; /// @notice Saves the uptime of a pending completed or completed validation period so that delegators can collect rewards. mapping(bytes32 validationID => uint64) _completedValidationUptimeSeconds; @@ -145,7 +145,11 @@ abstract contract PoSValidatorManager is Validator memory validator = _initializeEndValidation(validationID); - // Check that minimum stake duration has passed + if (!_isPoSValidator(validationID)) { + return; + } + + // Check that minimum stake duration has passed. require( validator.endedAt >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, @@ -483,10 +487,16 @@ abstract contract PoSValidatorManager is // Update the delegator status $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; - _reward(delegator.owner, $._redeemableDelegatorRewards[delegationID]); + uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; + + uint256 validatorFees = + rewards * $._validatorRequirements[validationID].delegationFeeBips / 10000; + $._redeemableValidatorRewards[validationID] += validatorFees; + + _reward(delegator.owner, rewards - validatorFees); _unlock(delegator.owner, weightToValue(delegator.weight)); - // TODO can we remove the delegation from _delegatorStakes here? + delete $._delegatorStakes[delegationID]; emit DelegationEnded(delegationID, validationID, nonce); } From 061c125c4d524fa3e1bee37649dc36c7485df504 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:08:30 -0400 Subject: [PATCH 25/36] Review fixes --- contracts/staking/PoSValidatorManager.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 352e18632..7787dcb9c 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -185,6 +185,7 @@ abstract contract PoSValidatorManager is } address owner = $._validatorRequirements[validationID].owner; + // The validator can either be Completed or Invalidated here. We only grant rewards for Completed. if (validator.status == ValidatorStatus.Completed) { uint256 rewards = $._redeemableValidatorRewards[validationID]; delete $._redeemableValidatorRewards[validationID]; From 19e28b3582a8e5db989c041947b5f247cbad2f2e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:34:25 -0400 Subject: [PATCH 26/36] Fix unit tests --- .../tests/ERC20TokenStakingManagerTests.t.sol | 20 +-------- .../NativeTokenStakingManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 41 +++++++++++-------- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index bc23cf689..ebad4feae 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -175,23 +175,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); vm.expectRevert(_formatErrorMessage("invalid min stake duration")); app.initializeValidatorRegistration( - input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - DEFAULT_MINIMUM_STAKE_DURATION - 1, - stakeAmount - ); - } - - function testInvalidValidatorDelegationFee() public { - ValidatorRegistrationInput memory input = - ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); - uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); - app.initializeValidatorRegistration( - input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, - DEFAULT_MINIMUM_STAKE_DURATION, - stakeAmount + input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, stakeAmount ); } @@ -212,7 +196,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration( input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, _weightToValue(weight) ); diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index bde948c8f..c607e0f01 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -174,7 +174,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration{value: _weightToValue(weight)}( - input, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION + input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION ); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 1ea6d1b0e..7b8ee3778 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -31,6 +31,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_REWARD_RATE = uint64(10); uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; + uint16 public constant DEFAULT_DELEGATION_FEE_BIPS = 150; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; uint256 public constant SECONDS_IN_YEAR = 31536000; @@ -74,10 +75,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); function testDelegationFeeBipsTooLow() public { - // ValidatorRegistrationInput calldata registrationInput, - // uint16 delegationFeeBips, - // uint64 minStakeDuration, - // uint256 stakeAmount ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, @@ -117,7 +114,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("invalid min stake duration")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, DEFAULT_MINIMUM_STAKE_AMOUNT ); @@ -132,7 +129,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("stake amount too low")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 ); @@ -147,7 +144,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("stake amount too high")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 ); @@ -541,7 +538,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 2 }); - uint256 expectedReward = rewardCalculator.calculateReward({ + uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, @@ -551,12 +548,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); + uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + _setUpCompleteEndDelegation({ validationID: validationID, delegationID: delegationID, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: expectedReward, + expectedReward: expectedDelegatorReward, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -703,21 +703,26 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 4 }); + 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, + initialSupply: 0, + endSupply: 0 + }); + + uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) _setUpCompleteEndDelegation({ validationID: validationID, delegationID: delegationID1, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: 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, - initialSupply: 0, - endSupply: 0 - }), + expectedReward: expectedDelegatorReward, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 From d5e5e26ec9ca8e82f25f4d524df10559c3d2d467 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:21:04 -0400 Subject: [PATCH 27/36] Function for withdrawing delegation fees --- .../ERC20TokenStakingManager.go | 25 +++++++++++++++++-- .../NativeTokenStakingManager.go | 25 +++++++++++++++++-- contracts/staking/PoSValidatorManager.sol | 19 ++++++++++++++ .../interfaces/IPoSValidatorManager.sol | 7 ++++++ 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index ead1c87ba..0d3ffc0ee 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,8 +83,8 @@ 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f2d380380615f2d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615de08061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004615143565b6103bf565b005b61018461019436600461517e565b610862565b6101d76101a736600461517e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b61021761021236600461517e565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d3660046151a9565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c3660046151e7565b610b10565b61018461027f366004615200565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615228565b610d85565b6101d76102c236600461528c565b6113b9565b6102176102d536600461517e565b6113d2565b6101846102e8366004615143565b6113e6565b6101f2603081565b610184610303366004615200565b6115f2565b6101d76103163660046152a5565b611904565b6101846103293660046151e7565b611930565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b61018461036236600461517e565b611ae8565b61018461037536600461517e565b611d6e565b6101f2601481565b61039561039036600461517e565b611e82565b6040516101e191906152d9565b6102176202a30081565b6101d76103ba3660046153a0565b611f4a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615d34833981519152949193919290829060ff166004811115610427576104276152c5565b6004811115610438576104386152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611e82565b90506002825160048111156104cb576104cb6152c5565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615d548339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615d548339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e6152c5565b036105f55786156105b6576105b38487611f7f565b90505b5f836060015183608001516105cb9190615419565b90506105d7858261221b565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615439565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c6152c5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff1660058111156108af576108af6152c5565b60058111156108c0576108c06152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f6152c5565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f612372565b6040518263ffffffff1660e01b81526004016109d59190615472565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615439565b50505050565b5f610a2b64e8d4a51000836154a4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac38484612599565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615d348339815191525f80610b29846125b3565b91509150610b36826128fd565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e6152c5565b03610b93575f83815260088501602052604081208054919055610b918282612938565b505b610ba981610ba484604001516113b9565b6129ae565b5050505050565b5f80516020615d348339815191525f610bc8846129d1565b90505f80610bd98360400151612bab565b50915091505f610be883611e82565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b8152600401610514906154c3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615505565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b6152c5565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615d748339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615439565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc606085016040860161554e565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c6060850185615569565b91505f9050843560208601356014610f9a6060890160408a0161554e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a6060890189615569565b8363ffffffff16818110611030576110306155ae565b905060200281019061104291906155c2565b61104b90615672565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615709565b84825f0151836020015184604001516040516020016110a09493929190615751565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906157a0565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615439565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b86152c5565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b9116866157b1565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c2906157c4565b9050610ffe565b50600584018190555f6112db866129d1565b90505f6112eb8260400151612de6565b9050806002856040516112fe91906157a0565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615439565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a510006157e6565b5f6113dc82611e82565b6080015192915050565b5f80516020615d348339815191525f6113fe85612f58565b9050611409856128fd565b611414575050505050565b5f85815260058301602052604090205460a082015161144391600160b01b90046001600160401b0316906157fd565b6001600160401b03168160c001516001600160401b031610156114c45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114d58685611f7f565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061152c906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190615439565b5f878152600885016020526040812080549091906115e59084906157b1565b9091555050505050505050565b6115fa6131d3565b5f80516020615d348339815191525f611612846129d1565b90505f806116238360400151612bab565b50915091505f61163283611e82565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561166c5761166c6152c5565b600481111561167d5761167d6152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561171c5760405162461bcd60e51b8152600401610514906154c3565b826001600160401b03168160e001516001600160401b031611156117525760405162461bcd60e51b815260040161051490615505565b600381516004811115611767576117676152c5565b146117bb5760405162461bcd60e51b815260206004820152603160248201525f80516020615d548339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a01909252822054909190612710906118119061ffff600160a01b90910416846157e6565b61181b91906154a4565b905080886008015f8881526020019081526020015f205f82825461183f91906157b1565b9091555050602083015161185c90611857838561581d565b612938565b6118718360200151610ba485606001516113b9565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a4505050505050505061190060015f80516020615d9483398151915255565b5050565b5f61190d6131d3565b61191883338461321d565b9050610a2b60015f80516020615d9483398151915255565b5f80516020615d748339815191525f611948836129d1565b90505f8061195983604001516135d7565b91509150806119bb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119d590615830565b9050118015611a07575060015f83815260088601602052604090205460ff166005811115611a0557611a056152c5565b145b611a235760405162461bcd60e51b815260040161051490615868565b5f8281526007850160205260408120611a3b91615093565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615d3483398151915293929190829060ff166004811115611b4957611b496152c5565b6004811115611b5a57611b5a6152c5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611be157611be16152c5565b1480611bff5750600381516004811115611bfd57611bfd6152c5565b145b611c535760405162461bcd60e51b815260206004820152603260248201525f80516020615d54833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611c618260400151611e82565b905080606001516001600160401b03165f03611ce55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611d12846040015184606001518560800151612372565b6040518263ffffffff1660e01b8152600401611d2e9190615472565b6020604051808303815f875af1158015611d4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615439565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615d74833981519152929190611db690615830565b9050118015611de8575060015f83815260088301602052604090205460ff166005811115611de657611de66152c5565b145b611e045760405162461bcd60e51b815260040161051490615868565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611e3d91906004016158af565b6020604051808303815f875af1158015611e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7d9190615439565b505050565b611e8a6150ca565b5f8281525f80516020615db4833981519152602052604090819020815160e0810190925280545f80516020615d74833981519152929190829060ff166005811115611ed757611ed76152c5565b6005811115611ee857611ee86152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611f536131d3565b611f5f85858585613778565b9050611f7760015f80516020615d9483398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611fca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ff19190810190615944565b91509150806120545760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120bb9190615439565b82511461211f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156121955760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f806121a484604001516139ed565b915091508187146122115760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615db4833981519152602052604081206002015481905f80516020615d7483398151915290600160801b90046001600160401b03166122638582613bc5565b5f61226d87613dd3565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6122bd8a858b612372565b6040518263ffffffff1660e01b81526004016122d99190615472565b6020604051808303815f875af11580156122f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123199190615439565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156123eb576123ab81600161581d565b6123b69060086157e6565b5081515f908390839081106123cd576123cd6155ae565b60200101906001600160f81b03191690815f1a905350600101612397565b505f5b60048110156124565761240281600361581d565b61240d9060086157e6565b600263ffffffff16901c60f81b8282600261242891906157b1565b81518110612438576124386155ae565b60200101906001600160f81b03191690815f1a9053506001016123ee565b505f5b60208110156124b85761246d81601f61581d565b6124789060086157e6565b86901c60f81b8261248a8360066157b1565b8151811061249a5761249a6155ae565b60200101906001600160f81b03191690815f1a905350600101612459565b505f5b6008811015612523576124cf81600761581d565b6124da9060086157e6565b6001600160401b038616901c60f81b826124f58360266157b1565b81518110612505576125056155ae565b60200101906001600160f81b03191690815f1a9053506001016124bb565b505f5b600881101561258e5761253a81600761581d565b6125459060086157e6565b6001600160401b038516901c60f81b8261256083602e6157b1565b81518110612570576125706155ae565b60200101906001600160f81b03191690815f1a905350600101612526565b5090505b9392505050565b6125a1613e63565b6125aa82613eae565b61190081613f25565b5f6125bc6150ca565b5f80516020615d748339815191525f6125d4856129d1565b90505f806125e583604001516135d7565b91509150801561264a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561267b5761267b6152c5565b600581111561268c5761268c6152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156126fd576126fd6152c5565b148061271b5750600182516005811115612719576127196152c5565b145b61277a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b60038251600581111561278f5761278f6152c5565b0361279c575060046127a0565b5060055b6020808301515f908152600988019091526040812055818160058111156127c9576127c96152c5565b908160058111156127dc576127dc6152c5565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612810576128106152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156128c4576128c46152c5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615d1483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612993575f80fd5b505af11580156129a5573d5f803e3d5ffd5b50505050505050565b5f80516020615d1483398151915254611900906001600160a01b03168383613fc6565b60408051606080820183525f8083526020830181905292820152905f80516020615d748339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a6d9190810190615944565b9150915080612acd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612b305760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612ba35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612bcf5760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612c1e57612be681600161581d565b612bf19060086157e6565b61ffff16868281518110612c0757612c076155ae565b016020015160f81c901b9190911790600101612bd2565b5061ffff811615612c415760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612c9c57612c5881600361581d565b612c639060086157e6565b63ffffffff1687612c758360026157b1565b81518110612c8557612c856155ae565b016020015160f81c901b9190911790600101612c44565b5063ffffffff8116600414612cc35760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612d1857612cda81601f61581d565b612ce59060086157e6565b88612cf18360066157b1565b81518110612d0157612d016155ae565b016020015160f81c901b9190911790600101612cc6565b505f805b6008811015612d7757612d3081600761581d565b612d3b9060086157e6565b6001600160401b031689612d508360266157b1565b81518110612d6057612d606155ae565b016020015160f81c901b9190911790600101612d1c565b505f805b6008811015612dd657612d8f81600761581d565b612d9a9060086157e6565b6001600160401b03168a612daf83602e6157b1565b81518110612dbf57612dbf6155ae565b016020015160f81c901b9190911790600101612d7b565b5091989097509095509350505050565b5f8151602614612e085760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612e5757612e1f81600161581d565b612e2a9060086157e6565b61ffff16848281518110612e4057612e406155ae565b016020015160f81c901b9190911790600101612e0b565b5061ffff811615612e7a5760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612ed557612e9181600361581d565b612e9c9060086157e6565b63ffffffff1685612eae8360026157b1565b81518110612ebe57612ebe6155ae565b016020015160f81c901b9190911790600101612e7d565b5063ffffffff811615612efa5760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612f4f57612f1181601f61581d565b612f1c9060086157e6565b86612f288360066157b1565b81518110612f3857612f386155ae565b016020015160f81c901b9190911790600101612efd565b50949350505050565b612f606150ca565b5f8281525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff166005811115612fad57612fad6152c5565b6005811115612fbe57612fbe6152c5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613030576130306152c5565b1461308c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156130d0576130d06152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61317c858261221b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615d9483398151915280546001190161320457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615d9483398151915255565b5f5f80516020615d348339815191528161323961021285614025565b90505f61324587611e82565b9050613250876128fd565b6132ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b6002815160058111156132c2576132c26152c5565b146133215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f82826080015161333291906157fd565b60048501546040840151919250613354916001600160401b0390911690615ae9565b6001600160401b0316816001600160401b031611156133d35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f806133df8a8461221b565b915091505f8a8360405160200161340d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156134a8576134a86152c5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135fa5760405162461bcd60e51b815260040161051490615a16565b5f805b60028110156136495761361181600161581d565b61361c9060086157e6565b61ffff16858281518110613632576136326155ae565b016020015160f81c901b91909117906001016135fd565b5061ffff81161561366c5760405162461bcd60e51b815260040161051490615a5f565b5f805b60048110156136c75761368381600361581d565b61368e9060086157e6565b63ffffffff16866136a08360026157b1565b815181106136b0576136b06155ae565b016020015160f81c901b919091179060010161366f565b5063ffffffff81166003146136ee5760405162461bcd60e51b815260040161051490615aa2565b5f805b60208110156137435761370581601f61581d565b6137109060086157e6565b8761371c8360066157b1565b8151811061372c5761372c6155ae565b016020015160f81c901b91909117906001016136f1565b505f86602681518110613758576137586155ae565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615d348339815191529061ffff8616108015906137c4575061271061ffff861611155b6137e05760405162461bcd60e51b815260040161051490615b14565b60028101546001600160401b0390811690851610156138595760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b80548310156138bc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156139235760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61392d84614025565b90505f61393982610a1b565b90505f6139468983614048565b9050604051806060016040528061395a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613a105760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015613a5f57613a2781600161581d565b613a329060086157e6565b61ffff16858281518110613a4857613a486155ae565b016020015160f81c901b9190911790600101613a13565b5061ffff811615613a825760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015613add57613a9981600361581d565b613aa49060086157e6565b63ffffffff1686613ab68360026157b1565b81518110613ac657613ac66155ae565b016020015160f81c901b9190911790600101613a85565b5063ffffffff8116600514613b045760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015613b5957613b1b81601f61581d565b613b269060086157e6565b87613b328360066157b1565b81518110613b4257613b426155ae565b016020015160f81c901b9190911790600101613b07565b505f805b6008811015613bb857613b7181600761581d565b613b7c9060086157e6565b6001600160401b031688613b918360266157b1565b81518110613ba157613ba16155ae565b016020015160f81c901b9190911790600101613b5d565b5090969095509350505050565b5f80516020615d748339815191525f6001600160401b038084169085161115613bf957613bf28385615419565b9050613c06565b613c038484615419565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613c68575060028401548151613c64916001600160401b0316906157b1565b8210155b15613c8e576001600160401b038316606082015281815260408101516020820152613cad565b8281606001818151613ca091906157fd565b6001600160401b03169052505b6060810151613cbd906064615ae9565b602082015160028601546001600160401b039290921691613ce89190600160401b900460ff166157e6565b1015613d4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613d6791906157b1565b9052506040810180516001600160401b0387169190613d8790839061581d565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615db48339815191526020526040812060020180545f80516020615d7483398151915291600160401b9091046001600160401b0316906008613e1d83615b5f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613eac57604051631afcd79f60e31b815260040160405180910390fd5b565b613eb6613e63565b613ebf816145ad565b613ec76145c6565b613f22608082013560a0830135613ee460e0850160c0860161528c565b613ef5610100860160e08701615b7a565b61ffff16613f0b61012087016101008801615b93565b613f1d6101408801610120890161554e565b6145d6565b50565b613f2d613e63565b5f80516020615d148339815191526001600160a01b038216613fa65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611e7d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061481a565b5f610a2b825f80516020615d14833981519152546001600160a01b03169061487b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140d35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615d74833981519152426140f2604086016020870161528c565b6001600160401b0316116141645760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b614174604085016020860161528c565b6001600160401b031661418a6202a300426157b1565b116141fd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356142555760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156142845760405162461bcd60e51b815260040161051490615709565b60306142936040860186615bb3565b9050146142f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614302835f613bc5565b5f8061439c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614347919061528c565b6001600160401b0316815260200161436260408a018a615bb3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149dd565b5f828152600786016020526040902091935091506143ba8282615c39565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143e7908590600401615472565b6020604051808303815f875af1158015614403573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144279190615439565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561449f5761449f6152c5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161457f918e01908e0161528c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6145b5613e63565b6145bd614d8c565b613f2281614d94565b6145ce613e63565b613eac614f36565b6145de613e63565b5f80516020615d348339815191528361464a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b61271084111561466c5760405162461bcd60e51b815260040161051490615b14565b858711156146d45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff16116147415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147b35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61482e6001600160a01b03841683614f3e565b905080515f141580156148525750808060200190518101906148509190615cf8565b155b15611e7d57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e59190615439565b90506148fc6001600160a01b038516333086614f4b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614940573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149649190615439565b90508181116149ca5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149d4828261581d565b95945050505050565b5f6060826080015151603014614a475760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614abe57614a7e81600161581d565b614a899060086157e6565b5081515f90839083908110614aa057614aa06155ae565b60200101906001600160f81b03191690815f1a905350600101614a6a565b505f5b6004811015614b2657614ad581600361581d565b614ae09060086157e6565b600160ff919091161c60f81b82614af88360026157b1565b81518110614b0857614b086155ae565b60200101906001600160f81b03191690815f1a905350600101614ac1565b505f5b6020811015614b835784518160208110614b4557614b456155ae565b1a60f81b82614b558360066157b1565b81518110614b6557614b656155ae565b60200101906001600160f81b03191690815f1a905350600101614b29565b505f5b6020811015614be35784602001518160208110614ba557614ba56155ae565b1a60f81b82614bb58360266157b1565b81518110614bc557614bc56155ae565b60200101906001600160f81b03191690815f1a905350600101614b86565b505f5b6008811015614c5757614bfa81600761581d565b614c059060086157e6565b60ff1685604001516001600160401b0316901c60f81b82826046614c2991906157b1565b81518110614c3957614c396155ae565b60200101906001600160f81b03191690815f1a905350600101614be6565b505f5b6030811015614cc25784608001518181518110614c7957614c796155ae565b01602001516001600160f81b03191682614c9483604e6157b1565b81518110614ca457614ca46155ae565b60200101906001600160f81b03191690815f1a905350600101614c5a565b505f5b6008811015614d3457614cd981600761581d565b614ce49060086157e6565b60608601516001600160401b0390811691161c60f81b82614d0683607e6157b1565b81518110614d1657614d166155ae565b60200101906001600160f81b03191690815f1a905350600101614cc5565b50600281604051614d4591906157a0565b602060405180830381855afa158015614d60573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d839190615439565b94909350915050565b613eac613e63565b614d9c613e63565b80355f80516020615d7483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614de86080840160608501615b93565b60ff161115614e555760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614e666080840160608501615b93565b60ff1611614ece5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614ede6080830160608401615b93565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f0f606083016040840161528c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61320a613e63565b606061259283835f614f84565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613ff3565b606081471015614fa95760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614fc491906157a0565b5f6040518083038185875af1925050503d805f8114614ffe576040519150601f19603f3d011682016040523d82523d5f602084013e615003565b606091505b50915091506122118683836060826150235761501e8261506a565b612592565b815115801561503a57506001600160a01b0384163b155b1561506357604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b5080612592565b80511561507a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461509f90615830565b5f825580601f106150ae575050565b601f0160209004905f5260205f2090810190613f229190615106565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561511a575f8155600101615107565b5090565b8015158114613f22575f80fd5b803563ffffffff8116811461513e575f80fd5b919050565b5f805f60608486031215615155575f80fd5b8335925060208401356151678161511e565b91506151756040850161512b565b90509250925092565b5f6020828403121561518e575f80fd5b5035919050565b6001600160a01b0381168114613f22575f80fd5b5f808284036101608112156151bc575f80fd5b610140808212156151cb575f80fd5b84935083013590506151dc81615195565b809150509250929050565b5f602082840312156151f7575f80fd5b6125928261512b565b5f8060408385031215615211575f80fd5b61521a8361512b565b946020939093013593505050565b5f8060408385031215615239575f80fd5b82356001600160401b0381111561524e575f80fd5b83016080818603121561525f575f80fd5b915061526d6020840161512b565b90509250929050565b80356001600160401b038116811461513e575f80fd5b5f6020828403121561529c575f80fd5b61259282615276565b5f80604083850312156152b6575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106152fc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161533760608401826001600160401b03169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538860c08401826001600160401b03169052565b5092915050565b803561ffff8116811461513e575f80fd5b5f805f80608085870312156153b3575f80fd5b84356001600160401b038111156153c8575f80fd5b8501606081880312156153d9575f80fd5b93506153e76020860161538f565b92506153f560408601615276565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561538857615388615405565b5f60208284031215615449575f80fd5b5051919050565b5f5b8381101561546a578181015183820152602001615452565b50505f910152565b602081525f8251806020840152615490816040850160208701615450565b601f01601f19169190910160400192915050565b5f826154be57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561555e575f80fd5b813561259281615195565b5f808335601e1984360301811261557e575f80fd5b8301803591506001600160401b03821115615597575f80fd5b6020019150600581901b360382131561236b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155d6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615616576156166155e0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615644576156446155e0565b604052919050565b5f6001600160401b03821115615664576156646155e0565b50601f01601f191660200190565b5f60608236031215615682575f80fd5b61568a6155f4565b82358152602061569b818501615276565b8183015260408401356001600160401b038111156156b7575f80fd5b840136601f8201126156c7575f80fd5b80356156da6156d58261564c565b61561c565b81815236848385010111156156ed575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615762818460208a01615450565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615792816028840160208801615450565b016028019695505050505050565b5f82516155d6818460208701615450565b80820180821115610a2b57610a2b615405565b5f63ffffffff8083168181036157dc576157dc615405565b6001019392505050565b8082028115828204841417610a2b57610a2b615405565b6001600160401b0381811683821601908082111561538857615388615405565b81810381811115610a2b57610a2b615405565b600181811c9082168061584457607f821691505b60208210810361586257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546158c181615830565b806020870152604060018084165f81146158e257600181146158fe5761592b565b60ff19851660408a0152604084151560051b8a0101955061592b565b895f5260205f205f5b858110156159225781548b8201860152908301908801615907565b8a016040019650505b509398975050505050505050565b805161513e8161511e565b5f8060408385031215615955575f80fd5b82516001600160401b038082111561596b575f80fd5b908401906060828703121561597e575f80fd5b6159866155f4565b8251815260208084015161599981615195565b828201526040840151838111156159ae575f80fd5b80850194505087601f8501126159c2575f80fd5b835192506159d26156d58461564c565b83815288828587010111156159e5575f80fd5b6159f484838301848801615450565b80604084015250819550615a09818801615939565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615b0c57615b0c615405565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036157dc576157dc615405565b5f60208284031215615b8a575f80fd5b6125928261538f565b5f60208284031215615ba3575f80fd5b813560ff81168114612592575f80fd5b5f808335601e19843603018112615bc8575f80fd5b8301803591506001600160401b03821115615be1575f80fd5b60200191503681900382131561236b575f80fd5b601f821115611e7d57805f5260205f20601f840160051c81016020851015615c1a5750805b601f840160051c820191505b81811015610ba9575f8155600101615c26565b81516001600160401b03811115615c5257615c526155e0565b615c6681615c608454615830565b84615bf5565b602080601f831160018114615c99575f8415615c825750858301515b5f19600386901b1c1916600185901b178555615cf0565b5f85815260208120601f198616915b82811015615cc757888601518255948401946001909101908401615ca8565b5085821015615ce457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615d08575f80fd5b81516125928161511e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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_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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160ab3803806160ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f5e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c1565b6103ec565b005b61019e6101ae3660046152fc565b61088f565b6101f16101c13660046152fc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fc565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615327565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615365565b610b3d565b61019e61029936600461537e565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a6565b610db2565b6101f16102dc36600461540a565b6113e6565b6102316102ef3660046152fc565b6113ff565b61019e6103023660046152c1565b611413565b61020c603081565b61019e61031d3660046152fc565b61161f565b61019e61033036600461537e565b611770565b6101f1610343366004615423565b611a82565b61019e610356366004615365565b611aae565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fc565b611c66565b61019e6103a23660046152fc565b611eec565b61020c601481565b6103c26103bd3660046152fc565b612000565b6040516101fb9190615457565b6102316202a30081565b6101f16103e736600461551e565b6120c8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615eb2833981519152949193919290829060ff16600481111561045457610454615443565b600481111561046557610465615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183612000565b90506002825160048111156104f8576104f8615443565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ed28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ed28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615443565b036106225786156105e3576105e084876120fd565b90505b5f836060015183608001516105f89190615597565b90506106048582612399565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155b7565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615443565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff1660058111156108dc576108dc615443565b60058111156108ed576108ed615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615443565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124f0565b6040518263ffffffff1660e01b8152600401610a0291906155f0565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155b7565b50505050565b5f610a5864e8d4a5100083615622565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af08484612717565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615eb28339815191525f80610b5684612731565b91509150610b6382612a7b565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615443565b03610bc0575f83815260088501602052604081208054919055610bbe8282612ab6565b505b610bd681610bd184604001516113e6565b612b2c565b5050505050565b5f80516020615eb28339815191525f610bf584612b4f565b90505f80610c068360400151612d29565b50915091505f610c1583612000565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615641565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615683565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615443565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ef28339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155b7565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156cc565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156e7565b91505f9050843560208601356014610fc76060890160408a016156cc565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156e7565b8363ffffffff1681811061105d5761105d61572c565b905060200281019061106f9190615740565b611078906157f0565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615887565b84825f0151836020015184604001516040516020016110cd94939291906158cf565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b919061591e565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155b7565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615443565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661592f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615942565b905061102b565b50600584018190555f61130886612b4f565b90505f6113188260400151612f64565b90508060028560405161132b919061591e565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155b7565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615964565b5f61140982612000565b6080015192915050565b5f80516020615eb28339815191525f61142b856130d6565b905061143685612a7b565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b03169061597b565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120fd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155b7565b5f8781526008850160205260408120805490919061161290849061592f565b9091555050505050505050565b5f80516020615eb28339815191525f61163783612000565b905060048151600581111561164e5761164e615443565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612ab6565b611778613351565b5f80516020615eb28339815191525f61179084612b4f565b90505f806117a18360400151612d29565b50915091505f6117b083612000565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea615443565b60048111156117fb576117fb615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561189a5760405162461bcd60e51b815260040161054190615641565b826001600160401b03168160e001516001600160401b031611156118d05760405162461bcd60e51b815260040161054190615683565b6003815160048111156118e5576118e5615443565b146119395760405162461bcd60e51b815260206004820152603160248201525f80516020615ed28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061198f9061ffff600160a01b9091041684615964565b6119999190615622565b905080886008015f8881526020019081526020015f205f8282546119bd919061592f565b909155505060208301516119da906119d5838561599b565b612ab6565b6119ef8360200151610bd185606001516113e6565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a7e60015f80516020615f1283398151915255565b5050565b5f611a8b613351565b611a9683338461339b565b9050610a5860015f80516020615f1283398151915255565b5f80516020615ef28339815191525f611ac683612b4f565b90505f80611ad78360400151613755565b9150915080611b395760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b53906159ae565b9050118015611b85575060015f83815260088601602052604090205460ff166005811115611b8357611b83615443565b145b611ba15760405162461bcd60e51b8152600401610541906159e6565b5f8281526007850160205260408120611bb991615211565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615eb283398151915293929190829060ff166004811115611cc757611cc7615443565b6004811115611cd857611cd8615443565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5f57611d5f615443565b1480611d7d5750600381516004811115611d7b57611d7b615443565b145b611dd15760405162461bcd60e51b815260206004820152603260248201525f80516020615ed2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611ddf8260400151612000565b905080606001516001600160401b03165f03611e635760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e908460400151846060015185608001516124f0565b6040518263ffffffff1660e01b8152600401611eac91906155f0565b6020604051808303815f875af1158015611ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155b7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ef2833981519152929190611f34906159ae565b9050118015611f66575060015f83815260088301602052604090205460ff166005811115611f6457611f64615443565b145b611f825760405162461bcd60e51b8152600401610541906159e6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fbb9190600401615a2d565b6020604051808303815f875af1158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb91906155b7565b505050565b612008615248565b5f8281525f80516020615f32833981519152602052604090819020815160e0810190925280545f80516020615ef2833981519152929190829060ff16600581111561205557612055615443565b600581111561206657612066615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d1613351565b6120dd858585856138f6565b90506120f560015f80516020615f1283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612148573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216f9190810190615ac2565b91509150806121d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612215573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223991906155b7565b82511461229d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156123135760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123228460400151613b6b565b9150915081871461238f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f32833981519152602052604081206002015481905f80516020615ef283398151915290600160801b90046001600160401b03166123e18582613d43565b5f6123eb87613f51565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243b8a858b6124f0565b6040518263ffffffff1660e01b815260040161245791906155f0565b6020604051808303815f875af1158015612473573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249791906155b7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125695761252981600161599b565b612534906008615964565b5081515f9083908390811061254b5761254b61572c565b60200101906001600160f81b03191690815f1a905350600101612515565b505f5b60048110156125d45761258081600361599b565b61258b906008615964565b600263ffffffff16901c60f81b828260026125a6919061592f565b815181106125b6576125b661572c565b60200101906001600160f81b03191690815f1a90535060010161256c565b505f5b6020811015612636576125eb81601f61599b565b6125f6906008615964565b86901c60f81b8261260883600661592f565b815181106126185761261861572c565b60200101906001600160f81b03191690815f1a9053506001016125d7565b505f5b60088110156126a15761264d81600761599b565b612658906008615964565b6001600160401b038616901c60f81b8261267383602661592f565b815181106126835761268361572c565b60200101906001600160f81b03191690815f1a905350600101612639565b505f5b600881101561270c576126b881600761599b565b6126c3906008615964565b6001600160401b038516901c60f81b826126de83602e61592f565b815181106126ee576126ee61572c565b60200101906001600160f81b03191690815f1a9053506001016126a4565b5090505b9392505050565b61271f613fe1565b6127288261402c565b611a7e816140a3565b5f61273a615248565b5f80516020615ef28339815191525f61275285612b4f565b90505f806127638360400151613755565b9150915080156127c85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f9576127f9615443565b600581111561280a5761280a615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287b5761287b615443565b1480612899575060018251600581111561289757612897615443565b145b6128f85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b60038251600581111561290d5761290d615443565b0361291a5750600461291e565b5060055b6020808301515f9081526009880190915260408120558181600581111561294757612947615443565b9081600581111561295a5761295a615443565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298e5761298e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4257612a42615443565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b11575f80fd5b505af1158015612b23573d5f803e3d5ffd5b50505050505050565b5f80516020615e9283398151915254611a7e906001600160a01b03168383614144565b60408051606080820183525f8083526020830181905292820152905f80516020615ef28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612beb9190810190615ac2565b9150915080612c4b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612cae5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d4d5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612d9c57612d6481600161599b565b612d6f906008615964565b61ffff16868281518110612d8557612d8561572c565b016020015160f81c901b9190911790600101612d50565b5061ffff811615612dbf5760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015612e1a57612dd681600361599b565b612de1906008615964565b63ffffffff1687612df383600261592f565b81518110612e0357612e0361572c565b016020015160f81c901b9190911790600101612dc2565b5063ffffffff8116600414612e415760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015612e9657612e5881601f61599b565b612e63906008615964565b88612e6f83600661592f565b81518110612e7f57612e7f61572c565b016020015160f81c901b9190911790600101612e44565b505f805b6008811015612ef557612eae81600761599b565b612eb9906008615964565b6001600160401b031689612ece83602661592f565b81518110612ede57612ede61572c565b016020015160f81c901b9190911790600101612e9a565b505f805b6008811015612f5457612f0d81600761599b565b612f18906008615964565b6001600160401b03168a612f2d83602e61592f565b81518110612f3d57612f3d61572c565b016020015160f81c901b9190911790600101612ef9565b5091989097509095509350505050565b5f8151602614612f865760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612fd557612f9d81600161599b565b612fa8906008615964565b61ffff16848281518110612fbe57612fbe61572c565b016020015160f81c901b9190911790600101612f89565b5061ffff811615612ff85760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156130535761300f81600361599b565b61301a906008615964565b63ffffffff168561302c83600261592f565b8151811061303c5761303c61572c565b016020015160f81c901b9190911790600101612ffb565b5063ffffffff8116156130785760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156130cd5761308f81601f61599b565b61309a906008615964565b866130a683600661592f565b815181106130b6576130b661572c565b016020015160f81c901b919091179060010161307b565b50949350505050565b6130de615248565b5f8281525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff16600581111561312b5761312b615443565b600581111561313c5761313c615443565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ae576131ae615443565b1461320a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324e5761324e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132fa8582612399565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f1283398151915280546001190161338257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f1283398151915255565b5f5f80516020615eb2833981519152816133b761022c856141a3565b90505f6133c387612000565b90506133ce87612a7b565b61342b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561344057613440615443565b1461349f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134b0919061597b565b600485015460408401519192506134d2916001600160401b0390911690615c67565b6001600160401b0316816001600160401b031611156135515760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061355d8a84612399565b915091505f8a8360405160200161358b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362657613626615443565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137785760405162461bcd60e51b815260040161054190615b94565b5f805b60028110156137c75761378f81600161599b565b61379a906008615964565b61ffff168582815181106137b0576137b061572c565b016020015160f81c901b919091179060010161377b565b5061ffff8116156137ea5760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156138455761380181600361599b565b61380c906008615964565b63ffffffff168661381e83600261592f565b8151811061382e5761382e61572c565b016020015160f81c901b91909117906001016137ed565b5063ffffffff811660031461386c5760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156138c15761388381601f61599b565b61388e906008615964565b8761389a83600661592f565b815181106138aa576138aa61572c565b016020015160f81c901b919091179060010161386f565b505f866026815181106138d6576138d661572c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615eb28339815191529061ffff861610801590613942575061271061ffff861611155b61395e5760405162461bcd60e51b815260040161054190615c92565b60028101546001600160401b0390811690851610156139d75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a3a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613aa15760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aab846141a3565b90505f613ab782610a48565b90505f613ac489836141c6565b90506040518060600160405280613ad83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8e5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015613bdd57613ba581600161599b565b613bb0906008615964565b61ffff16858281518110613bc657613bc661572c565b016020015160f81c901b9190911790600101613b91565b5061ffff811615613c005760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015613c5b57613c1781600361599b565b613c22906008615964565b63ffffffff1686613c3483600261592f565b81518110613c4457613c4461572c565b016020015160f81c901b9190911790600101613c03565b5063ffffffff8116600514613c825760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015613cd757613c9981601f61599b565b613ca4906008615964565b87613cb083600661592f565b81518110613cc057613cc061572c565b016020015160f81c901b9190911790600101613c85565b505f805b6008811015613d3657613cef81600761599b565b613cfa906008615964565b6001600160401b031688613d0f83602661592f565b81518110613d1f57613d1f61572c565b016020015160f81c901b9190911790600101613cdb565b5090969095509350505050565b5f80516020615ef28339815191525f6001600160401b038084169085161115613d7757613d708385615597565b9050613d84565b613d818484615597565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de6575060028401548151613de2916001600160401b03169061592f565b8210155b15613e0c576001600160401b038316606082015281815260408101516020820152613e2b565b8281606001818151613e1e919061597b565b6001600160401b03169052505b6060810151613e3b906064615c67565b602082015160028601546001600160401b039290921691613e669190600160401b900460ff16615964565b1015613eca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ee5919061592f565b9052506040810180516001600160401b0387169190613f0590839061599b565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f328339815191526020526040812060020180545f80516020615ef283398151915291600160401b9091046001600160401b0316906008613f9b83615cdd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402a57604051631afcd79f60e31b815260040160405180910390fd5b565b614034613fe1565b61403d8161472b565b614045614744565b6140a0608082013560a083013561406260e0850160c0860161540a565b614073610100860160e08701615cf8565b61ffff1661408961012087016101008801615d11565b61409b610140880161012089016156cc565b614754565b50565b6140ab613fe1565b5f80516020615e928339815191526001600160a01b0382166141245760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614998565b5f610a58825f80516020615e92833981519152546001600160a01b0316906149f9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142515760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ef283398151915242614270604086016020870161540a565b6001600160401b0316116142e25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142f2604085016020860161540a565b6001600160401b03166143086202a3004261592f565b1161437b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143d35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156144025760405162461bcd60e51b815260040161054190615887565b60306144116040860186615d31565b9050146144765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614480835f613d43565b5f8061451a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c5919061540a565b6001600160401b031681526020016144e060408a018a615d31565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5b565b5f828152600786016020526040902091935091506145388282615db7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145659085906004016155f0565b6020604051808303815f875af1158015614581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a591906155b7565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461d5761461d615443565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fd918e01908e0161540a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614733613fe1565b61473b614f0a565b6140a081614f12565b61474c613fe1565b61402a6150b4565b61475c613fe1565b5f80516020615eb2833981519152836147c85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147ea5760405162461bcd60e51b815260040161054190615c92565b858711156148525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ac6001600160a01b038416836150bc565b905080515f141580156149d05750808060200190518101906149ce9190615e76565b155b15611ffb57604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6391906155b7565b9050614a7a6001600160a01b0385163330866150c9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae291906155b7565b9050818111614b485760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b52828261599b565b95945050505050565b5f6060826080015151603014614bc55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3c57614bfc81600161599b565b614c07906008615964565b5081515f90839083908110614c1e57614c1e61572c565b60200101906001600160f81b03191690815f1a905350600101614be8565b505f5b6004811015614ca457614c5381600361599b565b614c5e906008615964565b600160ff919091161c60f81b82614c7683600261592f565b81518110614c8657614c8661572c565b60200101906001600160f81b03191690815f1a905350600101614c3f565b505f5b6020811015614d015784518160208110614cc357614cc361572c565b1a60f81b82614cd383600661592f565b81518110614ce357614ce361572c565b60200101906001600160f81b03191690815f1a905350600101614ca7565b505f5b6020811015614d615784602001518160208110614d2357614d2361572c565b1a60f81b82614d3383602661592f565b81518110614d4357614d4361572c565b60200101906001600160f81b03191690815f1a905350600101614d04565b505f5b6008811015614dd557614d7881600761599b565b614d83906008615964565b60ff1685604001516001600160401b0316901c60f81b82826046614da7919061592f565b81518110614db757614db761572c565b60200101906001600160f81b03191690815f1a905350600101614d64565b505f5b6030811015614e405784608001518181518110614df757614df761572c565b01602001516001600160f81b03191682614e1283604e61592f565b81518110614e2257614e2261572c565b60200101906001600160f81b03191690815f1a905350600101614dd8565b505f5b6008811015614eb257614e5781600761599b565b614e62906008615964565b60608601516001600160401b0390811691161c60f81b82614e8483607e61592f565b81518110614e9457614e9461572c565b60200101906001600160f81b03191690815f1a905350600101614e43565b50600281604051614ec3919061591e565b602060405180830381855afa158015614ede573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0191906155b7565b94909350915050565b61402a613fe1565b614f1a613fe1565b80355f80516020615ef283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f666080840160608501615d11565b60ff161115614fd35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fe46080840160608501615d11565b60ff161161504c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b61505c6080830160608401615d11565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508d606083016040840161540a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613388613fe1565b606061271083835f615102565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614171565b6060814710156151275760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b03168486604051615142919061591e565b5f6040518083038185875af1925050503d805f811461517c576040519150601f19603f3d011682016040523d82523d5f602084013e615181565b606091505b509150915061238f8683836060826151a15761519c826151e8565b612710565b81511580156151b857506001600160a01b0384163b155b156151e157604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612710565b8051156151f85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521d906159ae565b5f825580601f1061522c575050565b601f0160209004905f5260205f20908101906140a09190615284565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615298575f8155600101615285565b5090565b80151581146140a0575f80fd5b803563ffffffff811681146152bc575f80fd5b919050565b5f805f606084860312156152d3575f80fd5b8335925060208401356152e58161529c565b91506152f3604085016152a9565b90509250925092565b5f6020828403121561530c575f80fd5b5035919050565b6001600160a01b03811681146140a0575f80fd5b5f8082840361016081121561533a575f80fd5b61014080821215615349575f80fd5b849350830135905061535a81615313565b809150509250929050565b5f60208284031215615375575f80fd5b612710826152a9565b5f806040838503121561538f575f80fd5b615398836152a9565b946020939093013593505050565b5f80604083850312156153b7575f80fd5b82356001600160401b038111156153cc575f80fd5b8301608081860312156153dd575f80fd5b91506153eb602084016152a9565b90509250929050565b80356001600160401b03811681146152bc575f80fd5b5f6020828403121561541a575f80fd5b612710826153f4565b5f8060408385031215615434575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b560608401826001600160401b03169052565b5060808301516154d060808401826001600160401b03169052565b5060a08301516154eb60a08401826001600160401b03169052565b5060c083015161550660c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bc575f80fd5b5f805f8060808587031215615531575f80fd5b84356001600160401b03811115615546575f80fd5b850160608188031215615557575f80fd5b93506155656020860161550d565b9250615573604086016153f4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550657615506615583565b5f602082840312156155c7575f80fd5b5051919050565b5f5b838110156155e85781810151838201526020016155d0565b50505f910152565b602081525f825180602084015261560e8160408501602087016155ce565b601f01601f19169190910160400192915050565b5f8261563c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156dc575f80fd5b813561271081615313565b5f808335601e198436030181126156fc575f80fd5b8301803591506001600160401b03821115615715575f80fd5b6020019150600581901b36038213156124e9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615754575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157945761579461575e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c2576157c261575e565b604052919050565b5f6001600160401b038211156157e2576157e261575e565b50601f01601f191660200190565b5f60608236031215615800575f80fd5b615808615772565b8235815260206158198185016153f4565b8183015260408401356001600160401b03811115615835575f80fd5b840136601f820112615845575f80fd5b8035615858615853826157ca565b61579a565b818152368483850101111561586b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158e0818460208a016155ce565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159108160288401602088016155ce565b016028019695505050505050565b5f82516157548184602087016155ce565b80820180821115610a5857610a58615583565b5f63ffffffff80831681810361595a5761595a615583565b6001019392505050565b8082028115828204841417610a5857610a58615583565b6001600160401b0381811683821601908082111561550657615506615583565b81810381811115610a5857610a58615583565b600181811c908216806159c257607f821691505b6020821081036159e057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a3f816159ae565b806020870152604060018084165f8114615a605760018114615a7c57615aa9565b60ff19851660408a0152604084151560051b8a01019550615aa9565b895f5260205f205f5b85811015615aa05781548b8201860152908301908801615a85565b8a016040019650505b509398975050505050505050565b80516152bc8161529c565b5f8060408385031215615ad3575f80fd5b82516001600160401b0380821115615ae9575f80fd5b9084019060608287031215615afc575f80fd5b615b04615772565b82518152602080840151615b1781615313565b82820152604084015183811115615b2c575f80fd5b80850194505087601f850112615b40575f80fd5b83519250615b50615853846157ca565b8381528882858701011115615b63575f80fd5b615b72848383018488016155ce565b80604084015250819550615b87818801615ab7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8a57615c8a615583565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595a5761595a615583565b5f60208284031215615d08575f80fd5b6127108261550d565b5f60208284031215615d21575f80fd5b813560ff81168114612710575f80fd5b5f808335601e19843603018112615d46575f80fd5b8301803591506001600160401b03821115615d5f575f80fd5b6020019150368190038213156124e9575f80fd5b601f821115611ffb57805f5260205f20601f840160051c81016020851015615d985750805b601f840160051c820191505b81811015610bd6575f8155600101615da4565b81516001600160401b03811115615dd057615dd061575e565b615de481615dde84546159ae565b84615d73565b602080601f831160018114615e17575f8415615e005750858301515b5f19600386901b1c1916600185901b178555615e6e565b5f85815260208120601f198616915b82811015615e4557888601518255948401946001909101908401615e26565b5085821015615e6257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e86575f80fd5b81516127108161529c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -626,6 +626,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightTo return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ClaimDelegationFees(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "claimDelegationFees", validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimDelegationFees(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimDelegationFees(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + // CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // // Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ce232b703..aa630ebfe 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,8 +83,8 @@ 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615bdf380380615bdf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a928061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614e92565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614ecd565b61099e565b3480156101ca575f80fd5b506102096101d9366004614ecd565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614ee4565b610b57565b34801561026c575f80fd5b5061028061027b366004614ecd565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614f22565b610c4a565b348015610310575f80fd5b5061019e61031f366004614f76565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614f8f565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614fb7565b610ef3565b348015610396575f80fd5b506102096103a5366004615005565b611527565b3480156103b5575f80fd5b506102806103c4366004614ecd565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614e92565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614f8f565b611760565b348015610426575f80fd5b5061019e610435366004614f76565b611a72565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614ecd565b611c2a565b34801561047e575f80fd5b5061019e61048d366004614ecd565b611eb0565b6102096104a0366004614ecd565b611fc4565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614ecd565b611ff5565b6040516102139190615032565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206159e6833981519152949193919290829060ff1660048111156105635761056361501e565b60048111156105745761057461501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611ff5565b90506002825160048111156106075761060761501e565b146106595760405162461bcd60e51b815260206004820152602a60248201525f80516020615a068339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f80516020615a068339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da61501e565b036107315786156106f2576106ef84876120bd565b90505b5f8360600151836080015161070791906150fc565b90506107138582612359565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061511c565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108785761087861501e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff1660058111156109eb576109eb61501e565b60058111156109fc576109fc61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b61501e565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f6124b0565b6040518263ffffffff1660e01b8152600401610b119190615155565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061511c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be8836126d5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a5100083615187565b92915050565b5f610c536126e9565b610c5f84848434612720565b9050610c7760015f80516020615a4683398151915255565b9392505050565b5f805160206159e68339815191525f80610c978461299d565b91509150610ca482612ce7565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc61501e565b03610d01575f83815260088501602052604081208054919055610cff8282612d22565b505b610d1781610d128460400151611527565b612d88565b5050505050565b5f805160206159e68339815191525f610d3684612d9b565b90505f80610d478360400151612f75565b50915091505f610d5683611ff5565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b8152600401610650906151a6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b8152600401610650906151e8565b60015f87815260068701602052604090205460ff166004811115610df957610df961501e565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615a268339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061511c565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a6060850160408601615245565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea6060850185615260565b91505f90508435602086013560146111086060890160408a01615245565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f6111886060890189615260565b8363ffffffff1681811061119e5761119e6152a5565b90506020028101906111b091906152b9565b6111b990615369565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b815260040161065090615400565b84825f01518360200151846040015160405160200161120e9493929190615448565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c9190615497565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061511c565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113265761132661501e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d99116866154a8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611430906154bb565b905061116c565b50600584018190555f61144986612d9b565b90505f61145982604001516131b0565b90508060028560405161146c9190615497565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061511c565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a510006154dd565b5f61154a82611ff5565b6080015192915050565b5f805160206159e68339815191525f61156c85613319565b905061157785612ce7565b611582575050505050565b5f85815260058301602052604090205460a08201516115b191600160b01b90046001600160401b0316906154f4565b6001600160401b03168160c001516001600160401b031610156116325760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f61164386856120bd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061169a90611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611710573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611734919061511c565b5f878152600885016020526040812080549091906117539084906154a8565b9091555050505050505050565b6117686126e9565b5f805160206159e68339815191525f61178084612d9b565b90505f806117918360400151612f75565b50915091505f6117a083611ff5565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117da576117da61501e565b60048111156117eb576117eb61501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561188a5760405162461bcd60e51b8152600401610650906151a6565b826001600160401b03168160e001516001600160401b031611156118c05760405162461bcd60e51b8152600401610650906151e8565b6003815160048111156118d5576118d561501e565b146119295760405162461bcd60e51b815260206004820152603160248201525f80516020615a068339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061197f9061ffff600160a01b90910416846154dd565b6119899190615187565b905080886008015f8881526020019081526020015f205f8282546119ad91906154a8565b909155505060208301516119ca906119c58385615514565b612d22565b6119df8360200151610d128560600151611527565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a6e60015f80516020615a4683398151915255565b5050565b5f80516020615a268339815191525f611a8a83612d9b565b90505f80611a9b8360400151613594565b9150915080611afd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611b1790615527565b9050118015611b49575060015f83815260088601602052604090205460ff166005811115611b4757611b4761501e565b145b611b655760405162461bcd60e51b815260040161065090615559565b5f8281526007850160205260408120611b7d91614de7565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206159e683398151915293929190829060ff166004811115611c8b57611c8b61501e565b6004811115611c9c57611c9c61501e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d2357611d2361501e565b1480611d415750600381516004811115611d3f57611d3f61501e565b145b611d955760405162461bcd60e51b815260206004820152603260248201525f80516020615a06833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611da38260400151611ff5565b905080606001516001600160401b03165f03611e275760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611e548460400151846060015185608001516124b0565b6040518263ffffffff1660e01b8152600401611e709190615155565b6020604051808303815f875af1158015611e8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061511c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615a26833981519152929190611ef890615527565b9050118015611f2a575060015f83815260088301602052604090205460ff166005811115611f2857611f2861501e565b145b611f465760405162461bcd60e51b815260040161065090615559565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f7f91906004016155a0565b6020604051808303815f875af1158015611f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fbf919061511c565b505050565b5f611fcd6126e9565b611fd8823334613735565b9050611ff060015f80516020615a4683398151915255565b919050565b611ffd614e1e565b5f8281525f80516020615a66833981519152602052604090819020815160e0810190925280545f80516020615a26833981519152929190829060ff16600581111561204a5761204a61501e565b600581111561205b5761205b61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261212f9190810190615635565b91509150806121925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f9919061511c565b82511461225d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122d35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122e28460400151613aec565b9150915081871461234f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f80516020615a66833981519152602052604081206002015481905f80516020615a2683398151915290600160801b90046001600160401b03166123a18582613cc4565b5f6123ab87613ed2565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123fb8a858b6124b0565b6040518263ffffffff1660e01b81526004016124179190615155565b6020604051808303815f875af1158015612433573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612457919061511c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612529576124e9816001615514565b6124f49060086154dd565b5081515f9083908390811061250b5761250b6152a5565b60200101906001600160f81b03191690815f1a9053506001016124d5565b505f5b600481101561259457612540816003615514565b61254b9060086154dd565b600263ffffffff16901c60f81b8282600261256691906154a8565b81518110612576576125766152a5565b60200101906001600160f81b03191690815f1a90535060010161252c565b505f5b60208110156125f6576125ab81601f615514565b6125b69060086154dd565b86901c60f81b826125c88360066154a8565b815181106125d8576125d86152a5565b60200101906001600160f81b03191690815f1a905350600101612597565b505f5b60088110156126615761260d816007615514565b6126189060086154dd565b6001600160401b038616901c60f81b826126338360266154a8565b81518110612643576126436152a5565b60200101906001600160f81b03191690815f1a9053506001016125f9565b505f5b60088110156126cc57612678816007615514565b6126839060086154dd565b6001600160401b038516901c60f81b8261269e83602e6154a8565b815181106126ae576126ae6152a5565b60200101906001600160f81b03191690815f1a905350600101612664565b50949350505050565b6126dd613f62565b6126e681613fad565b50565b5f80516020615a4683398151915280546001190161271a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159e68339815191529061ffff86161080159061276c575061271061ffff861611155b6127885760405162461bcd60e51b815260040161065090615707565b60028101546001600160401b0390811690851610156128015760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156128645760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128cb5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f6128d682610c34565b90505f6128e38983614021565b905060405180606001604052806128f73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615a4683398151915255565b5f6129a6614e1e565b5f80516020615a268339815191525f6129be85612d9b565b90505f806129cf8360400151613594565b915091508015612a345760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612a6557612a6561501e565b6005811115612a7657612a7661501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612ae757612ae761501e565b1480612b055750600182516005811115612b0357612b0361501e565b145b612b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612b7957612b7961501e565b03612b8657506004612b8a565b5060055b6020808301515f90815260098801909152604081205581816005811115612bb357612bb361501e565b90816005811115612bc657612bc661501e565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612bfa57612bfa61501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612cae57612cae61501e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d6e575f80fd5b505af1158015612d80573d5f803e3d5ffd5b505050505050565b611a6e6001600160a01b03831682614586565b60408051606080820183525f8083526020830181905292820152905f80516020615a268339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612e10573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612e379190810190615635565b9150915080612e975760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612efa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612f6d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612f995760405162461bcd60e51b815260040161065090615752565b5f805b6002811015612fe857612fb0816001615514565b612fbb9060086154dd565b61ffff16868281518110612fd157612fd16152a5565b016020015160f81c901b9190911790600101612f9c565b5061ffff81161561300b5760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561306657613022816003615514565b61302d9060086154dd565b63ffffffff168761303f8360026154a8565b8151811061304f5761304f6152a5565b016020015160f81c901b919091179060010161300e565b5063ffffffff811660041461308d5760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156130e2576130a481601f615514565b6130af9060086154dd565b886130bb8360066154a8565b815181106130cb576130cb6152a5565b016020015160f81c901b9190911790600101613090565b505f805b6008811015613141576130fa816007615514565b6131059060086154dd565b6001600160401b03168961311a8360266154a8565b8151811061312a5761312a6152a5565b016020015160f81c901b91909117906001016130e6565b505f805b60088110156131a057613159816007615514565b6131649060086154dd565b6001600160401b03168a61317983602e6154a8565b81518110613189576131896152a5565b016020015160f81c901b9190911790600101613145565b5091989097509095509350505050565b5f81516026146131d25760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613221576131e9816001615514565b6131f49060086154dd565b61ffff1684828151811061320a5761320a6152a5565b016020015160f81c901b91909117906001016131d5565b5061ffff8116156132445760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561329f5761325b816003615514565b6132669060086154dd565b63ffffffff16856132788360026154a8565b81518110613288576132886152a5565b016020015160f81c901b9190911790600101613247565b5063ffffffff8116156132c45760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156126cc576132db81601f615514565b6132e69060086154dd565b866132f28360066154a8565b81518110613302576133026152a5565b016020015160f81c901b91909117906001016132c7565b613321614e1e565b5f8281525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff16600581111561336e5761336e61501e565b600581111561337f5761337f61501e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156133f1576133f161501e565b1461344d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156134915761349161501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61353d8582612359565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135b75760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613606576135ce816001615514565b6135d99060086154dd565b61ffff168582815181106135ef576135ef6152a5565b016020015160f81c901b91909117906001016135ba565b5061ffff8116156136295760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561368457613640816003615514565b61364b9060086154dd565b63ffffffff168661365d8360026154a8565b8151811061366d5761366d6152a5565b016020015160f81c901b919091179060010161362c565b5063ffffffff81166003146136ab5760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613700576136c281601f615514565b6136cd9060086154dd565b876136d98360066154a8565b815181106136e9576136e96152a5565b016020015160f81c901b91909117906001016136ae565b505f86602681518110613715576137156152a5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206159e68339815191528161374e84610c34565b90505f61375a87611ff5565b905061376587612ce7565b6137c25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b6002815160058111156137d7576137d761501e565b146138365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f82826080015161384791906154f4565b60048501546040840151919250613869916001600160401b0390911690615825565b6001600160401b0316816001600160401b031611156138e85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138f48a84612359565b915091505f8a8360405160200161392292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156139bd576139bd61501e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613b0f5760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613b5e57613b26816001615514565b613b319060086154dd565b61ffff16858281518110613b4757613b476152a5565b016020015160f81c901b9190911790600101613b12565b5061ffff811615613b815760405162461bcd60e51b81526004016106509061579b565b5f805b6004811015613bdc57613b98816003615514565b613ba39060086154dd565b63ffffffff1686613bb58360026154a8565b81518110613bc557613bc56152a5565b016020015160f81c901b9190911790600101613b84565b5063ffffffff8116600514613c035760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613c5857613c1a81601f615514565b613c259060086154dd565b87613c318360066154a8565b81518110613c4157613c416152a5565b016020015160f81c901b9190911790600101613c06565b505f805b6008811015613cb757613c70816007615514565b613c7b9060086154dd565b6001600160401b031688613c908360266154a8565b81518110613ca057613ca06152a5565b016020015160f81c901b9190911790600101613c5c565b5090969095509350505050565b5f80516020615a268339815191525f6001600160401b038084169085161115613cf857613cf183856150fc565b9050613d05565b613d0284846150fc565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613d67575060028401548151613d63916001600160401b0316906154a8565b8210155b15613d8d576001600160401b038316606082015281815260408101516020820152613dac565b8281606001818151613d9f91906154f4565b6001600160401b03169052505b6060810151613dbc906064615825565b602082015160028601546001600160401b039290921691613de79190600160401b900460ff166154dd565b1015613e4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613e6691906154a8565b9052506040810180516001600160401b0387169190613e86908390615514565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a668339815191526020526040812060020180545f80516020615a2683398151915291600160401b9091046001600160401b0316906008613f1c83615850565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fab57604051631afcd79f60e31b815260040160405180910390fd5b565b613fb5613f62565b613fbe81614619565b613fc6614632565b6126e6608082013560a0830135613fe360e0850160c08601615005565b613ff4610100860160e0870161586b565b61ffff1661400a61012087016101008801615884565b61401c61014088016101208901615245565b614642565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140ac5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615a26833981519152426140cb6040860160208701615005565b6001600160401b03161161413d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b61414d6040850160208601615005565b6001600160401b03166141636202a300426154a8565b116141d65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561422e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f9081526009820160205260409020541561425d5760405162461bcd60e51b815260040161065090615400565b603061426c60408601866158a4565b9050146142d15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b6142db835f613cc4565b5f806143756040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906143209190615005565b6001600160401b0316815260200161433b60408a018a6158a4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614886565b5f82815260078601602052604090209193509150614393828261592a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143c0908590600401615155565b6020604051808303815f875af11580156143dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614400919061511c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156144785761447861501e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614558918e01908e01615005565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145a95760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146145f2576040519150601f19603f3d011682016040523d82523d5f602084013e6145f7565b606091505b5050905080611fbf57604051630a12f52160e11b815260040160405180910390fd5b614621613f62565b614629614c35565b6126e681614c3d565b61463a613f62565b613fab614ddf565b61464a613f62565b5f805160206159e6833981519152836146b65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146d85760405162461bcd60e51b815260040161065090615707565b858711156147405760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff16116147ad5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561481f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146148f05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561496757614927816001615514565b6149329060086154dd565b5081515f90839083908110614949576149496152a5565b60200101906001600160f81b03191690815f1a905350600101614913565b505f5b60048110156149cf5761497e816003615514565b6149899060086154dd565b600160ff919091161c60f81b826149a18360026154a8565b815181106149b1576149b16152a5565b60200101906001600160f81b03191690815f1a90535060010161496a565b505f5b6020811015614a2c57845181602081106149ee576149ee6152a5565b1a60f81b826149fe8360066154a8565b81518110614a0e57614a0e6152a5565b60200101906001600160f81b03191690815f1a9053506001016149d2565b505f5b6020811015614a8c5784602001518160208110614a4e57614a4e6152a5565b1a60f81b82614a5e8360266154a8565b81518110614a6e57614a6e6152a5565b60200101906001600160f81b03191690815f1a905350600101614a2f565b505f5b6008811015614b0057614aa3816007615514565b614aae9060086154dd565b60ff1685604001516001600160401b0316901c60f81b82826046614ad291906154a8565b81518110614ae257614ae26152a5565b60200101906001600160f81b03191690815f1a905350600101614a8f565b505f5b6030811015614b6b5784608001518181518110614b2257614b226152a5565b01602001516001600160f81b03191682614b3d83604e6154a8565b81518110614b4d57614b4d6152a5565b60200101906001600160f81b03191690815f1a905350600101614b03565b505f5b6008811015614bdd57614b82816007615514565b614b8d9060086154dd565b60608601516001600160401b0390811691161c60f81b82614baf83607e6154a8565b81518110614bbf57614bbf6152a5565b60200101906001600160f81b03191690815f1a905350600101614b6e565b50600281604051614bee9190615497565b602060405180830381855afa158015614c09573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c2c919061511c565b94909350915050565b613fab613f62565b614c45613f62565b80355f80516020615a2683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c916080840160608501615884565b60ff161115614cfe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614d0f6080840160608501615884565b60ff1611614d775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614d876080830160608401615884565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614db86060830160408401615005565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61298a613f62565b508054614df390615527565b5f825580601f10614e02575050565b601f0160209004905f5260205f20908101906126e69190614e5a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614e6e575f8155600101614e5b565b5090565b80151581146126e6575f80fd5b803563ffffffff81168114611ff0575f80fd5b5f805f60608486031215614ea4575f80fd5b833592506020840135614eb681614e72565b9150614ec460408501614e7f565b90509250925092565b5f60208284031215614edd575f80fd5b5035919050565b5f6101408284031215614ef5575f80fd5b50919050565b803561ffff81168114611ff0575f80fd5b80356001600160401b0381168114611ff0575f80fd5b5f805f60608486031215614f34575f80fd5b83356001600160401b03811115614f49575f80fd5b840160608187031215614f5a575f80fd5b9250614f6860208501614efb565b9150614ec460408501614f0c565b5f60208284031215614f86575f80fd5b610c7782614e7f565b5f8060408385031215614fa0575f80fd5b614fa983614e7f565b946020939093013593505050565b5f8060408385031215614fc8575f80fd5b82356001600160401b03811115614fdd575f80fd5b830160808186031215614fee575f80fd5b9150614ffc60208401614e7f565b90509250929050565b5f60208284031215615015575f80fd5b610c7782614f0c565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061505557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161509060608401826001600160401b03169052565b5060808301516150ab60808401826001600160401b03169052565b5060a08301516150c660a08401826001600160401b03169052565b5060c08301516150e160c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156150e1576150e16150e8565b5f6020828403121561512c575f80fd5b5051919050565b5f5b8381101561514d578181015183820152602001615135565b50505f910152565b602081525f8251806020840152615173816040850160208701615133565b601f01601f19169190910160400192915050565b5f826151a157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146126e6575f80fd5b5f60208284031215615255575f80fd5b8135610c7781615231565b5f808335601e19843603018112615275575f80fd5b8301803591506001600160401b0382111561528e575f80fd5b6020019150600581901b36038213156124a9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152cd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561530d5761530d6152d7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561533b5761533b6152d7565b604052919050565b5f6001600160401b0382111561535b5761535b6152d7565b50601f01601f191660200190565b5f60608236031215615379575f80fd5b6153816152eb565b823581526020615392818501614f0c565b8183015260408401356001600160401b038111156153ae575f80fd5b840136601f8201126153be575f80fd5b80356153d16153cc82615343565b615313565b81815236848385010111156153e4575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615459818460208a01615133565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615489816028840160208801615133565b016028019695505050505050565b5f82516152cd818460208701615133565b80820180821115610c4457610c446150e8565b5f63ffffffff8083168181036154d3576154d36150e8565b6001019392505050565b8082028115828204841417610c4457610c446150e8565b6001600160401b038181168382160190808211156150e1576150e16150e8565b81810381811115610c4457610c446150e8565b600181811c9082168061553b57607f821691505b602082108103614ef557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546155b281615527565b806020870152604060018084165f81146155d357600181146155ef5761561c565b60ff19851660408a0152604084151560051b8a0101955061561c565b895f5260205f205f5b858110156156135781548b82018601529083019088016155f8565b8a016040019650505b509398975050505050505050565b8051611ff081614e72565b5f8060408385031215615646575f80fd5b82516001600160401b038082111561565c575f80fd5b908401906060828703121561566f575f80fd5b6156776152eb565b8251815260208084015161568a81615231565b8282015260408401518381111561569f575f80fd5b80850194505087601f8501126156b3575f80fd5b835192506156c36153cc84615343565b83815288828587010111156156d6575f80fd5b6156e584838301848801615133565b806040840152508195506156fa81880161562a565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615848576158486150e8565b505092915050565b5f6001600160401b038083168181036154d3576154d36150e8565b5f6020828403121561587b575f80fd5b610c7782614efb565b5f60208284031215615894575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e198436030181126158b9575f80fd5b8301803591506001600160401b038211156158d2575f80fd5b6020019150368190038213156124a9575f80fd5b601f821115611fbf57805f5260205f20601f840160051c8101602085101561590b5750805b601f840160051c820191505b81811015610d17575f8155600101615917565b81516001600160401b03811115615943576159436152d7565b615957816159518454615527565b846158e6565b602080601f83116001811461598a575f84156159735750858301515b5f19600386901b1c1916600185901b178555612d80565b5f85815260208120601f198616915b828110156159b857888601518255948401946001909101908401615999565b50858210156159d557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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_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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615d69380380615d6983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c1c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501c565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615057565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615057565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506e565b610b90565b348015610286575f80fd5b5061029a610295366004615057565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ac565b610c83565b34801561032a575f80fd5b506101b8610339366004615100565b610cb7565b348015610349575f80fd5b506101b8610358366004615119565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615141565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461518f565b611560565b3480156103cf575f80fd5b5061029a6103de366004615057565b611579565b3480156103ee575f80fd5b506101b86103fd36600461501c565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615057565b611799565b348015610440575f80fd5b506101b861044f366004615119565b6118ea565b34801561045f575f80fd5b506101b861046e366004615100565b611bfc565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615057565b611db4565b3480156104b7575f80fd5b506101b86104c6366004615057565b61203a565b6102236104d9366004615057565b61214e565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615057565b61217f565b60405161022d91906151bc565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b70833981519152949193919290829060ff16600481111561059c5761059c6151a8565b60048111156105ad576105ad6151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361217f565b9050600282516004811115610640576106406151a8565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b908339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b908339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f906002906005811115610713576107136151a8565b0361076a57861561072b576107288487612247565b90505b5f836060015183608001516107409190615286565b905061074c85826124e3565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087291906152a6565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b16151a8565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff166005811115610a2457610a246151a8565b6005811115610a3557610a356151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa46151a8565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f61263a565b6040518263ffffffff1660e01b8152600401610b4a91906152df565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a91906152a6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361285f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615311565b92915050565b5f610c8c612873565b610c98848484346128aa565b9050610cb060015f80516020615bd083398151915255565b9392505050565b5f80516020615b708339815191525f80610cd084612b27565b91509150610cdd82612e71565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d156151a8565b03610d3a575f83815260088501602052604081208054919055610d388282612eac565b505b610d5081610d4b8460400151611560565b612f12565b5050505050565b5f80516020615b708339815191525f610d6f84612f25565b90505f80610d8083604001516130ff565b50915091505f610d8f8361217f565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615330565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615372565b60015f87815260068701602052604090205460ff166004811115610e3257610e326151a8565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bb08339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103091906152a6565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153cf565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153ea565b91505f90508435602086013560146111416060890160408a016153cf565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153ea565b8363ffffffff168181106111d7576111d761542f565b90506020028101906111e99190615443565b6111f2906154f3565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b81526004016106899061558a565b84825f01518360200151846040015160405160200161124794939291906155d2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615621565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d391906152a6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f6151a8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615632565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615645565b90506111a5565b50600584018190555f61148286612f25565b90505f611492826040015161333a565b9050806002856040516114a59190615621565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e391906152a6565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615667565b5f6115838261217f565b6080015192915050565b5f80516020615b708339815191525f6115a5856134a3565b90506115b085612e71565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b03169061567e565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c8685612247565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d91906152a6565b5f8781526008850160205260408120805490919061178c908490615632565b9091555050505050505050565b5f80516020615b708339815191525f6117b18361217f565b90506004815160058111156117c8576117c86151a8565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612eac565b6118f2612873565b5f80516020615b708339815191525f61190a84612f25565b90505f8061191b83604001516130ff565b50915091505f61192a8361217f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611964576119646151a8565b6004811115611975576119756151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e09092019190915284015191925084811691161015611a145760405162461bcd60e51b815260040161068990615330565b826001600160401b03168160e001516001600160401b03161115611a4a5760405162461bcd60e51b815260040161068990615372565b600381516004811115611a5f57611a5f6151a8565b14611ab35760405162461bcd60e51b815260206004820152603160248201525f80516020615b908339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a0190925282205490919061271090611b099061ffff600160a01b9091041684615667565b611b139190615311565b905080886008015f8881526020019081526020015f205f828254611b379190615632565b90915550506020830151611b5490611b4f838561569e565b612eac565b611b698360200151610d4b8560600151611560565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611bf860015f80516020615bd083398151915255565b5050565b5f80516020615bb08339815191525f611c1483612f25565b90505f80611c25836040015161371e565b9150915080611c875760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611ca1906156b1565b9050118015611cd3575060015f83815260088601602052604090205460ff166005811115611cd157611cd16151a8565b145b611cef5760405162461bcd60e51b8152600401610689906156e3565b5f8281526007850160205260408120611d0791614f71565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b7083398151915293929190829060ff166004811115611e1557611e156151a8565b6004811115611e2657611e266151a8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ead57611ead6151a8565b1480611ecb5750600381516004811115611ec957611ec96151a8565b145b611f1f5760405162461bcd60e51b815260206004820152603260248201525f80516020615b90833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f2d826040015161217f565b905080606001516001600160401b03165f03611fb15760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fde84604001518460600151856080015161263a565b6040518263ffffffff1660e01b8152600401611ffa91906152df565b6020604051808303815f875af1158015612016573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5091906152a6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bb0833981519152929190612082906156b1565b90501180156120b4575060015f83815260088301602052604090205460ff1660058111156120b2576120b26151a8565b145b6120d05760405162461bcd60e51b8152600401610689906156e3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612109919060040161572a565b6020604051808303815f875af1158015612125573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214991906152a6565b505050565b5f612157612873565b6121628233346138bf565b905061217a60015f80516020615bd083398151915255565b919050565b612187614fa8565b5f8281525f80516020615bf0833981519152602052604090819020815160e0810190925280545f80516020615bb0833981519152929190829060ff1660058111156121d4576121d46151a8565b60058111156121e5576121e56151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612292573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b991908101906157bf565b915091508061231c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238391906152a6565b8251146123e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f8061246c8460400151613c76565b915091508187146124d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615bf0833981519152602052604081206002015481905f80516020615bb083398151915290600160801b90046001600160401b031661252b8582613e4e565b5f6125358761405c565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125858a858b61263a565b6040518263ffffffff1660e01b81526004016125a191906152df565b6020604051808303815f875af11580156125bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e191906152a6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b35761267381600161569e565b61267e906008615667565b5081515f908390839081106126955761269561542f565b60200101906001600160f81b03191690815f1a90535060010161265f565b505f5b600481101561271e576126ca81600361569e565b6126d5906008615667565b600263ffffffff16901c60f81b828260026126f09190615632565b815181106127005761270061542f565b60200101906001600160f81b03191690815f1a9053506001016126b6565b505f5b60208110156127805761273581601f61569e565b612740906008615667565b86901c60f81b82612752836006615632565b815181106127625761276261542f565b60200101906001600160f81b03191690815f1a905350600101612721565b505f5b60088110156127eb5761279781600761569e565b6127a2906008615667565b6001600160401b038616901c60f81b826127bd836026615632565b815181106127cd576127cd61542f565b60200101906001600160f81b03191690815f1a905350600101612783565b505f5b60088110156128565761280281600761569e565b61280d906008615667565b6001600160401b038516901c60f81b8261282883602e615632565b815181106128385761283861542f565b60200101906001600160f81b03191690815f1a9053506001016127ee565b50949350505050565b6128676140ec565b61287081614137565b50565b5f80516020615bd08339815191528054600119016128a457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b708339815191529061ffff8616108015906128f6575061271061ffff861611155b6129125760405162461bcd60e51b815260040161068990615891565b60028101546001600160401b03908116908516101561298b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129ee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a6082610c6d565b90505f612a6d89836141ab565b90506040518060600160405280612a813390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bd083398151915255565b5f612b30614fa8565b5f80516020615bb08339815191525f612b4885612f25565b90505f80612b59836040015161371e565b915091508015612bbe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bef57612bef6151a8565b6005811115612c0057612c006151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7157612c716151a8565b1480612c8f5750600182516005811115612c8d57612c8d6151a8565b145b612cee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612d0357612d036151a8565b03612d1057506004612d14565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3d57612d3d6151a8565b90816005811115612d5057612d506151a8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8457612d846151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3857612e386151a8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef8575f80fd5b505af1158015612f0a573d5f803e3d5ffd5b505050505050565b611bf86001600160a01b03831682614710565b60408051606080820183525f8083526020830181905292820152905f80516020615bb08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc191908101906157bf565b91509150806130215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130845760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130f75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131235760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156131725761313a81600161569e565b613145906008615667565b61ffff1686828151811061315b5761315b61542f565b016020015160f81c901b9190911790600101613126565b5061ffff8116156131955760405162461bcd60e51b815260040161068990615925565b5f805b60048110156131f0576131ac81600361569e565b6131b7906008615667565b63ffffffff16876131c9836002615632565b815181106131d9576131d961542f565b016020015160f81c901b9190911790600101613198565b5063ffffffff81166004146132175760405162461bcd60e51b815260040161068990615968565b5f805b602081101561326c5761322e81601f61569e565b613239906008615667565b88613245836006615632565b815181106132555761325561542f565b016020015160f81c901b919091179060010161321a565b505f805b60088110156132cb5761328481600761569e565b61328f906008615667565b6001600160401b0316896132a4836026615632565b815181106132b4576132b461542f565b016020015160f81c901b9190911790600101613270565b505f805b600881101561332a576132e381600761569e565b6132ee906008615667565b6001600160401b03168a61330383602e615632565b815181106133135761331361542f565b016020015160f81c901b91909117906001016132cf565b5091989097509095509350505050565b5f815160261461335c5760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156133ab5761337381600161569e565b61337e906008615667565b61ffff168482815181106133945761339461542f565b016020015160f81c901b919091179060010161335f565b5061ffff8116156133ce5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613429576133e581600361569e565b6133f0906008615667565b63ffffffff1685613402836002615632565b815181106134125761341261542f565b016020015160f81c901b91909117906001016133d1565b5063ffffffff81161561344e5760405162461bcd60e51b815260040161068990615968565b5f805b60208110156128565761346581601f61569e565b613470906008615667565b8661347c836006615632565b8151811061348c5761348c61542f565b016020015160f81c901b9190911790600101613451565b6134ab614fa8565b5f8281525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff1660058111156134f8576134f86151a8565b6005811115613509576135096151a8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357b5761357b6151a8565b146135d75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361b5761361b6151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c785826124e3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137415760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156137905761375881600161569e565b613763906008615667565b61ffff168582815181106137795761377961542f565b016020015160f81c901b9190911790600101613744565b5061ffff8116156137b35760405162461bcd60e51b815260040161068990615925565b5f805b600481101561380e576137ca81600361569e565b6137d5906008615667565b63ffffffff16866137e7836002615632565b815181106137f7576137f761542f565b016020015160f81c901b91909117906001016137b6565b5063ffffffff81166003146138355760405162461bcd60e51b815260040161068990615968565b5f805b602081101561388a5761384c81601f61569e565b613857906008615667565b87613863836006615632565b815181106138735761387361542f565b016020015160f81c901b9190911790600101613838565b505f8660268151811061389f5761389f61542f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b70833981519152816138d884610c6d565b90505f6138e48761217f565b90506138ef87612e71565b61394c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b600281516005811115613961576139616151a8565b146139c05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139d1919061567e565b600485015460408401519192506139f3916001600160401b03909116906159af565b6001600160401b0316816001600160401b03161115613a725760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a7e8a846124e3565b915091505f8a83604051602001613aac92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4757613b476151a8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c995760405162461bcd60e51b8152600401610689906158dc565b5f805b6002811015613ce857613cb081600161569e565b613cbb906008615667565b61ffff16858281518110613cd157613cd161542f565b016020015160f81c901b9190911790600101613c9c565b5061ffff811615613d0b5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613d6657613d2281600361569e565b613d2d906008615667565b63ffffffff1686613d3f836002615632565b81518110613d4f57613d4f61542f565b016020015160f81c901b9190911790600101613d0e565b5063ffffffff8116600514613d8d5760405162461bcd60e51b815260040161068990615968565b5f805b6020811015613de257613da481601f61569e565b613daf906008615667565b87613dbb836006615632565b81518110613dcb57613dcb61542f565b016020015160f81c901b9190911790600101613d90565b505f805b6008811015613e4157613dfa81600761569e565b613e05906008615667565b6001600160401b031688613e1a836026615632565b81518110613e2a57613e2a61542f565b016020015160f81c901b9190911790600101613de6565b5090969095509350505050565b5f80516020615bb08339815191525f6001600160401b038084169085161115613e8257613e7b8385615286565b9050613e8f565b613e8c8484615286565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef1575060028401548151613eed916001600160401b031690615632565b8210155b15613f17576001600160401b038316606082015281815260408101516020820152613f36565b8281606001818151613f29919061567e565b6001600160401b03169052505b6060810151613f469060646159af565b602082015160028601546001600160401b039290921691613f719190600160401b900460ff16615667565b1015613fd55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613ff09190615632565b9052506040810180516001600160401b038716919061401090839061569e565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bf08339815191526020526040812060020180545f80516020615bb083398151915291600160401b9091046001600160401b03169060086140a6836159da565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413557604051631afcd79f60e31b815260040160405180910390fd5b565b61413f6140ec565b614148816147a3565b6141506147bc565b612870608082013560a083013561416d60e0850160c0860161518f565b61417e610100860160e087016159f5565b61ffff1661419461012087016101008801615a0e565b6141a6610140880161012089016153cf565b6147cc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bb083398151915242614255604086016020870161518f565b6001600160401b0316116142c75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142d7604085016020860161518f565b6001600160401b03166142ed6202a30042615632565b116143605760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143b85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143e75760405162461bcd60e51b81526004016106899061558a565b60306143f66040860186615a2e565b90501461445b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614465835f613e4e565b5f806144ff6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144aa919061518f565b6001600160401b031681526020016144c560408a018a615a2e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a10565b5f8281526007860160205260409020919350915061451d8282615ab4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061454a9085906004016152df565b6020604051808303815f875af1158015614566573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458a91906152a6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614602576146026151a8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e2918e01908e0161518f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147335760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477c576040519150601f19603f3d011682016040523d82523d5f602084013e614781565b606091505b505090508061214957604051630a12f52160e11b815260040160405180910390fd5b6147ab6140ec565b6147b3614dbf565b61287081614dc7565b6147c46140ec565b614135614f69565b6147d46140ec565b5f80516020615b70833981519152836148405760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148625760405162461bcd60e51b815260040161068990615891565b858711156148ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149375760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a7a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af157614ab181600161569e565b614abc906008615667565b5081515f90839083908110614ad357614ad361542f565b60200101906001600160f81b03191690815f1a905350600101614a9d565b505f5b6004811015614b5957614b0881600361569e565b614b13906008615667565b600160ff919091161c60f81b82614b2b836002615632565b81518110614b3b57614b3b61542f565b60200101906001600160f81b03191690815f1a905350600101614af4565b505f5b6020811015614bb65784518160208110614b7857614b7861542f565b1a60f81b82614b88836006615632565b81518110614b9857614b9861542f565b60200101906001600160f81b03191690815f1a905350600101614b5c565b505f5b6020811015614c165784602001518160208110614bd857614bd861542f565b1a60f81b82614be8836026615632565b81518110614bf857614bf861542f565b60200101906001600160f81b03191690815f1a905350600101614bb9565b505f5b6008811015614c8a57614c2d81600761569e565b614c38906008615667565b60ff1685604001516001600160401b0316901c60f81b82826046614c5c9190615632565b81518110614c6c57614c6c61542f565b60200101906001600160f81b03191690815f1a905350600101614c19565b505f5b6030811015614cf55784608001518181518110614cac57614cac61542f565b01602001516001600160f81b03191682614cc783604e615632565b81518110614cd757614cd761542f565b60200101906001600160f81b03191690815f1a905350600101614c8d565b505f5b6008811015614d6757614d0c81600761569e565b614d17906008615667565b60608601516001600160401b0390811691161c60f81b82614d3983607e615632565b81518110614d4957614d4961542f565b60200101906001600160f81b03191690815f1a905350600101614cf8565b50600281604051614d789190615621565b602060405180830381855afa158015614d93573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db691906152a6565b94909350915050565b6141356140ec565b614dcf6140ec565b80355f80516020615bb083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1b6080840160608501615a0e565b60ff161115614e885760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e996080840160608501615a0e565b60ff1611614f015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f116080830160608401615a0e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f42606083016040840161518f565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b146140ec565b508054614f7d906156b1565b5f825580601f10614f8c575050565b601f0160209004905f5260205f20908101906128709190614fe4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff8575f8155600101614fe5565b5090565b8015158114612870575f80fd5b803563ffffffff8116811461217a575f80fd5b5f805f6060848603121561502e575f80fd5b83359250602084013561504081614ffc565b915061504e60408501615009565b90509250925092565b5f60208284031215615067575f80fd5b5035919050565b5f610140828403121561507f575f80fd5b50919050565b803561ffff8116811461217a575f80fd5b80356001600160401b038116811461217a575f80fd5b5f805f606084860312156150be575f80fd5b83356001600160401b038111156150d3575f80fd5b8401606081870312156150e4575f80fd5b92506150f260208501615085565b915061504e60408501615096565b5f60208284031215615110575f80fd5b610cb082615009565b5f806040838503121561512a575f80fd5b61513383615009565b946020939093013593505050565b5f8060408385031215615152575f80fd5b82356001600160401b03811115615167575f80fd5b830160808186031215615178575f80fd5b915061518660208401615009565b90509250929050565b5f6020828403121561519f575f80fd5b610cb082615096565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151df57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521a60608401826001600160401b03169052565b50608083015161523560808401826001600160401b03169052565b5060a083015161525060a08401826001600160401b03169052565b5060c083015161526b60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526b5761526b615272565b5f602082840312156152b6575f80fd5b5051919050565b5f5b838110156152d75781810151838201526020016152bf565b50505f910152565b602081525f82518060208401526152fd8160408501602087016152bd565b601f01601f19169190910160400192915050565b5f8261532b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612870575f80fd5b5f602082840312156153df575f80fd5b8135610cb0816153bb565b5f808335601e198436030181126153ff575f80fd5b8301803591506001600160401b03821115615418575f80fd5b6020019150600581901b3603821315612633575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615457575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549757615497615461565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c5576154c5615461565b604052919050565b5f6001600160401b038211156154e5576154e5615461565b50601f01601f191660200190565b5f60608236031215615503575f80fd5b61550b615475565b82358152602061551c818501615096565b8183015260408401356001600160401b03811115615538575f80fd5b840136601f820112615548575f80fd5b803561555b615556826154cd565b61549d565b818152368483850101111561556e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e3818460208a016152bd565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156138160288401602088016152bd565b016028019695505050505050565b5f82516154578184602087016152bd565b80820180821115610c7d57610c7d615272565b5f63ffffffff80831681810361565d5761565d615272565b6001019392505050565b8082028115828204841417610c7d57610c7d615272565b6001600160401b0381811683821601908082111561526b5761526b615272565b81810381811115610c7d57610c7d615272565b600181811c908216806156c557607f821691505b60208210810361507f57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461573c816156b1565b806020870152604060018084165f811461575d5760018114615779576157a6565b60ff19851660408a0152604084151560051b8a010195506157a6565b895f5260205f205f5b8581101561579d5781548b8201860152908301908801615782565b8a016040019650505b509398975050505050505050565b805161217a81614ffc565b5f80604083850312156157d0575f80fd5b82516001600160401b03808211156157e6575f80fd5b90840190606082870312156157f9575f80fd5b615801615475565b82518152602080840151615814816153bb565b82820152604084015183811115615829575f80fd5b80850194505087601f85011261583d575f80fd5b8351925061584d615556846154cd565b8381528882858701011115615860575f80fd5b61586f848383018488016152bd565b806040840152508195506158848188016157b4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159d2576159d2615272565b505092915050565b5f6001600160401b0380831681810361565d5761565d615272565b5f60208284031215615a05575f80fd5b610cb082615085565b5f60208284031215615a1e575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a43575f80fd5b8301803591506001600160401b03821115615a5c575f80fd5b602001915036819003821315612633575f80fd5b601f82111561214957805f5260205f20601f840160051c81016020851015615a955750805b601f840160051c820191505b81811015610d50575f8155600101615aa1565b81516001600160401b03811115615acd57615acd615461565b615ae181615adb84546156b1565b84615a70565b602080601f831160018114615b14575f8415615afd5750858301515b5f19600386901b1c1916600185901b178555612f0a565b5f85815260208120601f198616915b82811015615b4257888601518255948401946001909101908401615b23565b5085821015615b5f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -657,6 +657,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Weight return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ClaimDelegationFees(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "claimDelegationFees", validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimDelegationFees(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimDelegationFees(&_NativeTokenStakingManager.TransactOpts, validationID) +} + // CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // // Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 7787dcb9c..748f854ad 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -136,6 +136,25 @@ abstract contract PoSValidatorManager is $._rewardCalculator = rewardCalculator; } + function claimDelegationFees(bytes32 validationID) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Validator memory validator = getValidator(validationID); + + require( + validator.status == ValidatorStatus.Completed, + "PoSValidatorManager: validation period not completed" + ); + require( + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + + uint256 rewards = $._redeemableValidatorRewards[validationID]; + delete $._redeemableValidatorRewards[validationID]; + _reward($._validatorRequirements[validationID].owner, rewards); + } + function initializeEndValidation( bytes32 validationID, bool includeUptimeProof, diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 6929d8f06..4b8aadcee 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -163,4 +163,11 @@ interface IPoSValidatorManager is IValidatorManager { * @param delegationID The ID of the delegation being removed. */ function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external; + + /** + * @notice Withdraws the delegation fees from completed delegations to the owner of the validator. + * Can currently only be called once the validator has completed its validation period. + * @param validationID The ID of the validation being ended. + */ + function claimDelegationFees(bytes32 validationID) external; } From c9b1556bec67a1887569b182eb4f9a4f58dfda59 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 18:27:44 -0400 Subject: [PATCH 28/36] Hook up native minter precompile to PoS tests --- .../go/INativeMinter/INativeMinter.go | 634 ++++++++++++++++++ scripts/abi_bindings.sh | 9 + tests/flows/staking/native_delegation.go | 2 + tests/flows/staking/native_token_staking.go | 2 + tests/flows/staking/poa_to_pos.go | 2 + tests/utils/chain.go | 13 + tests/utils/warp-genesis-template.json | 3 +- 7 files changed, 664 insertions(+), 1 deletion(-) create mode 100644 abi-bindings/go/INativeMinter/INativeMinter.go diff --git a/abi-bindings/go/INativeMinter/INativeMinter.go b/abi-bindings/go/INativeMinter/INativeMinter.go new file mode 100644 index 000000000..308b401a0 --- /dev/null +++ b/abi-bindings/go/INativeMinter/INativeMinter.go @@ -0,0 +1,634 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package inativeminter + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// INativeMinterMetaData contains all meta data concerning the INativeMinter contract. +var INativeMinterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"mintNativeCoin\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"readAllowList\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"role\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAdmin\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setEnabled\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setManager\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNone\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"NativeCoinMinted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleSet\",\"inputs\":[{\"name\":\"role\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldRole\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", +} + +// INativeMinterABI is the input ABI used to generate the binding from. +// Deprecated: Use INativeMinterMetaData.ABI instead. +var INativeMinterABI = INativeMinterMetaData.ABI + +// INativeMinter is an auto generated Go binding around an Ethereum contract. +type INativeMinter struct { + INativeMinterCaller // Read-only binding to the contract + INativeMinterTransactor // Write-only binding to the contract + INativeMinterFilterer // Log filterer for contract events +} + +// INativeMinterCaller is an auto generated read-only Go binding around an Ethereum contract. +type INativeMinterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type INativeMinterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type INativeMinterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type INativeMinterSession struct { + Contract *INativeMinter // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// INativeMinterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type INativeMinterCallerSession struct { + Contract *INativeMinterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// INativeMinterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type INativeMinterTransactorSession struct { + Contract *INativeMinterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// INativeMinterRaw is an auto generated low-level Go binding around an Ethereum contract. +type INativeMinterRaw struct { + Contract *INativeMinter // Generic contract binding to access the raw methods on +} + +// INativeMinterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type INativeMinterCallerRaw struct { + Contract *INativeMinterCaller // Generic read-only contract binding to access the raw methods on +} + +// INativeMinterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type INativeMinterTransactorRaw struct { + Contract *INativeMinterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewINativeMinter creates a new instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinter(address common.Address, backend bind.ContractBackend) (*INativeMinter, error) { + contract, err := bindINativeMinter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &INativeMinter{INativeMinterCaller: INativeMinterCaller{contract: contract}, INativeMinterTransactor: INativeMinterTransactor{contract: contract}, INativeMinterFilterer: INativeMinterFilterer{contract: contract}}, nil +} + +// NewINativeMinterCaller creates a new read-only instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterCaller(address common.Address, caller bind.ContractCaller) (*INativeMinterCaller, error) { + contract, err := bindINativeMinter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &INativeMinterCaller{contract: contract}, nil +} + +// NewINativeMinterTransactor creates a new write-only instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterTransactor(address common.Address, transactor bind.ContractTransactor) (*INativeMinterTransactor, error) { + contract, err := bindINativeMinter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &INativeMinterTransactor{contract: contract}, nil +} + +// NewINativeMinterFilterer creates a new log filterer instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterFilterer(address common.Address, filterer bind.ContractFilterer) (*INativeMinterFilterer, error) { + contract, err := bindINativeMinter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &INativeMinterFilterer{contract: contract}, nil +} + +// bindINativeMinter binds a generic wrapper to an already deployed contract. +func bindINativeMinter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := INativeMinterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_INativeMinter *INativeMinterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _INativeMinter.Contract.INativeMinterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_INativeMinter *INativeMinterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _INativeMinter.Contract.INativeMinterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_INativeMinter *INativeMinterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _INativeMinter.Contract.INativeMinterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_INativeMinter *INativeMinterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _INativeMinter.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_INativeMinter *INativeMinterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _INativeMinter.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_INativeMinter *INativeMinterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _INativeMinter.Contract.contract.Transact(opts, method, params...) +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterCaller) ReadAllowList(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + var out []interface{} + err := _INativeMinter.contract.Call(opts, &out, "readAllowList", addr) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterSession) ReadAllowList(addr common.Address) (*big.Int, error) { + return _INativeMinter.Contract.ReadAllowList(&_INativeMinter.CallOpts, addr) +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterCallerSession) ReadAllowList(addr common.Address) (*big.Int, error) { + return _INativeMinter.Contract.ReadAllowList(&_INativeMinter.CallOpts, addr) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterTransactor) MintNativeCoin(opts *bind.TransactOpts, addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "mintNativeCoin", addr, amount) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterSession) MintNativeCoin(addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.Contract.MintNativeCoin(&_INativeMinter.TransactOpts, addr, amount) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterTransactorSession) MintNativeCoin(addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.Contract.MintNativeCoin(&_INativeMinter.TransactOpts, addr, amount) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetAdmin(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setAdmin", addr) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetAdmin(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetAdmin(&_INativeMinter.TransactOpts, addr) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetAdmin(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetAdmin(&_INativeMinter.TransactOpts, addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetEnabled(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setEnabled", addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetEnabled(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetEnabled(&_INativeMinter.TransactOpts, addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetEnabled(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetEnabled(&_INativeMinter.TransactOpts, addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetManager(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setManager", addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetManager(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetManager(&_INativeMinter.TransactOpts, addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetManager(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetManager(&_INativeMinter.TransactOpts, addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetNone(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setNone", addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetNone(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetNone(&_INativeMinter.TransactOpts, addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetNone(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetNone(&_INativeMinter.TransactOpts, addr) +} + +// INativeMinterNativeCoinMintedIterator is returned from FilterNativeCoinMinted and is used to iterate over the raw logs and unpacked data for NativeCoinMinted events raised by the INativeMinter contract. +type INativeMinterNativeCoinMintedIterator struct { + Event *INativeMinterNativeCoinMinted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *INativeMinterNativeCoinMintedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(INativeMinterNativeCoinMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(INativeMinterNativeCoinMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *INativeMinterNativeCoinMintedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *INativeMinterNativeCoinMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// INativeMinterNativeCoinMinted represents a NativeCoinMinted event raised by the INativeMinter contract. +type INativeMinterNativeCoinMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNativeCoinMinted is a free log retrieval operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) FilterNativeCoinMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*INativeMinterNativeCoinMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _INativeMinter.contract.FilterLogs(opts, "NativeCoinMinted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &INativeMinterNativeCoinMintedIterator{contract: _INativeMinter.contract, event: "NativeCoinMinted", logs: logs, sub: sub}, nil +} + +// WatchNativeCoinMinted is a free log subscription operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) WatchNativeCoinMinted(opts *bind.WatchOpts, sink chan<- *INativeMinterNativeCoinMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _INativeMinter.contract.WatchLogs(opts, "NativeCoinMinted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(INativeMinterNativeCoinMinted) + if err := _INativeMinter.contract.UnpackLog(event, "NativeCoinMinted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNativeCoinMinted is a log parse operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) ParseNativeCoinMinted(log types.Log) (*INativeMinterNativeCoinMinted, error) { + event := new(INativeMinterNativeCoinMinted) + if err := _INativeMinter.contract.UnpackLog(event, "NativeCoinMinted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// INativeMinterRoleSetIterator is returned from FilterRoleSet and is used to iterate over the raw logs and unpacked data for RoleSet events raised by the INativeMinter contract. +type INativeMinterRoleSetIterator struct { + Event *INativeMinterRoleSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *INativeMinterRoleSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(INativeMinterRoleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(INativeMinterRoleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *INativeMinterRoleSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *INativeMinterRoleSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// INativeMinterRoleSet represents a RoleSet event raised by the INativeMinter contract. +type INativeMinterRoleSet struct { + Role *big.Int + Account common.Address + Sender common.Address + OldRole *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleSet is a free log retrieval operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) FilterRoleSet(opts *bind.FilterOpts, role []*big.Int, account []common.Address, sender []common.Address) (*INativeMinterRoleSetIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _INativeMinter.contract.FilterLogs(opts, "RoleSet", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &INativeMinterRoleSetIterator{contract: _INativeMinter.contract, event: "RoleSet", logs: logs, sub: sub}, nil +} + +// WatchRoleSet is a free log subscription operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) WatchRoleSet(opts *bind.WatchOpts, sink chan<- *INativeMinterRoleSet, role []*big.Int, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _INativeMinter.contract.WatchLogs(opts, "RoleSet", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(INativeMinterRoleSet) + if err := _INativeMinter.contract.UnpackLog(event, "RoleSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRoleSet is a log parse operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) ParseRoleSet(log types.Log) (*INativeMinterRoleSet, error) { + event := new(INativeMinterRoleSet) + if err := _INativeMinter.contract.UnpackLog(event, "RoleSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 55a9b08df..b93d76422 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -20,6 +20,8 @@ DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 Examp PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" +SUBNET_EVM_LIST="INativeMinter" + CONTRACT_LIST= HELP= while [ $# -gt 0 ]; do @@ -103,4 +105,11 @@ forge build --skip test --force --extra-output-files abi bin --contracts lib/ope cd $TELEPORTER_PATH/lib/openzeppelin-contracts/contracts/proxy/transparent generate_bindings "${contract_names[@]}" +contract_names=($SUBNET_EVM_LIST) +cd $TELEPORTER_PATH/ +forge build --skip test --force --extra-output-files abi bin --contracts lib/subnet-evm/contracts/contracts/interfaces + +cd $TELEPORTER_PATH/lib/subnet-evm/contracts/contracts/interfaces +generate_bindings "${contract_names[@]}" + exit 0 diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index d8b7676e4..3c4d6b3fd 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -46,6 +46,8 @@ func NativeDelegation(network interfaces.LocalNetwork) { pChainInfo, ) + utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerAddress) + _ = utils.InitializeNativeTokenValidatorSet( ctx, fundedKey, diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 80e668cb2..d47972c20 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -51,6 +51,8 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, ) + utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerContractAddress) + _ = utils.InitializeNativeTokenValidatorSet( ctx, fundedKey, diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index b8daa4a6e..db9026389 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -152,6 +152,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) + utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, proxyAddress) + rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( ctx, fundedKey, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 07872d456..cf2a3da56 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -24,10 +24,13 @@ import ( "github.com/ava-labs/awm-relayer/peers" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/eth/tracers" "github.com/ava-labs/subnet-evm/ethclient" subnetEvmInterfaces "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ava-labs/subnet-evm/precompile/contracts/nativeminter" + nativeMinter "github.com/ava-labs/teleporter/abi-bindings/go/INativeMinter" "github.com/ava-labs/teleporter/tests/interfaces" gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" "github.com/ethereum/go-ethereum/common" @@ -562,3 +565,13 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu messageCreator, ) } + +// Funded key must have admin access to set new admin. +func AddNativeMinterAdmin(subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { + nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) + Expect(err).Should(BeNil()) + + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) + nativeMinterPrecompile.SetAdmin(opts, address) + Expect(err).Should(BeNil()) +} diff --git a/tests/utils/warp-genesis-template.json b/tests/utils/warp-genesis-template.json index 9d221136e..5dab415be 100644 --- a/tests/utils/warp-genesis-template.json +++ b/tests/utils/warp-genesis-template.json @@ -28,7 +28,8 @@ "blockTimestamp": 0, "adminAddresses": [ "0xAcB633F5B00099c7ec187eB00156c5cd9D854b5B", - "0x3405506b3711859c5070949ed9b700c7ba7bf750" + "0x3405506b3711859c5070949ed9b700c7ba7bf750", + "0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC" ] } }, From bc7ddc72f50bec83423bd26e61ae29ee61b2d38d Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 19:20:39 -0400 Subject: [PATCH 29/36] wait for success in AddNativeMinterAdmin --- tests/flows/staking/native_delegation.go | 2 +- tests/flows/staking/native_token_staking.go | 2 +- tests/flows/staking/poa_to_pos.go | 2 +- tests/utils/chain.go | 7 +++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index 3c4d6b3fd..cda020dcc 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -46,7 +46,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { pChainInfo, ) - utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerAddress) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerAddress) _ = utils.InitializeNativeTokenValidatorSet( ctx, diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index d47972c20..9a0974e61 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -51,7 +51,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, ) - utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerContractAddress) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerContractAddress) _ = utils.InitializeNativeTokenValidatorSet( ctx, diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index db9026389..e69b51b7c 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -152,7 +152,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) - utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, proxyAddress) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, proxyAddress) rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( ctx, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index cf2a3da56..747050683 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -567,11 +567,14 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu } // Funded key must have admin access to set new admin. -func AddNativeMinterAdmin(subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { +func AddNativeMinterAdmin(ctx context.Context, subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) Expect(err).Should(BeNil()) opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) - nativeMinterPrecompile.SetAdmin(opts, address) Expect(err).Should(BeNil()) + tx, err := nativeMinterPrecompile.SetAdmin(opts, address) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + } From 9e80079bb8961746ffa9d37cff87ada2a66c0e7d Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 19:25:00 -0400 Subject: [PATCH 30/36] lint --- tests/utils/chain.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 747050683..ac75d4d02 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -567,7 +567,12 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu } // Funded key must have admin access to set new admin. -func AddNativeMinterAdmin(ctx context.Context, subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { +func AddNativeMinterAdmin( + ctx context.Context, + subnet interfaces.SubnetTestInfo, + fundedKey *ecdsa.PrivateKey, + address common.Address, +) { nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) Expect(err).Should(BeNil()) @@ -576,5 +581,4 @@ func AddNativeMinterAdmin(ctx context.Context, subnet interfaces.SubnetTestInfo, tx, err := nativeMinterPrecompile.SetAdmin(opts, address) Expect(err).Should(BeNil()) WaitForTransactionSuccess(ctx, subnet, tx.Hash()) - } From 015d92e3ba7e4d93d7fe0a92214998a24aa75b67 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 09:47:44 -0400 Subject: [PATCH 31/36] Review fixes --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 18 +++++++++++++----- .../interfaces/IPoSValidatorManager.sol | 4 +++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 0d3ffc0ee..5867696ca 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160ab3803806160ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f5e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c1565b6103ec565b005b61019e6101ae3660046152fc565b61088f565b6101f16101c13660046152fc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fc565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615327565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615365565b610b3d565b61019e61029936600461537e565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a6565b610db2565b6101f16102dc36600461540a565b6113e6565b6102316102ef3660046152fc565b6113ff565b61019e6103023660046152c1565b611413565b61020c603081565b61019e61031d3660046152fc565b61161f565b61019e61033036600461537e565b611770565b6101f1610343366004615423565b611a82565b61019e610356366004615365565b611aae565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fc565b611c66565b61019e6103a23660046152fc565b611eec565b61020c601481565b6103c26103bd3660046152fc565b612000565b6040516101fb9190615457565b6102316202a30081565b6101f16103e736600461551e565b6120c8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615eb2833981519152949193919290829060ff16600481111561045457610454615443565b600481111561046557610465615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183612000565b90506002825160048111156104f8576104f8615443565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ed28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ed28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615443565b036106225786156105e3576105e084876120fd565b90505b5f836060015183608001516105f89190615597565b90506106048582612399565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155b7565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615443565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff1660058111156108dc576108dc615443565b60058111156108ed576108ed615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615443565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124f0565b6040518263ffffffff1660e01b8152600401610a0291906155f0565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155b7565b50505050565b5f610a5864e8d4a5100083615622565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af08484612717565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615eb28339815191525f80610b5684612731565b91509150610b6382612a7b565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615443565b03610bc0575f83815260088501602052604081208054919055610bbe8282612ab6565b505b610bd681610bd184604001516113e6565b612b2c565b5050505050565b5f80516020615eb28339815191525f610bf584612b4f565b90505f80610c068360400151612d29565b50915091505f610c1583612000565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615641565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615683565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615443565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ef28339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155b7565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156cc565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156e7565b91505f9050843560208601356014610fc76060890160408a016156cc565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156e7565b8363ffffffff1681811061105d5761105d61572c565b905060200281019061106f9190615740565b611078906157f0565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615887565b84825f0151836020015184604001516040516020016110cd94939291906158cf565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b919061591e565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155b7565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615443565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661592f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615942565b905061102b565b50600584018190555f61130886612b4f565b90505f6113188260400151612f64565b90508060028560405161132b919061591e565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155b7565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615964565b5f61140982612000565b6080015192915050565b5f80516020615eb28339815191525f61142b856130d6565b905061143685612a7b565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b03169061597b565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120fd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155b7565b5f8781526008850160205260408120805490919061161290849061592f565b9091555050505050505050565b5f80516020615eb28339815191525f61163783612000565b905060048151600581111561164e5761164e615443565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612ab6565b611778613351565b5f80516020615eb28339815191525f61179084612b4f565b90505f806117a18360400151612d29565b50915091505f6117b083612000565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea615443565b60048111156117fb576117fb615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561189a5760405162461bcd60e51b815260040161054190615641565b826001600160401b03168160e001516001600160401b031611156118d05760405162461bcd60e51b815260040161054190615683565b6003815160048111156118e5576118e5615443565b146119395760405162461bcd60e51b815260206004820152603160248201525f80516020615ed28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061198f9061ffff600160a01b9091041684615964565b6119999190615622565b905080886008015f8881526020019081526020015f205f8282546119bd919061592f565b909155505060208301516119da906119d5838561599b565b612ab6565b6119ef8360200151610bd185606001516113e6565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a7e60015f80516020615f1283398151915255565b5050565b5f611a8b613351565b611a9683338461339b565b9050610a5860015f80516020615f1283398151915255565b5f80516020615ef28339815191525f611ac683612b4f565b90505f80611ad78360400151613755565b9150915080611b395760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b53906159ae565b9050118015611b85575060015f83815260088601602052604090205460ff166005811115611b8357611b83615443565b145b611ba15760405162461bcd60e51b8152600401610541906159e6565b5f8281526007850160205260408120611bb991615211565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615eb283398151915293929190829060ff166004811115611cc757611cc7615443565b6004811115611cd857611cd8615443565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5f57611d5f615443565b1480611d7d5750600381516004811115611d7b57611d7b615443565b145b611dd15760405162461bcd60e51b815260206004820152603260248201525f80516020615ed2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611ddf8260400151612000565b905080606001516001600160401b03165f03611e635760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e908460400151846060015185608001516124f0565b6040518263ffffffff1660e01b8152600401611eac91906155f0565b6020604051808303815f875af1158015611ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155b7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ef2833981519152929190611f34906159ae565b9050118015611f66575060015f83815260088301602052604090205460ff166005811115611f6457611f64615443565b145b611f825760405162461bcd60e51b8152600401610541906159e6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fbb9190600401615a2d565b6020604051808303815f875af1158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb91906155b7565b505050565b612008615248565b5f8281525f80516020615f32833981519152602052604090819020815160e0810190925280545f80516020615ef2833981519152929190829060ff16600581111561205557612055615443565b600581111561206657612066615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d1613351565b6120dd858585856138f6565b90506120f560015f80516020615f1283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612148573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216f9190810190615ac2565b91509150806121d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612215573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223991906155b7565b82511461229d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156123135760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123228460400151613b6b565b9150915081871461238f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f32833981519152602052604081206002015481905f80516020615ef283398151915290600160801b90046001600160401b03166123e18582613d43565b5f6123eb87613f51565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243b8a858b6124f0565b6040518263ffffffff1660e01b815260040161245791906155f0565b6020604051808303815f875af1158015612473573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249791906155b7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125695761252981600161599b565b612534906008615964565b5081515f9083908390811061254b5761254b61572c565b60200101906001600160f81b03191690815f1a905350600101612515565b505f5b60048110156125d45761258081600361599b565b61258b906008615964565b600263ffffffff16901c60f81b828260026125a6919061592f565b815181106125b6576125b661572c565b60200101906001600160f81b03191690815f1a90535060010161256c565b505f5b6020811015612636576125eb81601f61599b565b6125f6906008615964565b86901c60f81b8261260883600661592f565b815181106126185761261861572c565b60200101906001600160f81b03191690815f1a9053506001016125d7565b505f5b60088110156126a15761264d81600761599b565b612658906008615964565b6001600160401b038616901c60f81b8261267383602661592f565b815181106126835761268361572c565b60200101906001600160f81b03191690815f1a905350600101612639565b505f5b600881101561270c576126b881600761599b565b6126c3906008615964565b6001600160401b038516901c60f81b826126de83602e61592f565b815181106126ee576126ee61572c565b60200101906001600160f81b03191690815f1a9053506001016126a4565b5090505b9392505050565b61271f613fe1565b6127288261402c565b611a7e816140a3565b5f61273a615248565b5f80516020615ef28339815191525f61275285612b4f565b90505f806127638360400151613755565b9150915080156127c85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f9576127f9615443565b600581111561280a5761280a615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287b5761287b615443565b1480612899575060018251600581111561289757612897615443565b145b6128f85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b60038251600581111561290d5761290d615443565b0361291a5750600461291e565b5060055b6020808301515f9081526009880190915260408120558181600581111561294757612947615443565b9081600581111561295a5761295a615443565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298e5761298e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4257612a42615443565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b11575f80fd5b505af1158015612b23573d5f803e3d5ffd5b50505050505050565b5f80516020615e9283398151915254611a7e906001600160a01b03168383614144565b60408051606080820183525f8083526020830181905292820152905f80516020615ef28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612beb9190810190615ac2565b9150915080612c4b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612cae5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d4d5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612d9c57612d6481600161599b565b612d6f906008615964565b61ffff16868281518110612d8557612d8561572c565b016020015160f81c901b9190911790600101612d50565b5061ffff811615612dbf5760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015612e1a57612dd681600361599b565b612de1906008615964565b63ffffffff1687612df383600261592f565b81518110612e0357612e0361572c565b016020015160f81c901b9190911790600101612dc2565b5063ffffffff8116600414612e415760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015612e9657612e5881601f61599b565b612e63906008615964565b88612e6f83600661592f565b81518110612e7f57612e7f61572c565b016020015160f81c901b9190911790600101612e44565b505f805b6008811015612ef557612eae81600761599b565b612eb9906008615964565b6001600160401b031689612ece83602661592f565b81518110612ede57612ede61572c565b016020015160f81c901b9190911790600101612e9a565b505f805b6008811015612f5457612f0d81600761599b565b612f18906008615964565b6001600160401b03168a612f2d83602e61592f565b81518110612f3d57612f3d61572c565b016020015160f81c901b9190911790600101612ef9565b5091989097509095509350505050565b5f8151602614612f865760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612fd557612f9d81600161599b565b612fa8906008615964565b61ffff16848281518110612fbe57612fbe61572c565b016020015160f81c901b9190911790600101612f89565b5061ffff811615612ff85760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156130535761300f81600361599b565b61301a906008615964565b63ffffffff168561302c83600261592f565b8151811061303c5761303c61572c565b016020015160f81c901b9190911790600101612ffb565b5063ffffffff8116156130785760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156130cd5761308f81601f61599b565b61309a906008615964565b866130a683600661592f565b815181106130b6576130b661572c565b016020015160f81c901b919091179060010161307b565b50949350505050565b6130de615248565b5f8281525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff16600581111561312b5761312b615443565b600581111561313c5761313c615443565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ae576131ae615443565b1461320a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324e5761324e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132fa8582612399565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f1283398151915280546001190161338257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f1283398151915255565b5f5f80516020615eb2833981519152816133b761022c856141a3565b90505f6133c387612000565b90506133ce87612a7b565b61342b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561344057613440615443565b1461349f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134b0919061597b565b600485015460408401519192506134d2916001600160401b0390911690615c67565b6001600160401b0316816001600160401b031611156135515760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061355d8a84612399565b915091505f8a8360405160200161358b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362657613626615443565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137785760405162461bcd60e51b815260040161054190615b94565b5f805b60028110156137c75761378f81600161599b565b61379a906008615964565b61ffff168582815181106137b0576137b061572c565b016020015160f81c901b919091179060010161377b565b5061ffff8116156137ea5760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156138455761380181600361599b565b61380c906008615964565b63ffffffff168661381e83600261592f565b8151811061382e5761382e61572c565b016020015160f81c901b91909117906001016137ed565b5063ffffffff811660031461386c5760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156138c15761388381601f61599b565b61388e906008615964565b8761389a83600661592f565b815181106138aa576138aa61572c565b016020015160f81c901b919091179060010161386f565b505f866026815181106138d6576138d661572c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615eb28339815191529061ffff861610801590613942575061271061ffff861611155b61395e5760405162461bcd60e51b815260040161054190615c92565b60028101546001600160401b0390811690851610156139d75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a3a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613aa15760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aab846141a3565b90505f613ab782610a48565b90505f613ac489836141c6565b90506040518060600160405280613ad83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8e5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015613bdd57613ba581600161599b565b613bb0906008615964565b61ffff16858281518110613bc657613bc661572c565b016020015160f81c901b9190911790600101613b91565b5061ffff811615613c005760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015613c5b57613c1781600361599b565b613c22906008615964565b63ffffffff1686613c3483600261592f565b81518110613c4457613c4461572c565b016020015160f81c901b9190911790600101613c03565b5063ffffffff8116600514613c825760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015613cd757613c9981601f61599b565b613ca4906008615964565b87613cb083600661592f565b81518110613cc057613cc061572c565b016020015160f81c901b9190911790600101613c85565b505f805b6008811015613d3657613cef81600761599b565b613cfa906008615964565b6001600160401b031688613d0f83602661592f565b81518110613d1f57613d1f61572c565b016020015160f81c901b9190911790600101613cdb565b5090969095509350505050565b5f80516020615ef28339815191525f6001600160401b038084169085161115613d7757613d708385615597565b9050613d84565b613d818484615597565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de6575060028401548151613de2916001600160401b03169061592f565b8210155b15613e0c576001600160401b038316606082015281815260408101516020820152613e2b565b8281606001818151613e1e919061597b565b6001600160401b03169052505b6060810151613e3b906064615c67565b602082015160028601546001600160401b039290921691613e669190600160401b900460ff16615964565b1015613eca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ee5919061592f565b9052506040810180516001600160401b0387169190613f0590839061599b565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f328339815191526020526040812060020180545f80516020615ef283398151915291600160401b9091046001600160401b0316906008613f9b83615cdd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402a57604051631afcd79f60e31b815260040160405180910390fd5b565b614034613fe1565b61403d8161472b565b614045614744565b6140a0608082013560a083013561406260e0850160c0860161540a565b614073610100860160e08701615cf8565b61ffff1661408961012087016101008801615d11565b61409b610140880161012089016156cc565b614754565b50565b6140ab613fe1565b5f80516020615e928339815191526001600160a01b0382166141245760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614998565b5f610a58825f80516020615e92833981519152546001600160a01b0316906149f9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142515760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ef283398151915242614270604086016020870161540a565b6001600160401b0316116142e25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142f2604085016020860161540a565b6001600160401b03166143086202a3004261592f565b1161437b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143d35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156144025760405162461bcd60e51b815260040161054190615887565b60306144116040860186615d31565b9050146144765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614480835f613d43565b5f8061451a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c5919061540a565b6001600160401b031681526020016144e060408a018a615d31565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5b565b5f828152600786016020526040902091935091506145388282615db7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145659085906004016155f0565b6020604051808303815f875af1158015614581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a591906155b7565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461d5761461d615443565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fd918e01908e0161540a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614733613fe1565b61473b614f0a565b6140a081614f12565b61474c613fe1565b61402a6150b4565b61475c613fe1565b5f80516020615eb2833981519152836147c85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147ea5760405162461bcd60e51b815260040161054190615c92565b858711156148525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ac6001600160a01b038416836150bc565b905080515f141580156149d05750808060200190518101906149ce9190615e76565b155b15611ffb57604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6391906155b7565b9050614a7a6001600160a01b0385163330866150c9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae291906155b7565b9050818111614b485760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b52828261599b565b95945050505050565b5f6060826080015151603014614bc55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3c57614bfc81600161599b565b614c07906008615964565b5081515f90839083908110614c1e57614c1e61572c565b60200101906001600160f81b03191690815f1a905350600101614be8565b505f5b6004811015614ca457614c5381600361599b565b614c5e906008615964565b600160ff919091161c60f81b82614c7683600261592f565b81518110614c8657614c8661572c565b60200101906001600160f81b03191690815f1a905350600101614c3f565b505f5b6020811015614d015784518160208110614cc357614cc361572c565b1a60f81b82614cd383600661592f565b81518110614ce357614ce361572c565b60200101906001600160f81b03191690815f1a905350600101614ca7565b505f5b6020811015614d615784602001518160208110614d2357614d2361572c565b1a60f81b82614d3383602661592f565b81518110614d4357614d4361572c565b60200101906001600160f81b03191690815f1a905350600101614d04565b505f5b6008811015614dd557614d7881600761599b565b614d83906008615964565b60ff1685604001516001600160401b0316901c60f81b82826046614da7919061592f565b81518110614db757614db761572c565b60200101906001600160f81b03191690815f1a905350600101614d64565b505f5b6030811015614e405784608001518181518110614df757614df761572c565b01602001516001600160f81b03191682614e1283604e61592f565b81518110614e2257614e2261572c565b60200101906001600160f81b03191690815f1a905350600101614dd8565b505f5b6008811015614eb257614e5781600761599b565b614e62906008615964565b60608601516001600160401b0390811691161c60f81b82614e8483607e61592f565b81518110614e9457614e9461572c565b60200101906001600160f81b03191690815f1a905350600101614e43565b50600281604051614ec3919061591e565b602060405180830381855afa158015614ede573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0191906155b7565b94909350915050565b61402a613fe1565b614f1a613fe1565b80355f80516020615ef283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f666080840160608501615d11565b60ff161115614fd35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fe46080840160608501615d11565b60ff161161504c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b61505c6080830160608401615d11565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508d606083016040840161540a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613388613fe1565b606061271083835f615102565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614171565b6060814710156151275760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b03168486604051615142919061591e565b5f6040518083038185875af1925050503d805f811461517c576040519150601f19603f3d011682016040523d82523d5f602084013e615181565b606091505b509150915061238f8683836060826151a15761519c826151e8565b612710565b81511580156151b857506001600160a01b0384163b155b156151e157604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612710565b8051156151f85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521d906159ae565b5f825580601f1061522c575050565b601f0160209004905f5260205f20908101906140a09190615284565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615298575f8155600101615285565b5090565b80151581146140a0575f80fd5b803563ffffffff811681146152bc575f80fd5b919050565b5f805f606084860312156152d3575f80fd5b8335925060208401356152e58161529c565b91506152f3604085016152a9565b90509250925092565b5f6020828403121561530c575f80fd5b5035919050565b6001600160a01b03811681146140a0575f80fd5b5f8082840361016081121561533a575f80fd5b61014080821215615349575f80fd5b849350830135905061535a81615313565b809150509250929050565b5f60208284031215615375575f80fd5b612710826152a9565b5f806040838503121561538f575f80fd5b615398836152a9565b946020939093013593505050565b5f80604083850312156153b7575f80fd5b82356001600160401b038111156153cc575f80fd5b8301608081860312156153dd575f80fd5b91506153eb602084016152a9565b90509250929050565b80356001600160401b03811681146152bc575f80fd5b5f6020828403121561541a575f80fd5b612710826153f4565b5f8060408385031215615434575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b560608401826001600160401b03169052565b5060808301516154d060808401826001600160401b03169052565b5060a08301516154eb60a08401826001600160401b03169052565b5060c083015161550660c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bc575f80fd5b5f805f8060808587031215615531575f80fd5b84356001600160401b03811115615546575f80fd5b850160608188031215615557575f80fd5b93506155656020860161550d565b9250615573604086016153f4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550657615506615583565b5f602082840312156155c7575f80fd5b5051919050565b5f5b838110156155e85781810151838201526020016155d0565b50505f910152565b602081525f825180602084015261560e8160408501602087016155ce565b601f01601f19169190910160400192915050565b5f8261563c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156dc575f80fd5b813561271081615313565b5f808335601e198436030181126156fc575f80fd5b8301803591506001600160401b03821115615715575f80fd5b6020019150600581901b36038213156124e9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615754575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157945761579461575e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c2576157c261575e565b604052919050565b5f6001600160401b038211156157e2576157e261575e565b50601f01601f191660200190565b5f60608236031215615800575f80fd5b615808615772565b8235815260206158198185016153f4565b8183015260408401356001600160401b03811115615835575f80fd5b840136601f820112615845575f80fd5b8035615858615853826157ca565b61579a565b818152368483850101111561586b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158e0818460208a016155ce565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159108160288401602088016155ce565b016028019695505050505050565b5f82516157548184602087016155ce565b80820180821115610a5857610a58615583565b5f63ffffffff80831681810361595a5761595a615583565b6001019392505050565b8082028115828204841417610a5857610a58615583565b6001600160401b0381811683821601908082111561550657615506615583565b81810381811115610a5857610a58615583565b600181811c908216806159c257607f821691505b6020821081036159e057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a3f816159ae565b806020870152604060018084165f8114615a605760018114615a7c57615aa9565b60ff19851660408a0152604084151560051b8a01019550615aa9565b895f5260205f205f5b85811015615aa05781548b8201860152908301908801615a85565b8a016040019650505b509398975050505050505050565b80516152bc8161529c565b5f8060408385031215615ad3575f80fd5b82516001600160401b0380821115615ae9575f80fd5b9084019060608287031215615afc575f80fd5b615b04615772565b82518152602080840151615b1781615313565b82820152604084015183811115615b2c575f80fd5b80850194505087601f850112615b40575f80fd5b83519250615b50615853846157ca565b8381528882858701011115615b63575f80fd5b615b72848383018488016155ce565b80604084015250819550615b87818801615ab7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8a57615c8a615583565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595a5761595a615583565b5f60208284031215615d08575f80fd5b6127108261550d565b5f60208284031215615d21575f80fd5b813560ff81168114612710575f80fd5b5f808335601e19843603018112615d46575f80fd5b8301803591506001600160401b03821115615d5f575f80fd5b6020019150368190038213156124e9575f80fd5b601f821115611ffb57805f5260205f20601f840160051c81016020851015615d985750805b601f840160051c820191505b81811015610bd6575f8155600101615da4565b81516001600160401b03811115615dd057615dd061575e565b615de481615dde84546159ae565b84615d73565b602080601f831160018114615e17575f8415615e005750858301515b5f19600386901b1c1916600185901b178555615e6e565b5f85815260208120601f198616915b82811015615e4557888601518255948401946001909101908401615e26565b5085821015615e6257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e86575f80fd5b81516127108161529c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160a23803806160a283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f558061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152b8565b6103ec565b005b61019e6101ae3660046152f3565b61088f565b6101f16101c13660046152f3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152f3565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461531e565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e61028636600461535c565b610b3d565b61019e610299366004615375565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461539d565b610db2565b6101f16102dc366004615401565b6113e6565b6102316102ef3660046152f3565b6113ff565b61019e6103023660046152b8565b611413565b61020c603081565b61019e61031d3660046152f3565b61161f565b61019e610330366004615375565b611770565b6101f161034336600461541a565b611a79565b61019e61035636600461535c565b611aa5565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152f3565b611c5d565b61019e6103a23660046152f3565b611ee3565b61020c601481565b6103c26103bd3660046152f3565b611ff7565b6040516101fb919061544e565b6102316202a30081565b6101f16103e7366004615515565b6120bf565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ea9833981519152949193919290829060ff1660048111156104545761045461543a565b60048111156104655761046561543a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611ff7565b90506002825160048111156104f8576104f861543a565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ec98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ec98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb61543a565b036106225786156105e3576105e084876120f4565b90505b5f836060015183608001516105f8919061558e565b90506106048582612390565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155ae565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156107695761076961543a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156108dc576108dc61543a565b60058111156108ed576108ed61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c61543a565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124e7565b6040518263ffffffff1660e01b8152600401610a0291906155e7565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155ae565b50505050565b5f610a5864e8d4a5100083615619565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af0848461270e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ea98339815191525f80610b5684612728565b91509150610b6382612a72565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b61543a565b03610bc0575f83815260088501602052604081208054919055610bbe8282612aad565b505b610bd681610bd184604001516113e6565b612b23565b5050505050565b5f80516020615ea98339815191525f610bf584612b46565b90505f80610c068360400151612d20565b50915091505f610c1583611ff7565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615638565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b81526004016105419061567a565b60015f87815260068701602052604090205460ff166004811115610cb857610cb861543a565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ee98339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155ae565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156c3565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156de565b91505f9050843560208601356014610fc76060890160408a016156c3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156de565b8363ffffffff1681811061105d5761105d615723565b905060200281019061106f9190615737565b611078906157e7565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b81526004016105419061587e565b84825f0151836020015184604001516040516020016110cd94939291906158c6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b9190615915565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155ae565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e561543a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611298911686615926565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615939565b905061102b565b50600584018190555f61130886612b46565b90505f6113188260400151612f5b565b90508060028560405161132b9190615915565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155ae565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a5100061595b565b5f61140982611ff7565b6080015192915050565b5f80516020615ea98339815191525f61142b856130cd565b905061143685612a72565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b031690615972565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120f4565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155ae565b5f87815260088501602052604081208054909190611612908490615926565b9091555050505050505050565b5f80516020615ea98339815191525f61163783611ff7565b905060048151600581111561164e5761164e61543a565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612aad565b611778613348565b5f80516020615ea98339815191525f61179084612b46565b90505f806117a18360400151612d20565b50915091505f6117b083611ff7565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea61543a565b60048111156117fb576117fb61543a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118df5760405162461bcd60e51b815260040161054190615638565b826001600160401b03168160e001516001600160401b031611156119155760405162461bcd60e51b81526004016105419061567a565b60038151600481111561192a5761192a61543a565b1461197e5760405162461bcd60e51b815260206004820152603160248201525f80516020615ec98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119bf90600160a01b900461ffff168461595b565b6119c99190615619565b905080886008015f8881526020019081526020015f205f8282546119ed9190615926565b90915550506020830151611a0a90611a058385615992565b612aad565b611a1f8360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a7560015f80516020615f0983398151915255565b5050565b5f611a82613348565b611a8d833384613392565b9050610a5860015f80516020615f0983398151915255565b5f80516020615ee98339815191525f611abd83612b46565b90505f80611ace836040015161374c565b9150915080611b305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b4a906159a5565b9050118015611b7c575060015f83815260088601602052604090205460ff166005811115611b7a57611b7a61543a565b145b611b985760405162461bcd60e51b8152600401610541906159dd565b5f8281526007850160205260408120611bb091615208565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ea983398151915293929190829060ff166004811115611cbe57611cbe61543a565b6004811115611ccf57611ccf61543a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5657611d5661543a565b1480611d745750600381516004811115611d7257611d7261543a565b145b611dc85760405162461bcd60e51b815260206004820152603260248201525f80516020615ec9833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dd68260400151611ff7565b905080606001516001600160401b03165f03611e5a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e878460400151846060015185608001516124e7565b6040518263ffffffff1660e01b8152600401611ea391906155e7565b6020604051808303815f875af1158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155ae565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ee9833981519152929190611f2b906159a5565b9050118015611f5d575060015f83815260088301602052604090205460ff166005811115611f5b57611f5b61543a565b145b611f795760405162461bcd60e51b8152600401610541906159dd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fb29190600401615a24565b6020604051808303815f875af1158015611fce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff291906155ae565b505050565b611fff61523f565b5f8281525f80516020615f29833981519152602052604090819020815160e0810190925280545f80516020615ee9833981519152929190829060ff16600581111561204c5761204c61543a565b600581111561205d5761205d61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120c8613348565b6120d4858585856138ed565b90506120ec60015f80516020615f0983398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561213f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121669190810190615ab9565b91509150806121c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561220c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223091906155ae565b8251146122945760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b03161561230a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123198460400151613b62565b915091508187146123865760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f29833981519152602052604081206002015481905f80516020615ee983398151915290600160801b90046001600160401b03166123d88582613d3a565b5f6123e287613f48565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124328a858b6124e7565b6040518263ffffffff1660e01b815260040161244e91906155e7565b6020604051808303815f875af115801561246a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e91906155ae565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561256057612520816001615992565b61252b90600861595b565b5081515f9083908390811061254257612542615723565b60200101906001600160f81b03191690815f1a90535060010161250c565b505f5b60048110156125cb57612577816003615992565b61258290600861595b565b600263ffffffff16901c60f81b8282600261259d9190615926565b815181106125ad576125ad615723565b60200101906001600160f81b03191690815f1a905350600101612563565b505f5b602081101561262d576125e281601f615992565b6125ed90600861595b565b86901c60f81b826125ff836006615926565b8151811061260f5761260f615723565b60200101906001600160f81b03191690815f1a9053506001016125ce565b505f5b600881101561269857612644816007615992565b61264f90600861595b565b6001600160401b038616901c60f81b8261266a836026615926565b8151811061267a5761267a615723565b60200101906001600160f81b03191690815f1a905350600101612630565b505f5b6008811015612703576126af816007615992565b6126ba90600861595b565b6001600160401b038516901c60f81b826126d583602e615926565b815181106126e5576126e5615723565b60200101906001600160f81b03191690815f1a90535060010161269b565b5090505b9392505050565b612716613fd8565b61271f82614023565b611a758161409a565b5f61273161523f565b5f80516020615ee98339815191525f61274985612b46565b90505f8061275a836040015161374c565b9150915080156127bf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f0576127f061543a565b60058111156128015761280161543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128725761287261543a565b1480612890575060018251600581111561288e5761288e61543a565b145b6128ef5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156129045761290461543a565b0361291157506004612915565b5060055b6020808301515f9081526009880190915260408120558181600581111561293e5761293e61543a565b908160058111156129515761295161543a565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129855761298561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a3957612a3961543a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e8983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b08575f80fd5b505af1158015612b1a573d5f803e3d5ffd5b50505050505050565b5f80516020615e8983398151915254611a75906001600160a01b0316838361413b565b60408051606080820183525f8083526020830181905292820152905f80516020615ee98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bbb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612be29190810190615ab9565b9150915080612c425760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612ca55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d445760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612d9357612d5b816001615992565b612d6690600861595b565b61ffff16868281518110612d7c57612d7c615723565b016020015160f81c901b9190911790600101612d47565b5061ffff811615612db65760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015612e1157612dcd816003615992565b612dd890600861595b565b63ffffffff1687612dea836002615926565b81518110612dfa57612dfa615723565b016020015160f81c901b9190911790600101612db9565b5063ffffffff8116600414612e385760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015612e8d57612e4f81601f615992565b612e5a90600861595b565b88612e66836006615926565b81518110612e7657612e76615723565b016020015160f81c901b9190911790600101612e3b565b505f805b6008811015612eec57612ea5816007615992565b612eb090600861595b565b6001600160401b031689612ec5836026615926565b81518110612ed557612ed5615723565b016020015160f81c901b9190911790600101612e91565b505f805b6008811015612f4b57612f04816007615992565b612f0f90600861595b565b6001600160401b03168a612f2483602e615926565b81518110612f3457612f34615723565b016020015160f81c901b9190911790600101612ef0565b5091989097509095509350505050565b5f8151602614612f7d5760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612fcc57612f94816001615992565b612f9f90600861595b565b61ffff16848281518110612fb557612fb5615723565b016020015160f81c901b9190911790600101612f80565b5061ffff811615612fef5760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561304a57613006816003615992565b61301190600861595b565b63ffffffff1685613023836002615926565b8151811061303357613033615723565b016020015160f81c901b9190911790600101612ff2565b5063ffffffff81161561306f5760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156130c45761308681601f615992565b61309190600861595b565b8661309d836006615926565b815181106130ad576130ad615723565b016020015160f81c901b9190911790600101613072565b50949350505050565b6130d561523f565b5f8281525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156131225761312261543a565b60058111156131335761313361543a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131a5576131a561543a565b146132015760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156132455761324561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f18582612390565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f0983398151915280546001190161337957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f0983398151915255565b5f5f80516020615ea9833981519152816133ae61022c8561419a565b90505f6133ba87611ff7565b90506133c587612a72565b6134225760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b6002815160058111156134375761343761543a565b146134965760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134a79190615972565b600485015460408401519192506134c9916001600160401b0390911690615c5e565b6001600160401b0316816001600160401b031611156135485760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f806135548a84612390565b915091505f8a8360405160200161358292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561361d5761361d61543a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461376f5760405162461bcd60e51b815260040161054190615b8b565b5f805b60028110156137be57613786816001615992565b61379190600861595b565b61ffff168582815181106137a7576137a7615723565b016020015160f81c901b9190911790600101613772565b5061ffff8116156137e15760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561383c576137f8816003615992565b61380390600861595b565b63ffffffff1686613815836002615926565b8151811061382557613825615723565b016020015160f81c901b91909117906001016137e4565b5063ffffffff81166003146138635760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156138b85761387a81601f615992565b61388590600861595b565b87613891836006615926565b815181106138a1576138a1615723565b016020015160f81c901b9190911790600101613866565b505f866026815181106138cd576138cd615723565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ea98339815191529061ffff861610801590613939575061271061ffff861611155b6139555760405162461bcd60e51b815260040161054190615c89565b60028101546001600160401b0390811690851610156139ce5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a985760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aa28461419a565b90505f613aae82610a48565b90505f613abb89836141bd565b90506040518060600160405280613acf3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b855760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015613bd457613b9c816001615992565b613ba790600861595b565b61ffff16858281518110613bbd57613bbd615723565b016020015160f81c901b9190911790600101613b88565b5061ffff811615613bf75760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015613c5257613c0e816003615992565b613c1990600861595b565b63ffffffff1686613c2b836002615926565b81518110613c3b57613c3b615723565b016020015160f81c901b9190911790600101613bfa565b5063ffffffff8116600514613c795760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015613cce57613c9081601f615992565b613c9b90600861595b565b87613ca7836006615926565b81518110613cb757613cb7615723565b016020015160f81c901b9190911790600101613c7c565b505f805b6008811015613d2d57613ce6816007615992565b613cf190600861595b565b6001600160401b031688613d06836026615926565b81518110613d1657613d16615723565b016020015160f81c901b9190911790600101613cd2565b5090969095509350505050565b5f80516020615ee98339815191525f6001600160401b038084169085161115613d6e57613d67838561558e565b9050613d7b565b613d78848461558e565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ddd575060028401548151613dd9916001600160401b031690615926565b8210155b15613e03576001600160401b038316606082015281815260408101516020820152613e22565b8281606001818151613e159190615972565b6001600160401b03169052505b6060810151613e32906064615c5e565b602082015160028601546001600160401b039290921691613e5d9190600160401b900460ff1661595b565b1015613ec15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613edc9190615926565b9052506040810180516001600160401b0387169190613efc908390615992565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f298339815191526020526040812060020180545f80516020615ee983398151915291600160401b9091046001600160401b0316906008613f9283615cd4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402157604051631afcd79f60e31b815260040160405180910390fd5b565b61402b613fd8565b61403481614722565b61403c61473b565b614097608082013560a083013561405960e0850160c08601615401565b61406a610100860160e08701615cef565b61ffff1661408061012087016101008801615d08565b614092610140880161012089016156c3565b61474b565b50565b6140a2613fd8565b5f80516020615e898339815191526001600160a01b03821661411b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ff291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061498f565b5f610a58825f80516020615e89833981519152546001600160a01b0316906149f0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ee9833981519152426142676040860160208701615401565b6001600160401b0316116142d95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142e96040850160208601615401565b6001600160401b03166142ff6202a30042615926565b116143725760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143ca5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143f95760405162461bcd60e51b81526004016105419061587e565b60306144086040860186615d28565b90501461446d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614477835f613d3a565b5f806145116040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144bc9190615401565b6001600160401b031681526020016144d760408a018a615d28565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b52565b5f8281526007860160205260409020919350915061452f8282615dae565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061455c9085906004016155e7565b6020604051808303815f875af1158015614578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459c91906155ae565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156146145761461461543a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146f4918e01908e01615401565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61472a613fd8565b614732614f01565b61409781614f09565b614743613fd8565b6140216150ab565b614753613fd8565b5f80516020615ea9833981519152836147bf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147e15760405162461bcd60e51b815260040161054190615c89565b858711156148495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148b65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149a36001600160a01b038416836150b3565b905080515f141580156149c75750808060200190518101906149c59190615e6d565b155b15611ff257604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a5a91906155ae565b9050614a716001600160a01b0385163330866150c0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ad991906155ae565b9050818111614b3f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b498282615992565b95945050505050565b5f6060826080015151603014614bbc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3357614bf3816001615992565b614bfe90600861595b565b5081515f90839083908110614c1557614c15615723565b60200101906001600160f81b03191690815f1a905350600101614bdf565b505f5b6004811015614c9b57614c4a816003615992565b614c5590600861595b565b600160ff919091161c60f81b82614c6d836002615926565b81518110614c7d57614c7d615723565b60200101906001600160f81b03191690815f1a905350600101614c36565b505f5b6020811015614cf85784518160208110614cba57614cba615723565b1a60f81b82614cca836006615926565b81518110614cda57614cda615723565b60200101906001600160f81b03191690815f1a905350600101614c9e565b505f5b6020811015614d585784602001518160208110614d1a57614d1a615723565b1a60f81b82614d2a836026615926565b81518110614d3a57614d3a615723565b60200101906001600160f81b03191690815f1a905350600101614cfb565b505f5b6008811015614dcc57614d6f816007615992565b614d7a90600861595b565b60ff1685604001516001600160401b0316901c60f81b82826046614d9e9190615926565b81518110614dae57614dae615723565b60200101906001600160f81b03191690815f1a905350600101614d5b565b505f5b6030811015614e375784608001518181518110614dee57614dee615723565b01602001516001600160f81b03191682614e0983604e615926565b81518110614e1957614e19615723565b60200101906001600160f81b03191690815f1a905350600101614dcf565b505f5b6008811015614ea957614e4e816007615992565b614e5990600861595b565b60608601516001600160401b0390811691161c60f81b82614e7b83607e615926565b81518110614e8b57614e8b615723565b60200101906001600160f81b03191690815f1a905350600101614e3a565b50600281604051614eba9190615915565b602060405180830381855afa158015614ed5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ef891906155ae565b94909350915050565b614021613fd8565b614f11613fd8565b80355f80516020615ee983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f5d6080840160608501615d08565b60ff161115614fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fdb6080840160608501615d08565b60ff16116150435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150536080830160608401615d08565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150846060830160408401615401565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61337f613fd8565b606061270783835f6150f9565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614168565b60608147101561511e5760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b031684866040516151399190615915565b5f6040518083038185875af1925050503d805f8114615173576040519150601f19603f3d011682016040523d82523d5f602084013e615178565b606091505b509150915061238686838360608261519857615193826151df565b612707565b81511580156151af57506001600160a01b0384163b155b156151d857604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612707565b8051156151ef5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615214906159a5565b5f825580601f10615223575050565b601f0160209004905f5260205f2090810190614097919061527b565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561528f575f815560010161527c565b5090565b8015158114614097575f80fd5b803563ffffffff811681146152b3575f80fd5b919050565b5f805f606084860312156152ca575f80fd5b8335925060208401356152dc81615293565b91506152ea604085016152a0565b90509250925092565b5f60208284031215615303575f80fd5b5035919050565b6001600160a01b0381168114614097575f80fd5b5f80828403610160811215615331575f80fd5b61014080821215615340575f80fd5b84935083013590506153518161530a565b809150509250929050565b5f6020828403121561536c575f80fd5b612707826152a0565b5f8060408385031215615386575f80fd5b61538f836152a0565b946020939093013593505050565b5f80604083850312156153ae575f80fd5b82356001600160401b038111156153c3575f80fd5b8301608081860312156153d4575f80fd5b91506153e2602084016152a0565b90509250929050565b80356001600160401b03811681146152b3575f80fd5b5f60208284031215615411575f80fd5b612707826153eb565b5f806040838503121561542b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154ac60608401826001600160401b03169052565b5060808301516154c760808401826001600160401b03169052565b5060a08301516154e260a08401826001600160401b03169052565b5060c08301516154fd60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152b3575f80fd5b5f805f8060808587031215615528575f80fd5b84356001600160401b0381111561553d575f80fd5b85016060818803121561554e575f80fd5b935061555c60208601615504565b925061556a604086016153eb565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154fd576154fd61557a565b5f602082840312156155be575f80fd5b5051919050565b5f5b838110156155df5781810151838201526020016155c7565b50505f910152565b602081525f82518060208401526156058160408501602087016155c5565b601f01601f19169190910160400192915050565b5f8261563357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156d3575f80fd5b81356127078161530a565b5f808335601e198436030181126156f3575f80fd5b8301803591506001600160401b0382111561570c575f80fd5b6020019150600581901b36038213156124e0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261574b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561578b5761578b615755565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157b9576157b9615755565b604052919050565b5f6001600160401b038211156157d9576157d9615755565b50601f01601f191660200190565b5f606082360312156157f7575f80fd5b6157ff615769565b8235815260206158108185016153eb565b8183015260408401356001600160401b0381111561582c575f80fd5b840136601f82011261583c575f80fd5b803561584f61584a826157c1565b615791565b8181523684838501011115615862575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158d7818460208a016155c5565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159078160288401602088016155c5565b016028019695505050505050565b5f825161574b8184602087016155c5565b80820180821115610a5857610a5861557a565b5f63ffffffff8083168181036159515761595161557a565b6001019392505050565b8082028115828204841417610a5857610a5861557a565b6001600160401b038181168382160190808211156154fd576154fd61557a565b81810381811115610a5857610a5861557a565b600181811c908216806159b957607f821691505b6020821081036159d757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a36816159a5565b806020870152604060018084165f8114615a575760018114615a7357615aa0565b60ff19851660408a0152604084151560051b8a01019550615aa0565b895f5260205f205f5b85811015615a975781548b8201860152908301908801615a7c565b8a016040019650505b509398975050505050505050565b80516152b381615293565b5f8060408385031215615aca575f80fd5b82516001600160401b0380821115615ae0575f80fd5b9084019060608287031215615af3575f80fd5b615afb615769565b82518152602080840151615b0e8161530a565b82820152604084015183811115615b23575f80fd5b80850194505087601f850112615b37575f80fd5b83519250615b4761584a846157c1565b8381528882858701011115615b5a575f80fd5b615b69848383018488016155c5565b80604084015250819550615b7e818801615aae565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8157615c8161557a565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036159515761595161557a565b5f60208284031215615cff575f80fd5b61270782615504565b5f60208284031215615d18575f80fd5b813560ff81168114612707575f80fd5b5f808335601e19843603018112615d3d575f80fd5b8301803591506001600160401b03821115615d56575f80fd5b6020019150368190038213156124e0575f80fd5b601f821115611ff257805f5260205f20601f840160051c81016020851015615d8f5750805b601f840160051c820191505b81811015610bd6575f8155600101615d9b565b81516001600160401b03811115615dc757615dc7615755565b615ddb81615dd584546159a5565b84615d6a565b602080601f831160018114615e0e575f8415615df75750858301515b5f19600386901b1c1916600185901b178555615e65565b5f85815260208120601f198616915b82811015615e3c57888601518255948401946001909101908401615e1d565b5085821015615e5957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e7d575f80fd5b81516127078161529356fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index aa630ebfe..1a312f622 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d69380380615d6983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c1c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501c565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615057565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615057565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506e565b610b90565b348015610286575f80fd5b5061029a610295366004615057565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ac565b610c83565b34801561032a575f80fd5b506101b8610339366004615100565b610cb7565b348015610349575f80fd5b506101b8610358366004615119565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615141565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461518f565b611560565b3480156103cf575f80fd5b5061029a6103de366004615057565b611579565b3480156103ee575f80fd5b506101b86103fd36600461501c565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615057565b611799565b348015610440575f80fd5b506101b861044f366004615119565b6118ea565b34801561045f575f80fd5b506101b861046e366004615100565b611bfc565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615057565b611db4565b3480156104b7575f80fd5b506101b86104c6366004615057565b61203a565b6102236104d9366004615057565b61214e565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615057565b61217f565b60405161022d91906151bc565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b70833981519152949193919290829060ff16600481111561059c5761059c6151a8565b60048111156105ad576105ad6151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361217f565b9050600282516004811115610640576106406151a8565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b908339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b908339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f906002906005811115610713576107136151a8565b0361076a57861561072b576107288487612247565b90505b5f836060015183608001516107409190615286565b905061074c85826124e3565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087291906152a6565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b16151a8565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff166005811115610a2457610a246151a8565b6005811115610a3557610a356151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa46151a8565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f61263a565b6040518263ffffffff1660e01b8152600401610b4a91906152df565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a91906152a6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361285f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615311565b92915050565b5f610c8c612873565b610c98848484346128aa565b9050610cb060015f80516020615bd083398151915255565b9392505050565b5f80516020615b708339815191525f80610cd084612b27565b91509150610cdd82612e71565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d156151a8565b03610d3a575f83815260088501602052604081208054919055610d388282612eac565b505b610d5081610d4b8460400151611560565b612f12565b5050505050565b5f80516020615b708339815191525f610d6f84612f25565b90505f80610d8083604001516130ff565b50915091505f610d8f8361217f565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615330565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615372565b60015f87815260068701602052604090205460ff166004811115610e3257610e326151a8565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bb08339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103091906152a6565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153cf565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153ea565b91505f90508435602086013560146111416060890160408a016153cf565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153ea565b8363ffffffff168181106111d7576111d761542f565b90506020028101906111e99190615443565b6111f2906154f3565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b81526004016106899061558a565b84825f01518360200151846040015160405160200161124794939291906155d2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615621565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d391906152a6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f6151a8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615632565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615645565b90506111a5565b50600584018190555f61148286612f25565b90505f611492826040015161333a565b9050806002856040516114a59190615621565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e391906152a6565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615667565b5f6115838261217f565b6080015192915050565b5f80516020615b708339815191525f6115a5856134a3565b90506115b085612e71565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b03169061567e565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c8685612247565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d91906152a6565b5f8781526008850160205260408120805490919061178c908490615632565b9091555050505050505050565b5f80516020615b708339815191525f6117b18361217f565b90506004815160058111156117c8576117c86151a8565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612eac565b6118f2612873565b5f80516020615b708339815191525f61190a84612f25565b90505f8061191b83604001516130ff565b50915091505f61192a8361217f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611964576119646151a8565b6004811115611975576119756151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e09092019190915284015191925084811691161015611a145760405162461bcd60e51b815260040161068990615330565b826001600160401b03168160e001516001600160401b03161115611a4a5760405162461bcd60e51b815260040161068990615372565b600381516004811115611a5f57611a5f6151a8565b14611ab35760405162461bcd60e51b815260206004820152603160248201525f80516020615b908339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a0190925282205490919061271090611b099061ffff600160a01b9091041684615667565b611b139190615311565b905080886008015f8881526020019081526020015f205f828254611b379190615632565b90915550506020830151611b5490611b4f838561569e565b612eac565b611b698360200151610d4b8560600151611560565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611bf860015f80516020615bd083398151915255565b5050565b5f80516020615bb08339815191525f611c1483612f25565b90505f80611c25836040015161371e565b9150915080611c875760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611ca1906156b1565b9050118015611cd3575060015f83815260088601602052604090205460ff166005811115611cd157611cd16151a8565b145b611cef5760405162461bcd60e51b8152600401610689906156e3565b5f8281526007850160205260408120611d0791614f71565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b7083398151915293929190829060ff166004811115611e1557611e156151a8565b6004811115611e2657611e266151a8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ead57611ead6151a8565b1480611ecb5750600381516004811115611ec957611ec96151a8565b145b611f1f5760405162461bcd60e51b815260206004820152603260248201525f80516020615b90833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f2d826040015161217f565b905080606001516001600160401b03165f03611fb15760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fde84604001518460600151856080015161263a565b6040518263ffffffff1660e01b8152600401611ffa91906152df565b6020604051808303815f875af1158015612016573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5091906152a6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bb0833981519152929190612082906156b1565b90501180156120b4575060015f83815260088301602052604090205460ff1660058111156120b2576120b26151a8565b145b6120d05760405162461bcd60e51b8152600401610689906156e3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612109919060040161572a565b6020604051808303815f875af1158015612125573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214991906152a6565b505050565b5f612157612873565b6121628233346138bf565b905061217a60015f80516020615bd083398151915255565b919050565b612187614fa8565b5f8281525f80516020615bf0833981519152602052604090819020815160e0810190925280545f80516020615bb0833981519152929190829060ff1660058111156121d4576121d46151a8565b60058111156121e5576121e56151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612292573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b991908101906157bf565b915091508061231c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238391906152a6565b8251146123e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f8061246c8460400151613c76565b915091508187146124d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615bf0833981519152602052604081206002015481905f80516020615bb083398151915290600160801b90046001600160401b031661252b8582613e4e565b5f6125358761405c565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125858a858b61263a565b6040518263ffffffff1660e01b81526004016125a191906152df565b6020604051808303815f875af11580156125bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e191906152a6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b35761267381600161569e565b61267e906008615667565b5081515f908390839081106126955761269561542f565b60200101906001600160f81b03191690815f1a90535060010161265f565b505f5b600481101561271e576126ca81600361569e565b6126d5906008615667565b600263ffffffff16901c60f81b828260026126f09190615632565b815181106127005761270061542f565b60200101906001600160f81b03191690815f1a9053506001016126b6565b505f5b60208110156127805761273581601f61569e565b612740906008615667565b86901c60f81b82612752836006615632565b815181106127625761276261542f565b60200101906001600160f81b03191690815f1a905350600101612721565b505f5b60088110156127eb5761279781600761569e565b6127a2906008615667565b6001600160401b038616901c60f81b826127bd836026615632565b815181106127cd576127cd61542f565b60200101906001600160f81b03191690815f1a905350600101612783565b505f5b60088110156128565761280281600761569e565b61280d906008615667565b6001600160401b038516901c60f81b8261282883602e615632565b815181106128385761283861542f565b60200101906001600160f81b03191690815f1a9053506001016127ee565b50949350505050565b6128676140ec565b61287081614137565b50565b5f80516020615bd08339815191528054600119016128a457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b708339815191529061ffff8616108015906128f6575061271061ffff861611155b6129125760405162461bcd60e51b815260040161068990615891565b60028101546001600160401b03908116908516101561298b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129ee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a6082610c6d565b90505f612a6d89836141ab565b90506040518060600160405280612a813390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bd083398151915255565b5f612b30614fa8565b5f80516020615bb08339815191525f612b4885612f25565b90505f80612b59836040015161371e565b915091508015612bbe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bef57612bef6151a8565b6005811115612c0057612c006151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7157612c716151a8565b1480612c8f5750600182516005811115612c8d57612c8d6151a8565b145b612cee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612d0357612d036151a8565b03612d1057506004612d14565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3d57612d3d6151a8565b90816005811115612d5057612d506151a8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8457612d846151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3857612e386151a8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef8575f80fd5b505af1158015612f0a573d5f803e3d5ffd5b505050505050565b611bf86001600160a01b03831682614710565b60408051606080820183525f8083526020830181905292820152905f80516020615bb08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc191908101906157bf565b91509150806130215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130845760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130f75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131235760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156131725761313a81600161569e565b613145906008615667565b61ffff1686828151811061315b5761315b61542f565b016020015160f81c901b9190911790600101613126565b5061ffff8116156131955760405162461bcd60e51b815260040161068990615925565b5f805b60048110156131f0576131ac81600361569e565b6131b7906008615667565b63ffffffff16876131c9836002615632565b815181106131d9576131d961542f565b016020015160f81c901b9190911790600101613198565b5063ffffffff81166004146132175760405162461bcd60e51b815260040161068990615968565b5f805b602081101561326c5761322e81601f61569e565b613239906008615667565b88613245836006615632565b815181106132555761325561542f565b016020015160f81c901b919091179060010161321a565b505f805b60088110156132cb5761328481600761569e565b61328f906008615667565b6001600160401b0316896132a4836026615632565b815181106132b4576132b461542f565b016020015160f81c901b9190911790600101613270565b505f805b600881101561332a576132e381600761569e565b6132ee906008615667565b6001600160401b03168a61330383602e615632565b815181106133135761331361542f565b016020015160f81c901b91909117906001016132cf565b5091989097509095509350505050565b5f815160261461335c5760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156133ab5761337381600161569e565b61337e906008615667565b61ffff168482815181106133945761339461542f565b016020015160f81c901b919091179060010161335f565b5061ffff8116156133ce5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613429576133e581600361569e565b6133f0906008615667565b63ffffffff1685613402836002615632565b815181106134125761341261542f565b016020015160f81c901b91909117906001016133d1565b5063ffffffff81161561344e5760405162461bcd60e51b815260040161068990615968565b5f805b60208110156128565761346581601f61569e565b613470906008615667565b8661347c836006615632565b8151811061348c5761348c61542f565b016020015160f81c901b9190911790600101613451565b6134ab614fa8565b5f8281525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff1660058111156134f8576134f86151a8565b6005811115613509576135096151a8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357b5761357b6151a8565b146135d75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361b5761361b6151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c785826124e3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137415760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156137905761375881600161569e565b613763906008615667565b61ffff168582815181106137795761377961542f565b016020015160f81c901b9190911790600101613744565b5061ffff8116156137b35760405162461bcd60e51b815260040161068990615925565b5f805b600481101561380e576137ca81600361569e565b6137d5906008615667565b63ffffffff16866137e7836002615632565b815181106137f7576137f761542f565b016020015160f81c901b91909117906001016137b6565b5063ffffffff81166003146138355760405162461bcd60e51b815260040161068990615968565b5f805b602081101561388a5761384c81601f61569e565b613857906008615667565b87613863836006615632565b815181106138735761387361542f565b016020015160f81c901b9190911790600101613838565b505f8660268151811061389f5761389f61542f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b70833981519152816138d884610c6d565b90505f6138e48761217f565b90506138ef87612e71565b61394c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b600281516005811115613961576139616151a8565b146139c05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139d1919061567e565b600485015460408401519192506139f3916001600160401b03909116906159af565b6001600160401b0316816001600160401b03161115613a725760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a7e8a846124e3565b915091505f8a83604051602001613aac92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4757613b476151a8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c995760405162461bcd60e51b8152600401610689906158dc565b5f805b6002811015613ce857613cb081600161569e565b613cbb906008615667565b61ffff16858281518110613cd157613cd161542f565b016020015160f81c901b9190911790600101613c9c565b5061ffff811615613d0b5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613d6657613d2281600361569e565b613d2d906008615667565b63ffffffff1686613d3f836002615632565b81518110613d4f57613d4f61542f565b016020015160f81c901b9190911790600101613d0e565b5063ffffffff8116600514613d8d5760405162461bcd60e51b815260040161068990615968565b5f805b6020811015613de257613da481601f61569e565b613daf906008615667565b87613dbb836006615632565b81518110613dcb57613dcb61542f565b016020015160f81c901b9190911790600101613d90565b505f805b6008811015613e4157613dfa81600761569e565b613e05906008615667565b6001600160401b031688613e1a836026615632565b81518110613e2a57613e2a61542f565b016020015160f81c901b9190911790600101613de6565b5090969095509350505050565b5f80516020615bb08339815191525f6001600160401b038084169085161115613e8257613e7b8385615286565b9050613e8f565b613e8c8484615286565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef1575060028401548151613eed916001600160401b031690615632565b8210155b15613f17576001600160401b038316606082015281815260408101516020820152613f36565b8281606001818151613f29919061567e565b6001600160401b03169052505b6060810151613f469060646159af565b602082015160028601546001600160401b039290921691613f719190600160401b900460ff16615667565b1015613fd55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613ff09190615632565b9052506040810180516001600160401b038716919061401090839061569e565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bf08339815191526020526040812060020180545f80516020615bb083398151915291600160401b9091046001600160401b03169060086140a6836159da565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413557604051631afcd79f60e31b815260040160405180910390fd5b565b61413f6140ec565b614148816147a3565b6141506147bc565b612870608082013560a083013561416d60e0850160c0860161518f565b61417e610100860160e087016159f5565b61ffff1661419461012087016101008801615a0e565b6141a6610140880161012089016153cf565b6147cc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bb083398151915242614255604086016020870161518f565b6001600160401b0316116142c75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142d7604085016020860161518f565b6001600160401b03166142ed6202a30042615632565b116143605760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143b85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143e75760405162461bcd60e51b81526004016106899061558a565b60306143f66040860186615a2e565b90501461445b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614465835f613e4e565b5f806144ff6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144aa919061518f565b6001600160401b031681526020016144c560408a018a615a2e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a10565b5f8281526007860160205260409020919350915061451d8282615ab4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061454a9085906004016152df565b6020604051808303815f875af1158015614566573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458a91906152a6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614602576146026151a8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e2918e01908e0161518f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147335760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477c576040519150601f19603f3d011682016040523d82523d5f602084013e614781565b606091505b505090508061214957604051630a12f52160e11b815260040160405180910390fd5b6147ab6140ec565b6147b3614dbf565b61287081614dc7565b6147c46140ec565b614135614f69565b6147d46140ec565b5f80516020615b70833981519152836148405760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148625760405162461bcd60e51b815260040161068990615891565b858711156148ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149375760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a7a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af157614ab181600161569e565b614abc906008615667565b5081515f90839083908110614ad357614ad361542f565b60200101906001600160f81b03191690815f1a905350600101614a9d565b505f5b6004811015614b5957614b0881600361569e565b614b13906008615667565b600160ff919091161c60f81b82614b2b836002615632565b81518110614b3b57614b3b61542f565b60200101906001600160f81b03191690815f1a905350600101614af4565b505f5b6020811015614bb65784518160208110614b7857614b7861542f565b1a60f81b82614b88836006615632565b81518110614b9857614b9861542f565b60200101906001600160f81b03191690815f1a905350600101614b5c565b505f5b6020811015614c165784602001518160208110614bd857614bd861542f565b1a60f81b82614be8836026615632565b81518110614bf857614bf861542f565b60200101906001600160f81b03191690815f1a905350600101614bb9565b505f5b6008811015614c8a57614c2d81600761569e565b614c38906008615667565b60ff1685604001516001600160401b0316901c60f81b82826046614c5c9190615632565b81518110614c6c57614c6c61542f565b60200101906001600160f81b03191690815f1a905350600101614c19565b505f5b6030811015614cf55784608001518181518110614cac57614cac61542f565b01602001516001600160f81b03191682614cc783604e615632565b81518110614cd757614cd761542f565b60200101906001600160f81b03191690815f1a905350600101614c8d565b505f5b6008811015614d6757614d0c81600761569e565b614d17906008615667565b60608601516001600160401b0390811691161c60f81b82614d3983607e615632565b81518110614d4957614d4961542f565b60200101906001600160f81b03191690815f1a905350600101614cf8565b50600281604051614d789190615621565b602060405180830381855afa158015614d93573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db691906152a6565b94909350915050565b6141356140ec565b614dcf6140ec565b80355f80516020615bb083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1b6080840160608501615a0e565b60ff161115614e885760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e996080840160608501615a0e565b60ff1611614f015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f116080830160608401615a0e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f42606083016040840161518f565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b146140ec565b508054614f7d906156b1565b5f825580601f10614f8c575050565b601f0160209004905f5260205f20908101906128709190614fe4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff8575f8155600101614fe5565b5090565b8015158114612870575f80fd5b803563ffffffff8116811461217a575f80fd5b5f805f6060848603121561502e575f80fd5b83359250602084013561504081614ffc565b915061504e60408501615009565b90509250925092565b5f60208284031215615067575f80fd5b5035919050565b5f610140828403121561507f575f80fd5b50919050565b803561ffff8116811461217a575f80fd5b80356001600160401b038116811461217a575f80fd5b5f805f606084860312156150be575f80fd5b83356001600160401b038111156150d3575f80fd5b8401606081870312156150e4575f80fd5b92506150f260208501615085565b915061504e60408501615096565b5f60208284031215615110575f80fd5b610cb082615009565b5f806040838503121561512a575f80fd5b61513383615009565b946020939093013593505050565b5f8060408385031215615152575f80fd5b82356001600160401b03811115615167575f80fd5b830160808186031215615178575f80fd5b915061518660208401615009565b90509250929050565b5f6020828403121561519f575f80fd5b610cb082615096565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151df57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521a60608401826001600160401b03169052565b50608083015161523560808401826001600160401b03169052565b5060a083015161525060a08401826001600160401b03169052565b5060c083015161526b60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526b5761526b615272565b5f602082840312156152b6575f80fd5b5051919050565b5f5b838110156152d75781810151838201526020016152bf565b50505f910152565b602081525f82518060208401526152fd8160408501602087016152bd565b601f01601f19169190910160400192915050565b5f8261532b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612870575f80fd5b5f602082840312156153df575f80fd5b8135610cb0816153bb565b5f808335601e198436030181126153ff575f80fd5b8301803591506001600160401b03821115615418575f80fd5b6020019150600581901b3603821315612633575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615457575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549757615497615461565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c5576154c5615461565b604052919050565b5f6001600160401b038211156154e5576154e5615461565b50601f01601f191660200190565b5f60608236031215615503575f80fd5b61550b615475565b82358152602061551c818501615096565b8183015260408401356001600160401b03811115615538575f80fd5b840136601f820112615548575f80fd5b803561555b615556826154cd565b61549d565b818152368483850101111561556e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e3818460208a016152bd565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156138160288401602088016152bd565b016028019695505050505050565b5f82516154578184602087016152bd565b80820180821115610c7d57610c7d615272565b5f63ffffffff80831681810361565d5761565d615272565b6001019392505050565b8082028115828204841417610c7d57610c7d615272565b6001600160401b0381811683821601908082111561526b5761526b615272565b81810381811115610c7d57610c7d615272565b600181811c908216806156c557607f821691505b60208210810361507f57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461573c816156b1565b806020870152604060018084165f811461575d5760018114615779576157a6565b60ff19851660408a0152604084151560051b8a010195506157a6565b895f5260205f205f5b8581101561579d5781548b8201860152908301908801615782565b8a016040019650505b509398975050505050505050565b805161217a81614ffc565b5f80604083850312156157d0575f80fd5b82516001600160401b03808211156157e6575f80fd5b90840190606082870312156157f9575f80fd5b615801615475565b82518152602080840151615814816153bb565b82820152604084015183811115615829575f80fd5b80850194505087601f85011261583d575f80fd5b8351925061584d615556846154cd565b8381528882858701011115615860575f80fd5b61586f848383018488016152bd565b806040840152508195506158848188016157b4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159d2576159d2615272565b505092915050565b5f6001600160401b0380831681810361565d5761565d615272565b5f60208284031215615a05575f80fd5b610cb082615085565b5f60208284031215615a1e575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a43575f80fd5b8301803591506001600160401b03821115615a5c575f80fd5b602001915036819003821315612633575f80fd5b601f82111561214957805f5260205f20601f840160051c81016020851015615a955750805b601f840160051c820191505b81811015610d50575f8155600101615aa1565b81516001600160401b03811115615acd57615acd615461565b615ae181615adb84546156b1565b84615a70565b602080601f831160018114615b14575f8415615afd5750858301515b5f19600386901b1c1916600185901b178555612f0a565b5f85815260208120601f198616915b82811015615b4257888601518255948401946001909101908401615b23565b5085821015615b5f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d60380380615d6083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c138061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615013565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461504e565b6109d7565b3480156101e4575f80fd5b506102236101f336600461504e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615065565b610b90565b348015610286575f80fd5b5061029a61029536600461504e565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150a3565b610c83565b34801561032a575f80fd5b506101b86103393660046150f7565b610cb7565b348015610349575f80fd5b506101b8610358366004615110565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615138565b610f2c565b3480156103b0575f80fd5b506102236103bf366004615186565b611560565b3480156103cf575f80fd5b5061029a6103de36600461504e565b611579565b3480156103ee575f80fd5b506101b86103fd366004615013565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461504e565b611799565b348015610440575f80fd5b506101b861044f366004615110565b6118ea565b34801561045f575f80fd5b506101b861046e3660046150f7565b611bf3565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461504e565b611dab565b3480156104b7575f80fd5b506101b86104c636600461504e565b612031565b6102236104d936600461504e565b612145565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461504e565b612176565b60405161022d91906151b3565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b67833981519152949193919290829060ff16600481111561059c5761059c61519f565b60048111156105ad576105ad61519f565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61062983612176565b90506002825160048111156106405761064061519f565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b878339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b878339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f9060029060058111156107135761071361519f565b0361076a57861561072b57610728848761223e565b90505b5f83606001518360800151610740919061527d565b905061074c85826124da565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610872919061529d565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b161519f565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff166005811115610a2457610a2461519f565b6005811115610a3557610a3561519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa461519f565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612631565b6040518263ffffffff1660e01b8152600401610b4a91906152d6565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a919061529d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2183612856565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615308565b92915050565b5f610c8c61286a565b610c98848484346128a1565b9050610cb060015f80516020615bc783398151915255565b9392505050565b5f80516020615b678339815191525f80610cd084612b1e565b91509150610cdd82612e68565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d1561519f565b03610d3a575f83815260088501602052604081208054919055610d388282612ea3565b505b610d5081610d4b8460400151611560565b612f09565b5050505050565b5f80516020615b678339815191525f610d6f84612f1c565b90505f80610d8083604001516130f6565b50915091505f610d8f83612176565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615327565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615369565b60015f87815260068701602052604090205460ff166004811115610e3257610e3261519f565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ba78339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611030919061529d565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153c6565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153e1565b91505f90508435602086013560146111416060890160408a016153c6565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153e1565b8363ffffffff168181106111d7576111d7615426565b90506020028101906111e9919061543a565b6111f2906154ea565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615581565b84825f01518360200151846040015160405160200161124794939291906155c9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615618565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d3919061529d565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f61519f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615629565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114699061563c565b90506111a5565b50600584018190555f61148286612f1c565b90505f6114928260400151613331565b9050806002856040516114a59190615618565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e3919061529d565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a5100061565e565b5f61158382612176565b6080015192915050565b5f80516020615b678339815191525f6115a58561349a565b90506115b085612e68565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b031690615675565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c868561223e565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d919061529d565b5f8781526008850160205260408120805490919061178c908490615629565b9091555050505050505050565b5f80516020615b678339815191525f6117b183612176565b90506004815160058111156117c8576117c861519f565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612ea3565b6118f261286a565b5f80516020615b678339815191525f61190a84612f1c565b90505f8061191b83604001516130f6565b50915091505f61192a83612176565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119645761196461519f565b60048111156119755761197561519f565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a595760405162461bcd60e51b815260040161068990615327565b826001600160401b03168160e001516001600160401b03161115611a8f5760405162461bcd60e51b815260040161068990615369565b600381516004811115611aa457611aa461519f565b14611af85760405162461bcd60e51b815260206004820152603160248201525f80516020615b878339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b3990600160a01b900461ffff168461565e565b611b439190615308565b905080886008015f8881526020019081526020015f205f828254611b679190615629565b90915550506020830151611b8490611b7f8385615695565b612ea3565b611b998360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bef60015f80516020615bc783398151915255565b5050565b5f80516020615ba78339815191525f611c0b83612f1c565b90505f80611c1c8360400151613715565b9150915080611c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c98906156a8565b9050118015611cca575060015f83815260088601602052604090205460ff166005811115611cc857611cc861519f565b145b611ce65760405162461bcd60e51b8152600401610689906156da565b5f8281526007850160205260408120611cfe91614f68565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b6783398151915293929190829060ff166004811115611e0c57611e0c61519f565b6004811115611e1d57611e1d61519f565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ea457611ea461519f565b1480611ec25750600381516004811115611ec057611ec061519f565b145b611f165760405162461bcd60e51b815260206004820152603260248201525f80516020615b87833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f248260400151612176565b905080606001516001600160401b03165f03611fa85760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fd5846040015184606001518560800151612631565b6040518263ffffffff1660e01b8152600401611ff191906152d6565b6020604051808303815f875af115801561200d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d50919061529d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ba7833981519152929190612079906156a8565b90501180156120ab575060015f83815260088301602052604090205460ff1660058111156120a9576120a961519f565b145b6120c75760405162461bcd60e51b8152600401610689906156da565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121009190600401615721565b6020604051808303815f875af115801561211c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612140919061529d565b505050565b5f61214e61286a565b6121598233346138b6565b905061217160015f80516020615bc783398151915255565b919050565b61217e614f9f565b5f8281525f80516020615be7833981519152602052604090819020815160e0810190925280545f80516020615ba7833981519152929190829060ff1660058111156121cb576121cb61519f565b60058111156121dc576121dc61519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612289573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b091908101906157b6565b91509150806123135760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237a919061529d565b8251146123de5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b0316156124545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124638460400151613c6d565b915091508187146124d05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615be7833981519152602052604081206002015481905f80516020615ba783398151915290600160801b90046001600160401b03166125228582613e45565b5f61252c87614053565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61257c8a858b612631565b6040518263ffffffff1660e01b815260040161259891906152d6565b6020604051808303815f875af11580156125b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d8919061529d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126aa5761266a816001615695565b61267590600861565e565b5081515f9083908390811061268c5761268c615426565b60200101906001600160f81b03191690815f1a905350600101612656565b505f5b6004811015612715576126c1816003615695565b6126cc90600861565e565b600263ffffffff16901c60f81b828260026126e79190615629565b815181106126f7576126f7615426565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b60208110156127775761272c81601f615695565b61273790600861565e565b86901c60f81b82612749836006615629565b8151811061275957612759615426565b60200101906001600160f81b03191690815f1a905350600101612718565b505f5b60088110156127e25761278e816007615695565b61279990600861565e565b6001600160401b038616901c60f81b826127b4836026615629565b815181106127c4576127c4615426565b60200101906001600160f81b03191690815f1a90535060010161277a565b505f5b600881101561284d576127f9816007615695565b61280490600861565e565b6001600160401b038516901c60f81b8261281f83602e615629565b8151811061282f5761282f615426565b60200101906001600160f81b03191690815f1a9053506001016127e5565b50949350505050565b61285e6140e3565b6128678161412e565b50565b5f80516020615bc783398151915280546001190161289b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b678339815191529061ffff8616108015906128ed575061271061ffff861611155b6129095760405162461bcd60e51b815260040161068990615888565b60028101546001600160401b0390811690851610156129825760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129e55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a5782610c6d565b90505f612a6489836141a2565b90506040518060600160405280612a783390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bc783398151915255565b5f612b27614f9f565b5f80516020615ba78339815191525f612b3f85612f1c565b90505f80612b508360400151613715565b915091508015612bb55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612be657612be661519f565b6005811115612bf757612bf761519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c6857612c6861519f565b1480612c865750600182516005811115612c8457612c8461519f565b145b612ce55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612cfa57612cfa61519f565b03612d0757506004612d0b565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3457612d3461519f565b90816005811115612d4757612d4761519f565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d7b57612d7b61519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e2f57612e2f61519f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612eef575f80fd5b505af1158015612f01573d5f803e3d5ffd5b505050505050565b611bef6001600160a01b03831682614707565b60408051606080820183525f8083526020830181905292820152905f80516020615ba78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f91573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fb891908101906157b6565b91509150806130185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b825482511461307b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130ee5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f835160361461311a5760405162461bcd60e51b8152600401610689906158d3565b5f805b600281101561316957613131816001615695565b61313c90600861565e565b61ffff1686828151811061315257613152615426565b016020015160f81c901b919091179060010161311d565b5061ffff81161561318c5760405162461bcd60e51b81526004016106899061591c565b5f805b60048110156131e7576131a3816003615695565b6131ae90600861565e565b63ffffffff16876131c0836002615629565b815181106131d0576131d0615426565b016020015160f81c901b919091179060010161318f565b5063ffffffff811660041461320e5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156132635761322581601f615695565b61323090600861565e565b8861323c836006615629565b8151811061324c5761324c615426565b016020015160f81c901b9190911790600101613211565b505f805b60088110156132c25761327b816007615695565b61328690600861565e565b6001600160401b03168961329b836026615629565b815181106132ab576132ab615426565b016020015160f81c901b9190911790600101613267565b505f805b6008811015613321576132da816007615695565b6132e590600861565e565b6001600160401b03168a6132fa83602e615629565b8151811061330a5761330a615426565b016020015160f81c901b91909117906001016132c6565b5091989097509095509350505050565b5f81516026146133535760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156133a25761336a816001615695565b61337590600861565e565b61ffff1684828151811061338b5761338b615426565b016020015160f81c901b9190911790600101613356565b5061ffff8116156133c55760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613420576133dc816003615695565b6133e790600861565e565b63ffffffff16856133f9836002615629565b8151811061340957613409615426565b016020015160f81c901b91909117906001016133c8565b5063ffffffff8116156134455760405162461bcd60e51b81526004016106899061595f565b5f805b602081101561284d5761345c81601f615695565b61346790600861565e565b86613473836006615629565b8151811061348357613483615426565b016020015160f81c901b9190911790600101613448565b6134a2614f9f565b5f8281525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff1660058111156134ef576134ef61519f565b60058111156135005761350061519f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135725761357261519f565b146135ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156136125761361261519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136be85826124da565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137385760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156137875761374f816001615695565b61375a90600861565e565b61ffff1685828151811061377057613770615426565b016020015160f81c901b919091179060010161373b565b5061ffff8116156137aa5760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613805576137c1816003615695565b6137cc90600861565e565b63ffffffff16866137de836002615629565b815181106137ee576137ee615426565b016020015160f81c901b91909117906001016137ad565b5063ffffffff811660031461382c5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156138815761384381601f615695565b61384e90600861565e565b8761385a836006615629565b8151811061386a5761386a615426565b016020015160f81c901b919091179060010161382f565b505f8660268151811061389657613896615426565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b67833981519152816138cf84610c6d565b90505f6138db87612176565b90506138e687612e68565b6139435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b6002815160058111156139585761395861519f565b146139b75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139c89190615675565b600485015460408401519192506139ea916001600160401b03909116906159a6565b6001600160401b0316816001600160401b03161115613a695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a758a846124da565b915091505f8a83604051602001613aa392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b3e57613b3e61519f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c905760405162461bcd60e51b8152600401610689906158d3565b5f805b6002811015613cdf57613ca7816001615695565b613cb290600861565e565b61ffff16858281518110613cc857613cc8615426565b016020015160f81c901b9190911790600101613c93565b5061ffff811615613d025760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613d5d57613d19816003615695565b613d2490600861565e565b63ffffffff1686613d36836002615629565b81518110613d4657613d46615426565b016020015160f81c901b9190911790600101613d05565b5063ffffffff8116600514613d845760405162461bcd60e51b81526004016106899061595f565b5f805b6020811015613dd957613d9b81601f615695565b613da690600861565e565b87613db2836006615629565b81518110613dc257613dc2615426565b016020015160f81c901b9190911790600101613d87565b505f805b6008811015613e3857613df1816007615695565b613dfc90600861565e565b6001600160401b031688613e11836026615629565b81518110613e2157613e21615426565b016020015160f81c901b9190911790600101613ddd565b5090969095509350505050565b5f80516020615ba78339815191525f6001600160401b038084169085161115613e7957613e72838561527d565b9050613e86565b613e83848461527d565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ee8575060028401548151613ee4916001600160401b031690615629565b8210155b15613f0e576001600160401b038316606082015281815260408101516020820152613f2d565b8281606001818151613f209190615675565b6001600160401b03169052505b6060810151613f3d9060646159a6565b602082015160028601546001600160401b039290921691613f689190600160401b900460ff1661565e565b1015613fcc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fe79190615629565b9052506040810180516001600160401b0387169190614007908390615695565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615be78339815191526020526040812060020180545f80516020615ba783398151915291600160401b9091046001600160401b031690600861409d836159d1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661412c57604051631afcd79f60e31b815260040160405180910390fd5b565b6141366140e3565b61413f8161479a565b6141476147b3565b612867608082013560a083013561416460e0850160c08601615186565b614175610100860160e087016159ec565b61ffff1661418b61012087016101008801615a05565b61419d610140880161012089016153c6565b6147c3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615ba78339815191524261424c6040860160208701615186565b6001600160401b0316116142be5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142ce6040850160208601615186565b6001600160401b03166142e46202a30042615629565b116143575760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143af5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143de5760405162461bcd60e51b815260040161068990615581565b60306143ed6040860186615a25565b9050146144525760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b61445c835f613e45565b5f806144f66040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a19190615186565b6001600160401b031681526020016144bc60408a018a615a25565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a07565b5f828152600786016020526040902091935091506145148282615aab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145419085906004016152d6565b6020604051808303815f875af115801561455d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614581919061529d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145f9576145f961519f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146d9918e01908e01615186565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561472a5760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614773576040519150601f19603f3d011682016040523d82523d5f602084013e614778565b606091505b505090508061214057604051630a12f52160e11b815260040160405180910390fd5b6147a26140e3565b6147aa614db6565b61286781614dbe565b6147bb6140e3565b61412c614f60565b6147cb6140e3565b5f80516020615b67833981519152836148375760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148595760405162461bcd60e51b815260040161068990615888565b858711156148c15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff161161492e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a715760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ae857614aa8816001615695565b614ab390600861565e565b5081515f90839083908110614aca57614aca615426565b60200101906001600160f81b03191690815f1a905350600101614a94565b505f5b6004811015614b5057614aff816003615695565b614b0a90600861565e565b600160ff919091161c60f81b82614b22836002615629565b81518110614b3257614b32615426565b60200101906001600160f81b03191690815f1a905350600101614aeb565b505f5b6020811015614bad5784518160208110614b6f57614b6f615426565b1a60f81b82614b7f836006615629565b81518110614b8f57614b8f615426565b60200101906001600160f81b03191690815f1a905350600101614b53565b505f5b6020811015614c0d5784602001518160208110614bcf57614bcf615426565b1a60f81b82614bdf836026615629565b81518110614bef57614bef615426565b60200101906001600160f81b03191690815f1a905350600101614bb0565b505f5b6008811015614c8157614c24816007615695565b614c2f90600861565e565b60ff1685604001516001600160401b0316901c60f81b82826046614c539190615629565b81518110614c6357614c63615426565b60200101906001600160f81b03191690815f1a905350600101614c10565b505f5b6030811015614cec5784608001518181518110614ca357614ca3615426565b01602001516001600160f81b03191682614cbe83604e615629565b81518110614cce57614cce615426565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6008811015614d5e57614d03816007615695565b614d0e90600861565e565b60608601516001600160401b0390811691161c60f81b82614d3083607e615629565b81518110614d4057614d40615426565b60200101906001600160f81b03191690815f1a905350600101614cef565b50600281604051614d6f9190615618565b602060405180830381855afa158015614d8a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dad919061529d565b94909350915050565b61412c6140e3565b614dc66140e3565b80355f80516020615ba783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e126080840160608501615a05565b60ff161115614e7f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e906080840160608501615a05565b60ff1611614ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f086080830160608401615a05565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f396060830160408401615186565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b0b6140e3565b508054614f74906156a8565b5f825580601f10614f83575050565b601f0160209004905f5260205f20908101906128679190614fdb565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fef575f8155600101614fdc565b5090565b8015158114612867575f80fd5b803563ffffffff81168114612171575f80fd5b5f805f60608486031215615025575f80fd5b83359250602084013561503781614ff3565b915061504560408501615000565b90509250925092565b5f6020828403121561505e575f80fd5b5035919050565b5f6101408284031215615076575f80fd5b50919050565b803561ffff81168114612171575f80fd5b80356001600160401b0381168114612171575f80fd5b5f805f606084860312156150b5575f80fd5b83356001600160401b038111156150ca575f80fd5b8401606081870312156150db575f80fd5b92506150e96020850161507c565b91506150456040850161508d565b5f60208284031215615107575f80fd5b610cb082615000565b5f8060408385031215615121575f80fd5b61512a83615000565b946020939093013593505050565b5f8060408385031215615149575f80fd5b82356001600160401b0381111561515e575f80fd5b83016080818603121561516f575f80fd5b915061517d60208401615000565b90509250929050565b5f60208284031215615196575f80fd5b610cb08261508d565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151d657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521160608401826001600160401b03169052565b50608083015161522c60808401826001600160401b03169052565b5060a083015161524760a08401826001600160401b03169052565b5060c083015161526260c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526257615262615269565b5f602082840312156152ad575f80fd5b5051919050565b5f5b838110156152ce5781810151838201526020016152b6565b50505f910152565b602081525f82518060208401526152f48160408501602087016152b4565b601f01601f19169190910160400192915050565b5f8261532257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612867575f80fd5b5f602082840312156153d6575f80fd5b8135610cb0816153b2565b5f808335601e198436030181126153f6575f80fd5b8301803591506001600160401b0382111561540f575f80fd5b6020019150600581901b360382131561262a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261544e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561548e5761548e615458565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154bc576154bc615458565b604052919050565b5f6001600160401b038211156154dc576154dc615458565b50601f01601f191660200190565b5f606082360312156154fa575f80fd5b61550261546c565b82358152602061551381850161508d565b8183015260408401356001600160401b0381111561552f575f80fd5b840136601f82011261553f575f80fd5b803561555261554d826154c4565b615494565b8181523684838501011115615565575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155da818460208a016152b4565b80830190508581526001600160401b0360c01b8560c01b166020820152835161560a8160288401602088016152b4565b016028019695505050505050565b5f825161544e8184602087016152b4565b80820180821115610c7d57610c7d615269565b5f63ffffffff80831681810361565457615654615269565b6001019392505050565b8082028115828204841417610c7d57610c7d615269565b6001600160401b0381811683821601908082111561526257615262615269565b81810381811115610c7d57610c7d615269565b600181811c908216806156bc57607f821691505b60208210810361507657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615733816156a8565b806020870152604060018084165f811461575457600181146157705761579d565b60ff19851660408a0152604084151560051b8a0101955061579d565b895f5260205f205f5b858110156157945781548b8201860152908301908801615779565b8a016040019650505b509398975050505050505050565b805161217181614ff3565b5f80604083850312156157c7575f80fd5b82516001600160401b03808211156157dd575f80fd5b90840190606082870312156157f0575f80fd5b6157f861546c565b8251815260208084015161580b816153b2565b82820152604084015183811115615820575f80fd5b80850194505087601f850112615834575f80fd5b8351925061584461554d846154c4565b8381528882858701011115615857575f80fd5b615866848383018488016152b4565b8060408401525081955061587b8188016157ab565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c9576159c9615269565b505092915050565b5f6001600160401b0380831681810361565457615654615269565b5f602082840312156159fc575f80fd5b610cb08261507c565b5f60208284031215615a15575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a3a575f80fd5b8301803591506001600160401b03821115615a53575f80fd5b60200191503681900382131561262a575f80fd5b601f82111561214057805f5260205f20601f840160051c81016020851015615a8c5750805b601f840160051c820191505b81811015610d50575f8155600101615a98565b81516001600160401b03811115615ac457615ac4615458565b615ad881615ad284546156a8565b84615a67565b602080601f831160018114615b0b575f8415615af45750858301515b5f19600386901b1c1916600185901b178555612f01565b5f85815260208120601f198616915b82811015615b3957888601518255948401946001909101908401615b1a565b5085821015615b5657878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 748f854ad..38f7288ae 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -198,7 +198,8 @@ abstract contract PoSValidatorManager is (bytes32 validationID, Validator memory validator) = _completeEndValidation(messageIndex); - // Return now if this was originally a PoA validator that was later migrated to this PoS manager + // Return now if this was originally a PoA validator that was later migrated to this PoS manager, + // or the validator was part of the initial validator set. if (!_isPoSValidator(validationID)) { return; } @@ -380,6 +381,10 @@ abstract contract PoSValidatorManager is }); } + /** + * @notice See {INativeTokenStakingManager-initializeValidatorRegistration}. + * Begins the validator registration process. Locks the provided native asset in the contract as the stake. + */ function initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -484,6 +489,8 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); Delegator memory delegator = $._delegatorStakes[delegationID]; + // Once this function completes, the delegation is completed and we can clear it from state. + delete $._delegatorStakes[delegationID]; // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update @@ -504,19 +511,20 @@ abstract contract PoSValidatorManager is "PoSValidatorManager: delegation not pending added" ); - // Update the delegator status - $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; - uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; uint256 validatorFees = rewards * $._validatorRequirements[validationID].delegationFeeBips / 10000; + + // Allocate the delegation fees to the validator. $._redeemableValidatorRewards[validationID] += validatorFees; + // Reward the remaining tokens to the delegator. _reward(delegator.owner, rewards - validatorFees); + + // Unlock the delegator's stake. _unlock(delegator.owner, weightToValue(delegator.weight)); - delete $._delegatorStakes[delegationID]; emit DelegationEnded(delegationID, validationID, nonce); } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 4b8aadcee..b29225c0a 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -134,7 +134,9 @@ interface IPoSValidatorManager is IValidatorManager { * Note that this function can only be called by the address that registered the delegation. * @param delegationID The ID of the delegation being removed. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. - * If no uptime proof is provided, the validation uptime for the delegation period will be assumed to be 0. + * If the validator has completed its validation period, it has already provided an uptime proof, so {includeUptimeProof} + * will be ignored and can be set to false. If the validator has not completed its validation period and no uptime proof + * is provided, the validation uptime for the delegation period will be assumed to be 0. * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the * uptime proof. */ From daad5250c99799d0f4e64edbe3a20b389f8154ac Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 09:59:55 -0400 Subject: [PATCH 32/36] Check for owner when initializing validator completion --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 5867696ca..316d22a9b 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160a23803806160a283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f558061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152b8565b6103ec565b005b61019e6101ae3660046152f3565b61088f565b6101f16101c13660046152f3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152f3565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461531e565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e61028636600461535c565b610b3d565b61019e610299366004615375565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461539d565b610db2565b6101f16102dc366004615401565b6113e6565b6102316102ef3660046152f3565b6113ff565b61019e6103023660046152b8565b611413565b61020c603081565b61019e61031d3660046152f3565b61161f565b61019e610330366004615375565b611770565b6101f161034336600461541a565b611a79565b61019e61035636600461535c565b611aa5565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152f3565b611c5d565b61019e6103a23660046152f3565b611ee3565b61020c601481565b6103c26103bd3660046152f3565b611ff7565b6040516101fb919061544e565b6102316202a30081565b6101f16103e7366004615515565b6120bf565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ea9833981519152949193919290829060ff1660048111156104545761045461543a565b60048111156104655761046561543a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611ff7565b90506002825160048111156104f8576104f861543a565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ec98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ec98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb61543a565b036106225786156105e3576105e084876120f4565b90505b5f836060015183608001516105f8919061558e565b90506106048582612390565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155ae565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156107695761076961543a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156108dc576108dc61543a565b60058111156108ed576108ed61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c61543a565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124e7565b6040518263ffffffff1660e01b8152600401610a0291906155e7565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155ae565b50505050565b5f610a5864e8d4a5100083615619565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af0848461270e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ea98339815191525f80610b5684612728565b91509150610b6382612a72565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b61543a565b03610bc0575f83815260088501602052604081208054919055610bbe8282612aad565b505b610bd681610bd184604001516113e6565b612b23565b5050505050565b5f80516020615ea98339815191525f610bf584612b46565b90505f80610c068360400151612d20565b50915091505f610c1583611ff7565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615638565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b81526004016105419061567a565b60015f87815260068701602052604090205460ff166004811115610cb857610cb861543a565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ee98339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155ae565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156c3565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156de565b91505f9050843560208601356014610fc76060890160408a016156c3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156de565b8363ffffffff1681811061105d5761105d615723565b905060200281019061106f9190615737565b611078906157e7565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b81526004016105419061587e565b84825f0151836020015184604001516040516020016110cd94939291906158c6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b9190615915565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155ae565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e561543a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611298911686615926565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615939565b905061102b565b50600584018190555f61130886612b46565b90505f6113188260400151612f5b565b90508060028560405161132b9190615915565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155ae565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a5100061595b565b5f61140982611ff7565b6080015192915050565b5f80516020615ea98339815191525f61142b856130cd565b905061143685612a72565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b031690615972565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120f4565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155ae565b5f87815260088501602052604081208054909190611612908490615926565b9091555050505050505050565b5f80516020615ea98339815191525f61163783611ff7565b905060048151600581111561164e5761164e61543a565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612aad565b611778613348565b5f80516020615ea98339815191525f61179084612b46565b90505f806117a18360400151612d20565b50915091505f6117b083611ff7565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea61543a565b60048111156117fb576117fb61543a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118df5760405162461bcd60e51b815260040161054190615638565b826001600160401b03168160e001516001600160401b031611156119155760405162461bcd60e51b81526004016105419061567a565b60038151600481111561192a5761192a61543a565b1461197e5760405162461bcd60e51b815260206004820152603160248201525f80516020615ec98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119bf90600160a01b900461ffff168461595b565b6119c99190615619565b905080886008015f8881526020019081526020015f205f8282546119ed9190615926565b90915550506020830151611a0a90611a058385615992565b612aad565b611a1f8360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a7560015f80516020615f0983398151915255565b5050565b5f611a82613348565b611a8d833384613392565b9050610a5860015f80516020615f0983398151915255565b5f80516020615ee98339815191525f611abd83612b46565b90505f80611ace836040015161374c565b9150915080611b305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b4a906159a5565b9050118015611b7c575060015f83815260088601602052604090205460ff166005811115611b7a57611b7a61543a565b145b611b985760405162461bcd60e51b8152600401610541906159dd565b5f8281526007850160205260408120611bb091615208565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ea983398151915293929190829060ff166004811115611cbe57611cbe61543a565b6004811115611ccf57611ccf61543a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5657611d5661543a565b1480611d745750600381516004811115611d7257611d7261543a565b145b611dc85760405162461bcd60e51b815260206004820152603260248201525f80516020615ec9833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dd68260400151611ff7565b905080606001516001600160401b03165f03611e5a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e878460400151846060015185608001516124e7565b6040518263ffffffff1660e01b8152600401611ea391906155e7565b6020604051808303815f875af1158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155ae565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ee9833981519152929190611f2b906159a5565b9050118015611f5d575060015f83815260088301602052604090205460ff166005811115611f5b57611f5b61543a565b145b611f795760405162461bcd60e51b8152600401610541906159dd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fb29190600401615a24565b6020604051808303815f875af1158015611fce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff291906155ae565b505050565b611fff61523f565b5f8281525f80516020615f29833981519152602052604090819020815160e0810190925280545f80516020615ee9833981519152929190829060ff16600581111561204c5761204c61543a565b600581111561205d5761205d61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120c8613348565b6120d4858585856138ed565b90506120ec60015f80516020615f0983398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561213f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121669190810190615ab9565b91509150806121c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561220c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223091906155ae565b8251146122945760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b03161561230a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123198460400151613b62565b915091508187146123865760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f29833981519152602052604081206002015481905f80516020615ee983398151915290600160801b90046001600160401b03166123d88582613d3a565b5f6123e287613f48565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124328a858b6124e7565b6040518263ffffffff1660e01b815260040161244e91906155e7565b6020604051808303815f875af115801561246a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e91906155ae565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561256057612520816001615992565b61252b90600861595b565b5081515f9083908390811061254257612542615723565b60200101906001600160f81b03191690815f1a90535060010161250c565b505f5b60048110156125cb57612577816003615992565b61258290600861595b565b600263ffffffff16901c60f81b8282600261259d9190615926565b815181106125ad576125ad615723565b60200101906001600160f81b03191690815f1a905350600101612563565b505f5b602081101561262d576125e281601f615992565b6125ed90600861595b565b86901c60f81b826125ff836006615926565b8151811061260f5761260f615723565b60200101906001600160f81b03191690815f1a9053506001016125ce565b505f5b600881101561269857612644816007615992565b61264f90600861595b565b6001600160401b038616901c60f81b8261266a836026615926565b8151811061267a5761267a615723565b60200101906001600160f81b03191690815f1a905350600101612630565b505f5b6008811015612703576126af816007615992565b6126ba90600861595b565b6001600160401b038516901c60f81b826126d583602e615926565b815181106126e5576126e5615723565b60200101906001600160f81b03191690815f1a90535060010161269b565b5090505b9392505050565b612716613fd8565b61271f82614023565b611a758161409a565b5f61273161523f565b5f80516020615ee98339815191525f61274985612b46565b90505f8061275a836040015161374c565b9150915080156127bf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f0576127f061543a565b60058111156128015761280161543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128725761287261543a565b1480612890575060018251600581111561288e5761288e61543a565b145b6128ef5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156129045761290461543a565b0361291157506004612915565b5060055b6020808301515f9081526009880190915260408120558181600581111561293e5761293e61543a565b908160058111156129515761295161543a565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129855761298561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a3957612a3961543a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e8983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b08575f80fd5b505af1158015612b1a573d5f803e3d5ffd5b50505050505050565b5f80516020615e8983398151915254611a75906001600160a01b0316838361413b565b60408051606080820183525f8083526020830181905292820152905f80516020615ee98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bbb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612be29190810190615ab9565b9150915080612c425760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612ca55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d445760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612d9357612d5b816001615992565b612d6690600861595b565b61ffff16868281518110612d7c57612d7c615723565b016020015160f81c901b9190911790600101612d47565b5061ffff811615612db65760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015612e1157612dcd816003615992565b612dd890600861595b565b63ffffffff1687612dea836002615926565b81518110612dfa57612dfa615723565b016020015160f81c901b9190911790600101612db9565b5063ffffffff8116600414612e385760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015612e8d57612e4f81601f615992565b612e5a90600861595b565b88612e66836006615926565b81518110612e7657612e76615723565b016020015160f81c901b9190911790600101612e3b565b505f805b6008811015612eec57612ea5816007615992565b612eb090600861595b565b6001600160401b031689612ec5836026615926565b81518110612ed557612ed5615723565b016020015160f81c901b9190911790600101612e91565b505f805b6008811015612f4b57612f04816007615992565b612f0f90600861595b565b6001600160401b03168a612f2483602e615926565b81518110612f3457612f34615723565b016020015160f81c901b9190911790600101612ef0565b5091989097509095509350505050565b5f8151602614612f7d5760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612fcc57612f94816001615992565b612f9f90600861595b565b61ffff16848281518110612fb557612fb5615723565b016020015160f81c901b9190911790600101612f80565b5061ffff811615612fef5760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561304a57613006816003615992565b61301190600861595b565b63ffffffff1685613023836002615926565b8151811061303357613033615723565b016020015160f81c901b9190911790600101612ff2565b5063ffffffff81161561306f5760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156130c45761308681601f615992565b61309190600861595b565b8661309d836006615926565b815181106130ad576130ad615723565b016020015160f81c901b9190911790600101613072565b50949350505050565b6130d561523f565b5f8281525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156131225761312261543a565b60058111156131335761313361543a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131a5576131a561543a565b146132015760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156132455761324561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f18582612390565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f0983398151915280546001190161337957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f0983398151915255565b5f5f80516020615ea9833981519152816133ae61022c8561419a565b90505f6133ba87611ff7565b90506133c587612a72565b6134225760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b6002815160058111156134375761343761543a565b146134965760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134a79190615972565b600485015460408401519192506134c9916001600160401b0390911690615c5e565b6001600160401b0316816001600160401b031611156135485760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f806135548a84612390565b915091505f8a8360405160200161358292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561361d5761361d61543a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461376f5760405162461bcd60e51b815260040161054190615b8b565b5f805b60028110156137be57613786816001615992565b61379190600861595b565b61ffff168582815181106137a7576137a7615723565b016020015160f81c901b9190911790600101613772565b5061ffff8116156137e15760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561383c576137f8816003615992565b61380390600861595b565b63ffffffff1686613815836002615926565b8151811061382557613825615723565b016020015160f81c901b91909117906001016137e4565b5063ffffffff81166003146138635760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156138b85761387a81601f615992565b61388590600861595b565b87613891836006615926565b815181106138a1576138a1615723565b016020015160f81c901b9190911790600101613866565b505f866026815181106138cd576138cd615723565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ea98339815191529061ffff861610801590613939575061271061ffff861611155b6139555760405162461bcd60e51b815260040161054190615c89565b60028101546001600160401b0390811690851610156139ce5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a985760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aa28461419a565b90505f613aae82610a48565b90505f613abb89836141bd565b90506040518060600160405280613acf3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b855760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015613bd457613b9c816001615992565b613ba790600861595b565b61ffff16858281518110613bbd57613bbd615723565b016020015160f81c901b9190911790600101613b88565b5061ffff811615613bf75760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015613c5257613c0e816003615992565b613c1990600861595b565b63ffffffff1686613c2b836002615926565b81518110613c3b57613c3b615723565b016020015160f81c901b9190911790600101613bfa565b5063ffffffff8116600514613c795760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015613cce57613c9081601f615992565b613c9b90600861595b565b87613ca7836006615926565b81518110613cb757613cb7615723565b016020015160f81c901b9190911790600101613c7c565b505f805b6008811015613d2d57613ce6816007615992565b613cf190600861595b565b6001600160401b031688613d06836026615926565b81518110613d1657613d16615723565b016020015160f81c901b9190911790600101613cd2565b5090969095509350505050565b5f80516020615ee98339815191525f6001600160401b038084169085161115613d6e57613d67838561558e565b9050613d7b565b613d78848461558e565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ddd575060028401548151613dd9916001600160401b031690615926565b8210155b15613e03576001600160401b038316606082015281815260408101516020820152613e22565b8281606001818151613e159190615972565b6001600160401b03169052505b6060810151613e32906064615c5e565b602082015160028601546001600160401b039290921691613e5d9190600160401b900460ff1661595b565b1015613ec15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613edc9190615926565b9052506040810180516001600160401b0387169190613efc908390615992565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f298339815191526020526040812060020180545f80516020615ee983398151915291600160401b9091046001600160401b0316906008613f9283615cd4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402157604051631afcd79f60e31b815260040160405180910390fd5b565b61402b613fd8565b61403481614722565b61403c61473b565b614097608082013560a083013561405960e0850160c08601615401565b61406a610100860160e08701615cef565b61ffff1661408061012087016101008801615d08565b614092610140880161012089016156c3565b61474b565b50565b6140a2613fd8565b5f80516020615e898339815191526001600160a01b03821661411b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ff291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061498f565b5f610a58825f80516020615e89833981519152546001600160a01b0316906149f0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ee9833981519152426142676040860160208701615401565b6001600160401b0316116142d95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142e96040850160208601615401565b6001600160401b03166142ff6202a30042615926565b116143725760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143ca5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143f95760405162461bcd60e51b81526004016105419061587e565b60306144086040860186615d28565b90501461446d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614477835f613d3a565b5f806145116040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144bc9190615401565b6001600160401b031681526020016144d760408a018a615d28565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b52565b5f8281526007860160205260409020919350915061452f8282615dae565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061455c9085906004016155e7565b6020604051808303815f875af1158015614578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459c91906155ae565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156146145761461461543a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146f4918e01908e01615401565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61472a613fd8565b614732614f01565b61409781614f09565b614743613fd8565b6140216150ab565b614753613fd8565b5f80516020615ea9833981519152836147bf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147e15760405162461bcd60e51b815260040161054190615c89565b858711156148495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148b65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149a36001600160a01b038416836150b3565b905080515f141580156149c75750808060200190518101906149c59190615e6d565b155b15611ff257604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a5a91906155ae565b9050614a716001600160a01b0385163330866150c0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ad991906155ae565b9050818111614b3f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b498282615992565b95945050505050565b5f6060826080015151603014614bbc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3357614bf3816001615992565b614bfe90600861595b565b5081515f90839083908110614c1557614c15615723565b60200101906001600160f81b03191690815f1a905350600101614bdf565b505f5b6004811015614c9b57614c4a816003615992565b614c5590600861595b565b600160ff919091161c60f81b82614c6d836002615926565b81518110614c7d57614c7d615723565b60200101906001600160f81b03191690815f1a905350600101614c36565b505f5b6020811015614cf85784518160208110614cba57614cba615723565b1a60f81b82614cca836006615926565b81518110614cda57614cda615723565b60200101906001600160f81b03191690815f1a905350600101614c9e565b505f5b6020811015614d585784602001518160208110614d1a57614d1a615723565b1a60f81b82614d2a836026615926565b81518110614d3a57614d3a615723565b60200101906001600160f81b03191690815f1a905350600101614cfb565b505f5b6008811015614dcc57614d6f816007615992565b614d7a90600861595b565b60ff1685604001516001600160401b0316901c60f81b82826046614d9e9190615926565b81518110614dae57614dae615723565b60200101906001600160f81b03191690815f1a905350600101614d5b565b505f5b6030811015614e375784608001518181518110614dee57614dee615723565b01602001516001600160f81b03191682614e0983604e615926565b81518110614e1957614e19615723565b60200101906001600160f81b03191690815f1a905350600101614dcf565b505f5b6008811015614ea957614e4e816007615992565b614e5990600861595b565b60608601516001600160401b0390811691161c60f81b82614e7b83607e615926565b81518110614e8b57614e8b615723565b60200101906001600160f81b03191690815f1a905350600101614e3a565b50600281604051614eba9190615915565b602060405180830381855afa158015614ed5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ef891906155ae565b94909350915050565b614021613fd8565b614f11613fd8565b80355f80516020615ee983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f5d6080840160608501615d08565b60ff161115614fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fdb6080840160608501615d08565b60ff16116150435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150536080830160608401615d08565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150846060830160408401615401565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61337f613fd8565b606061270783835f6150f9565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614168565b60608147101561511e5760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b031684866040516151399190615915565b5f6040518083038185875af1925050503d805f8114615173576040519150601f19603f3d011682016040523d82523d5f602084013e615178565b606091505b509150915061238686838360608261519857615193826151df565b612707565b81511580156151af57506001600160a01b0384163b155b156151d857604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612707565b8051156151ef5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615214906159a5565b5f825580601f10615223575050565b601f0160209004905f5260205f2090810190614097919061527b565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561528f575f815560010161527c565b5090565b8015158114614097575f80fd5b803563ffffffff811681146152b3575f80fd5b919050565b5f805f606084860312156152ca575f80fd5b8335925060208401356152dc81615293565b91506152ea604085016152a0565b90509250925092565b5f60208284031215615303575f80fd5b5035919050565b6001600160a01b0381168114614097575f80fd5b5f80828403610160811215615331575f80fd5b61014080821215615340575f80fd5b84935083013590506153518161530a565b809150509250929050565b5f6020828403121561536c575f80fd5b612707826152a0565b5f8060408385031215615386575f80fd5b61538f836152a0565b946020939093013593505050565b5f80604083850312156153ae575f80fd5b82356001600160401b038111156153c3575f80fd5b8301608081860312156153d4575f80fd5b91506153e2602084016152a0565b90509250929050565b80356001600160401b03811681146152b3575f80fd5b5f60208284031215615411575f80fd5b612707826153eb565b5f806040838503121561542b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154ac60608401826001600160401b03169052565b5060808301516154c760808401826001600160401b03169052565b5060a08301516154e260a08401826001600160401b03169052565b5060c08301516154fd60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152b3575f80fd5b5f805f8060808587031215615528575f80fd5b84356001600160401b0381111561553d575f80fd5b85016060818803121561554e575f80fd5b935061555c60208601615504565b925061556a604086016153eb565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154fd576154fd61557a565b5f602082840312156155be575f80fd5b5051919050565b5f5b838110156155df5781810151838201526020016155c7565b50505f910152565b602081525f82518060208401526156058160408501602087016155c5565b601f01601f19169190910160400192915050565b5f8261563357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156d3575f80fd5b81356127078161530a565b5f808335601e198436030181126156f3575f80fd5b8301803591506001600160401b0382111561570c575f80fd5b6020019150600581901b36038213156124e0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261574b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561578b5761578b615755565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157b9576157b9615755565b604052919050565b5f6001600160401b038211156157d9576157d9615755565b50601f01601f191660200190565b5f606082360312156157f7575f80fd5b6157ff615769565b8235815260206158108185016153eb565b8183015260408401356001600160401b0381111561582c575f80fd5b840136601f82011261583c575f80fd5b803561584f61584a826157c1565b615791565b8181523684838501011115615862575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158d7818460208a016155c5565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159078160288401602088016155c5565b016028019695505050505050565b5f825161574b8184602087016155c5565b80820180821115610a5857610a5861557a565b5f63ffffffff8083168181036159515761595161557a565b6001019392505050565b8082028115828204841417610a5857610a5861557a565b6001600160401b038181168382160190808211156154fd576154fd61557a565b81810381811115610a5857610a5861557a565b600181811c908216806159b957607f821691505b6020821081036159d757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a36816159a5565b806020870152604060018084165f8114615a575760018114615a7357615aa0565b60ff19851660408a0152604084151560051b8a01019550615aa0565b895f5260205f205f5b85811015615a975781548b8201860152908301908801615a7c565b8a016040019650505b509398975050505050505050565b80516152b381615293565b5f8060408385031215615aca575f80fd5b82516001600160401b0380821115615ae0575f80fd5b9084019060608287031215615af3575f80fd5b615afb615769565b82518152602080840151615b0e8161530a565b82820152604084015183811115615b23575f80fd5b80850194505087601f850112615b37575f80fd5b83519250615b4761584a846157c1565b8381528882858701011115615b5a575f80fd5b615b69848383018488016155c5565b80604084015250819550615b7e818801615aae565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8157615c8161557a565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036159515761595161557a565b5f60208284031215615cff575f80fd5b61270782615504565b5f60208284031215615d18575f80fd5b813560ff81168114612707575f80fd5b5f808335601e19843603018112615d3d575f80fd5b8301803591506001600160401b03821115615d56575f80fd5b6020019150368190038213156124e0575f80fd5b601f821115611ff257805f5260205f20601f840160051c81016020851015615d8f5750805b601f840160051c820191505b81811015610bd6575f8155600101615d9b565b81516001600160401b03811115615dc757615dc7615755565b615ddb81615dd584546159a5565b84615d6a565b602080601f831160018114615e0e575f8415615df75750858301515b5f19600386901b1c1916600185901b178555615e65565b5f85815260208120601f198616915b82811015615e3c57888601518255948401946001909101908401615e1d565b5085821015615e5957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e7d575f80fd5b81516127078161529356fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160da3803806160da83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529e565b6103ec565b005b61019e6101ae3660046152d9565b61088f565b6101f16101c13660046152d9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152d9565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615304565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615342565b610b3d565b61019e61029936600461535b565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615383565b610db2565b6101f16102dc3660046153e7565b6113e6565b6102316102ef3660046152d9565b6113ff565b61019e61030236600461529e565b611413565b61020c603081565b61019e61031d3660046152d9565b611650565b61019e61033036600461535b565b611756565b6101f1610343366004615400565b611a5f565b61019e610356366004615342565b611a8b565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152d9565b611c43565b61019e6103a23660046152d9565b611ec9565b61020c601481565b6103c26103bd3660046152d9565b611fdd565b6040516101fb9190615434565b6102316202a30081565b6101f16103e73660046154fb565b6120a5565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ee1833981519152949193919290829060ff16600481111561045457610454615420565b600481111561046557610465615420565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611fdd565b90506002825160048111156104f8576104f8615420565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615f018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615420565b036106225786156105e3576105e084876120da565b90505b5f836060015183608001516105f89190615574565b90506106048582612376565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a9190615594565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615420565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff1660058111156108dc576108dc615420565b60058111156108ed576108ed615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615420565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124cd565b6040518263ffffffff1660e01b8152600401610a0291906155cd565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190615594565b50505050565b5f610a5864e8d4a51000836155ff565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af084846126f4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee18339815191525f80610b568461270e565b91509150610b6382612a58565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615420565b03610bc0575f83815260088501602052604081208054919055610bbe8282612a93565b505b610bd681610bd184604001516113e6565b612b09565b5050505050565b5f80516020615ee18339815191525f610bf584612b2c565b90505f80610c068360400151612d06565b50915091505f610c1583611fdd565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b81526004016105419061561e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615660565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615420565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f218339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb69190615594565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156a9565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156c4565b91505f9050843560208601356014610fc76060890160408a016156a9565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156c4565b8363ffffffff1681811061105d5761105d615709565b905060200281019061106f919061571d565b611078906157cd565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615864565b84825f0151836020015184604001516040516020016110cd94939291906158ac565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b91906158fb565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111599190615594565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615420565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661590c565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef9061591f565b905061102b565b50600584018190555f61130886612b2c565b90505f6113188260400151612f41565b90508060028560405161132b91906158fb565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113699190615594565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615941565b5f61140982611fdd565b6080015192915050565b5f80516020615ee18339815191525f61142b856130b3565b905061143685612a58565b15610bd6575f8581526005830160205260409020546001600160a01b031633146114725760405162461bcd60e51b815260040161054190615958565b5f85815260058301602052604090205460a08201516114a191600160b01b90046001600160401b0316906159aa565b6001600160401b03168160c001516001600160401b031610156115225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61153386856120da565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158a906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611600573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116249190615594565b5f8781526008850160205260408120805490919061164390849061590c565b9091555050505050505050565b5f80516020615ee18339815191525f61166883611fdd565b905060048151600581111561167f5761167f615420565b146116e95760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b031633146117205760405162461bcd60e51b815260040161054190615958565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612a93565b61175e61332e565b5f80516020615ee18339815191525f61177684612b2c565b90505f806117878360400151612d06565b50915091505f61179683611fdd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d0576117d0615420565b60048111156117e1576117e1615420565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c55760405162461bcd60e51b81526004016105419061561e565b826001600160401b03168160e001516001600160401b031611156118fb5760405162461bcd60e51b815260040161054190615660565b60038151600481111561191057611910615420565b146119645760405162461bcd60e51b815260206004820152603160248201525f80516020615f018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a590600160a01b900461ffff1684615941565b6119af91906155ff565b905080886008015f8881526020019081526020015f205f8282546119d3919061590c565b909155505060208301516119f0906119eb83856159ca565b612a93565b611a058360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5b60015f80516020615f4183398151915255565b5050565b5f611a6861332e565b611a73833384613378565b9050610a5860015f80516020615f4183398151915255565b5f80516020615f218339815191525f611aa383612b2c565b90505f80611ab48360400151613732565b9150915080611b165760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b30906159dd565b9050118015611b62575060015f83815260088601602052604090205460ff166005811115611b6057611b60615420565b145b611b7e5760405162461bcd60e51b815260040161054190615a15565b5f8281526007850160205260408120611b96916151ee565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee183398151915293929190829060ff166004811115611ca457611ca4615420565b6004811115611cb557611cb5615420565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3c57611d3c615420565b1480611d5a5750600381516004811115611d5857611d58615420565b145b611dae5760405162461bcd60e51b815260206004820152603260248201525f80516020615f01833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dbc8260400151611fdd565b905080606001516001600160401b03165f03611e405760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e6d8460400151846060015185608001516124cd565b6040518263ffffffff1660e01b8152600401611e8991906155cd565b6020604051808303815f875af1158015611ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190615594565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f21833981519152929190611f11906159dd565b9050118015611f43575060015f83815260088301602052604090205460ff166005811115611f4157611f41615420565b145b611f5f5760405162461bcd60e51b815260040161054190615a15565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f989190600401615a5c565b6020604051808303815f875af1158015611fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd89190615594565b505050565b611fe5615225565b5f8281525f80516020615f61833981519152602052604090819020815160e0810190925280545f80516020615f21833981519152929190829060ff16600581111561203257612032615420565b600581111561204357612043615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120ae61332e565b6120ba858585856138d3565b90506120d260015f80516020615f4183398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612125573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214c9190810190615af1565b91509150806121af5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122169190615594565b82511461227a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156122f05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806122ff8460400151613b48565b9150915081871461236c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f61833981519152602052604081206002015481905f80516020615f2183398151915290600160801b90046001600160401b03166123be8582613d20565b5f6123c887613f2e565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124188a858b6124cd565b6040518263ffffffff1660e01b815260040161243491906155cd565b6020604051808303815f875af1158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190615594565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612546576125068160016159ca565b612511906008615941565b5081515f9083908390811061252857612528615709565b60200101906001600160f81b03191690815f1a9053506001016124f2565b505f5b60048110156125b15761255d8160036159ca565b612568906008615941565b600263ffffffff16901c60f81b82826002612583919061590c565b8151811061259357612593615709565b60200101906001600160f81b03191690815f1a905350600101612549565b505f5b6020811015612613576125c881601f6159ca565b6125d3906008615941565b86901c60f81b826125e583600661590c565b815181106125f5576125f5615709565b60200101906001600160f81b03191690815f1a9053506001016125b4565b505f5b600881101561267e5761262a8160076159ca565b612635906008615941565b6001600160401b038616901c60f81b8261265083602661590c565b8151811061266057612660615709565b60200101906001600160f81b03191690815f1a905350600101612616565b505f5b60088110156126e9576126958160076159ca565b6126a0906008615941565b6001600160401b038516901c60f81b826126bb83602e61590c565b815181106126cb576126cb615709565b60200101906001600160f81b03191690815f1a905350600101612681565b5090505b9392505050565b6126fc613fbe565b61270582614009565b611a5b81614080565b5f612717615225565b5f80516020615f218339815191525f61272f85612b2c565b90505f806127408360400151613732565b9150915080156127a55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d6576127d6615420565b60058111156127e7576127e7615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285857612858615420565b1480612876575060018251600581111561287457612874615420565b145b6128d55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156128ea576128ea615420565b036128f7575060046128fb565b5060055b6020808301515f9081526009880190915260408120558181600581111561292457612924615420565b9081600581111561293757612937615420565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296b5761296b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a1f57612a1f615420565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aee575f80fd5b505af1158015612b00573d5f803e3d5ffd5b50505050505050565b5f80516020615ec183398151915254611a5b906001600160a01b03168383614121565b60408051606080820183525f8083526020830181905292820152905f80516020615f218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc89190810190615af1565b9150915080612c285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612c8b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612cfe5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d2a5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612d7957612d418160016159ca565b612d4c906008615941565b61ffff16868281518110612d6257612d62615709565b016020015160f81c901b9190911790600101612d2d565b5061ffff811615612d9c5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015612df757612db38160036159ca565b612dbe906008615941565b63ffffffff1687612dd083600261590c565b81518110612de057612de0615709565b016020015160f81c901b9190911790600101612d9f565b5063ffffffff8116600414612e1e5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015612e7357612e3581601f6159ca565b612e40906008615941565b88612e4c83600661590c565b81518110612e5c57612e5c615709565b016020015160f81c901b9190911790600101612e21565b505f805b6008811015612ed257612e8b8160076159ca565b612e96906008615941565b6001600160401b031689612eab83602661590c565b81518110612ebb57612ebb615709565b016020015160f81c901b9190911790600101612e77565b505f805b6008811015612f3157612eea8160076159ca565b612ef5906008615941565b6001600160401b03168a612f0a83602e61590c565b81518110612f1a57612f1a615709565b016020015160f81c901b9190911790600101612ed6565b5091989097509095509350505050565b5f8151602614612f635760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612fb257612f7a8160016159ca565b612f85906008615941565b61ffff16848281518110612f9b57612f9b615709565b016020015160f81c901b9190911790600101612f66565b5061ffff811615612fd55760405162461bcd60e51b815260040161054190615c0c565b5f805b600481101561303057612fec8160036159ca565b612ff7906008615941565b63ffffffff168561300983600261590c565b8151811061301957613019615709565b016020015160f81c901b9190911790600101612fd8565b5063ffffffff8116156130555760405162461bcd60e51b815260040161054190615c4f565b5f805b60208110156130aa5761306c81601f6159ca565b613077906008615941565b8661308383600661590c565b8151811061309357613093615709565b016020015160f81c901b9190911790600101613058565b50949350505050565b6130bb615225565b5f8281525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff16600581111561310857613108615420565b600581111561311957613119615420565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318b5761318b615420565b146131e75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322b5761322b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d78582612376565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4183398151915280546001190161335f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4183398151915255565b5f5f80516020615ee18339815191528161339461022c85614180565b90505f6133a087611fdd565b90506133ab87612a58565b6134085760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561341d5761341d615420565b1461347c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f82826080015161348d91906159aa565b600485015460408401519192506134af916001600160401b0390911690615c96565b6001600160401b0316816001600160401b0316111561352e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061353a8a84612376565b915091505f8a8360405160200161356892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360357613603615420565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137555760405162461bcd60e51b815260040161054190615bc3565b5f805b60028110156137a45761376c8160016159ca565b613777906008615941565b61ffff1685828151811061378d5761378d615709565b016020015160f81c901b9190911790600101613758565b5061ffff8116156137c75760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613822576137de8160036159ca565b6137e9906008615941565b63ffffffff16866137fb83600261590c565b8151811061380b5761380b615709565b016020015160f81c901b91909117906001016137ca565b5063ffffffff81166003146138495760405162461bcd60e51b815260040161054190615c4f565b5f805b602081101561389e5761386081601f6159ca565b61386b906008615941565b8761387783600661590c565b8151811061388757613887615709565b016020015160f81c901b919091179060010161384c565b505f866026815181106138b3576138b3615709565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee18339815191529061ffff86161080159061391f575061271061ffff861611155b61393b5760405162461bcd60e51b815260040161054190615cc1565b60028101546001600160401b0390811690851610156139b45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a175760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a7e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613a8884614180565b90505f613a9482610a48565b90505f613aa189836141a3565b90506040518060600160405280613ab53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6b5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015613bba57613b828160016159ca565b613b8d906008615941565b61ffff16858281518110613ba357613ba3615709565b016020015160f81c901b9190911790600101613b6e565b5061ffff811615613bdd5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613c3857613bf48160036159ca565b613bff906008615941565b63ffffffff1686613c1183600261590c565b81518110613c2157613c21615709565b016020015160f81c901b9190911790600101613be0565b5063ffffffff8116600514613c5f5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015613cb457613c7681601f6159ca565b613c81906008615941565b87613c8d83600661590c565b81518110613c9d57613c9d615709565b016020015160f81c901b9190911790600101613c62565b505f805b6008811015613d1357613ccc8160076159ca565b613cd7906008615941565b6001600160401b031688613cec83602661590c565b81518110613cfc57613cfc615709565b016020015160f81c901b9190911790600101613cb8565b5090969095509350505050565b5f80516020615f218339815191525f6001600160401b038084169085161115613d5457613d4d8385615574565b9050613d61565b613d5e8484615574565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc3575060028401548151613dbf916001600160401b03169061590c565b8210155b15613de9576001600160401b038316606082015281815260408101516020820152613e08565b8281606001818151613dfb91906159aa565b6001600160401b03169052505b6060810151613e18906064615c96565b602082015160028601546001600160401b039290921691613e439190600160401b900460ff16615941565b1015613ea75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ec2919061590c565b9052506040810180516001600160401b0387169190613ee29083906159ca565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f618339815191526020526040812060020180545f80516020615f2183398151915291600160401b9091046001600160401b0316906008613f7883615d0c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400757604051631afcd79f60e31b815260040160405180910390fd5b565b614011613fbe565b61401a81614708565b614022614721565b61407d608082013560a083013561403f60e0850160c086016153e7565b614050610100860160e08701615d27565b61ffff1661406661012087016101008801615d40565b614078610140880161012089016156a9565b614731565b50565b614088613fbe565b5f80516020615ec18339815191526001600160a01b0382166141015760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614975565b5f610a58825f80516020615ec1833981519152546001600160a01b0316906149d6565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615f218339815191524261424d60408601602087016153e7565b6001600160401b0316116142bf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142cf60408501602086016153e7565b6001600160401b03166142e56202a3004261590c565b116143585760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143b05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143df5760405162461bcd60e51b815260040161054190615864565b60306143ee6040860186615d60565b9050146144535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b61445d835f613d20565b5f806144f76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a291906153e7565b6001600160401b031681526020016144bd60408a018a615d60565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b38565b5f828152600786016020526040902091935091506145158282615de6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145429085906004016155cd565b6020604051808303815f875af115801561455e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145829190615594565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fa576145fa615420565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146da918e01908e016153e7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614710613fbe565b614718614ee7565b61407d81614eef565b614729613fbe565b614007615091565b614739613fbe565b5f80516020615ee1833981519152836147a55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147c75760405162461bcd60e51b815260040161054190615cc1565b8587111561482f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff161161489c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff8416111561490e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149896001600160a01b03841683615099565b905080515f141580156149ad5750808060200190518101906149ab9190615ea5565b155b15611fd857604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a409190615594565b9050614a576001600160a01b0385163330866150a6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614abf9190615594565b9050818111614b255760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b2f82826159ca565b95945050505050565b5f6060826080015151603014614ba25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1957614bd98160016159ca565b614be4906008615941565b5081515f90839083908110614bfb57614bfb615709565b60200101906001600160f81b03191690815f1a905350600101614bc5565b505f5b6004811015614c8157614c308160036159ca565b614c3b906008615941565b600160ff919091161c60f81b82614c5383600261590c565b81518110614c6357614c63615709565b60200101906001600160f81b03191690815f1a905350600101614c1c565b505f5b6020811015614cde5784518160208110614ca057614ca0615709565b1a60f81b82614cb083600661590c565b81518110614cc057614cc0615709565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6020811015614d3e5784602001518160208110614d0057614d00615709565b1a60f81b82614d1083602661590c565b81518110614d2057614d20615709565b60200101906001600160f81b03191690815f1a905350600101614ce1565b505f5b6008811015614db257614d558160076159ca565b614d60906008615941565b60ff1685604001516001600160401b0316901c60f81b82826046614d84919061590c565b81518110614d9457614d94615709565b60200101906001600160f81b03191690815f1a905350600101614d41565b505f5b6030811015614e1d5784608001518181518110614dd457614dd4615709565b01602001516001600160f81b03191682614def83604e61590c565b81518110614dff57614dff615709565b60200101906001600160f81b03191690815f1a905350600101614db5565b505f5b6008811015614e8f57614e348160076159ca565b614e3f906008615941565b60608601516001600160401b0390811691161c60f81b82614e6183607e61590c565b81518110614e7157614e71615709565b60200101906001600160f81b03191690815f1a905350600101614e20565b50600281604051614ea091906158fb565b602060405180830381855afa158015614ebb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ede9190615594565b94909350915050565b614007613fbe565b614ef7613fbe565b80355f80516020615f2183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f436080840160608501615d40565b60ff161115614fb05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fc16080840160608501615d40565b60ff16116150295760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150396080830160608401615d40565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506a60608301604084016153e7565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613365613fbe565b60606126ed83835f6150df565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd9060840161414e565b6060814710156151045760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b0316848660405161511f91906158fb565b5f6040518083038185875af1925050503d805f8114615159576040519150601f19603f3d011682016040523d82523d5f602084013e61515e565b606091505b509150915061236c86838360608261517e57615179826151c5565b6126ed565b815115801561519557506001600160a01b0384163b155b156151be57604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b50806126ed565b8051156151d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fa906159dd565b5f825580601f10615209575050565b601f0160209004905f5260205f209081019061407d9190615261565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615275575f8155600101615262565b5090565b801515811461407d575f80fd5b803563ffffffff81168114615299575f80fd5b919050565b5f805f606084860312156152b0575f80fd5b8335925060208401356152c281615279565b91506152d060408501615286565b90509250925092565b5f602082840312156152e9575f80fd5b5035919050565b6001600160a01b038116811461407d575f80fd5b5f80828403610160811215615317575f80fd5b61014080821215615326575f80fd5b8493508301359050615337816152f0565b809150509250929050565b5f60208284031215615352575f80fd5b6126ed82615286565b5f806040838503121561536c575f80fd5b61537583615286565b946020939093013593505050565b5f8060408385031215615394575f80fd5b82356001600160401b038111156153a9575f80fd5b8301608081860312156153ba575f80fd5b91506153c860208401615286565b90509250929050565b80356001600160401b0381168114615299575f80fd5b5f602082840312156153f7575f80fd5b6126ed826153d1565b5f8060408385031215615411575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549260608401826001600160401b03169052565b5060808301516154ad60808401826001600160401b03169052565b5060a08301516154c860a08401826001600160401b03169052565b5060c08301516154e360c08401826001600160401b03169052565b5092915050565b803561ffff81168114615299575f80fd5b5f805f806080858703121561550e575f80fd5b84356001600160401b03811115615523575f80fd5b850160608188031215615534575f80fd5b9350615542602086016154ea565b9250615550604086016153d1565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e3576154e3615560565b5f602082840312156155a4575f80fd5b5051919050565b5f5b838110156155c55781810151838201526020016155ad565b50505f910152565b602081525f82518060208401526155eb8160408501602087016155ab565b601f01601f19169190910160400192915050565b5f8261561957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156b9575f80fd5b81356126ed816152f0565b5f808335601e198436030181126156d9575f80fd5b8301803591506001600160401b038211156156f2575f80fd5b6020019150600581901b36038213156124c6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615731575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157715761577161573b565b60405290565b604051601f8201601f191681016001600160401b038111828210171561579f5761579f61573b565b604052919050565b5f6001600160401b038211156157bf576157bf61573b565b50601f01601f191660200190565b5f606082360312156157dd575f80fd5b6157e561574f565b8235815260206157f68185016153d1565b8183015260408401356001600160401b03811115615812575f80fd5b840136601f820112615822575f80fd5b8035615835615830826157a7565b615777565b8181523684838501011115615848575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158bd818460208a016155ab565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ed8160288401602088016155ab565b016028019695505050505050565b5f82516157318184602087016155ab565b80820180821115610a5857610a58615560565b5f63ffffffff80831681810361593757615937615560565b6001019392505050565b8082028115828204841417610a5857610a58615560565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e3576154e3615560565b81810381811115610a5857610a58615560565b600181811c908216806159f157607f821691505b602082108103615a0f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6e816159dd565b806020870152604060018084165f8114615a8f5760018114615aab57615ad8565b60ff19851660408a0152604084151560051b8a01019550615ad8565b895f5260205f205f5b85811015615acf5781548b8201860152908301908801615ab4565b8a016040019650505b509398975050505050505050565b805161529981615279565b5f8060408385031215615b02575f80fd5b82516001600160401b0380821115615b18575f80fd5b9084019060608287031215615b2b575f80fd5b615b3361574f565b82518152602080840151615b46816152f0565b82820152604084015183811115615b5b575f80fd5b80850194505087601f850112615b6f575f80fd5b83519250615b7f615830846157a7565b8381528882858701011115615b92575f80fd5b615ba1848383018488016155ab565b80604084015250819550615bb6818801615ae6565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cb957615cb9615560565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593757615937615560565b5f60208284031215615d37575f80fd5b6126ed826154ea565b5f60208284031215615d50575f80fd5b813560ff811681146126ed575f80fd5b5f808335601e19843603018112615d75575f80fd5b8301803591506001600160401b03821115615d8e575f80fd5b6020019150368190038213156124c6575f80fd5b601f821115611fd857805f5260205f20601f840160051c81016020851015615dc75750805b601f840160051c820191505b81811015610bd6575f8155600101615dd3565b81516001600160401b03811115615dff57615dff61573b565b615e1381615e0d84546159dd565b84615da2565b602080601f831160018114615e46575f8415615e2f5750858301515b5f19600386901b1c1916600185901b178555615e9d565b5f85815260208120601f198616915b82811015615e7457888601518255948401946001909101908401615e55565b5085821015615e9157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb5575f80fd5b81516126ed8161527956fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 1a312f622..de6df87d5 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d60380380615d6083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c138061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615013565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461504e565b6109d7565b3480156101e4575f80fd5b506102236101f336600461504e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615065565b610b90565b348015610286575f80fd5b5061029a61029536600461504e565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150a3565b610c83565b34801561032a575f80fd5b506101b86103393660046150f7565b610cb7565b348015610349575f80fd5b506101b8610358366004615110565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615138565b610f2c565b3480156103b0575f80fd5b506102236103bf366004615186565b611560565b3480156103cf575f80fd5b5061029a6103de36600461504e565b611579565b3480156103ee575f80fd5b506101b86103fd366004615013565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461504e565b611799565b348015610440575f80fd5b506101b861044f366004615110565b6118ea565b34801561045f575f80fd5b506101b861046e3660046150f7565b611bf3565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461504e565b611dab565b3480156104b7575f80fd5b506101b86104c636600461504e565b612031565b6102236104d936600461504e565b612145565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461504e565b612176565b60405161022d91906151b3565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b67833981519152949193919290829060ff16600481111561059c5761059c61519f565b60048111156105ad576105ad61519f565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61062983612176565b90506002825160048111156106405761064061519f565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b878339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b878339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f9060029060058111156107135761071361519f565b0361076a57861561072b57610728848761223e565b90505b5f83606001518360800151610740919061527d565b905061074c85826124da565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610872919061529d565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b161519f565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff166005811115610a2457610a2461519f565b6005811115610a3557610a3561519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa461519f565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612631565b6040518263ffffffff1660e01b8152600401610b4a91906152d6565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a919061529d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2183612856565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615308565b92915050565b5f610c8c61286a565b610c98848484346128a1565b9050610cb060015f80516020615bc783398151915255565b9392505050565b5f80516020615b678339815191525f80610cd084612b1e565b91509150610cdd82612e68565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d1561519f565b03610d3a575f83815260088501602052604081208054919055610d388282612ea3565b505b610d5081610d4b8460400151611560565b612f09565b5050505050565b5f80516020615b678339815191525f610d6f84612f1c565b90505f80610d8083604001516130f6565b50915091505f610d8f83612176565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615327565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615369565b60015f87815260068701602052604090205460ff166004811115610e3257610e3261519f565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ba78339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611030919061529d565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153c6565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153e1565b91505f90508435602086013560146111416060890160408a016153c6565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153e1565b8363ffffffff168181106111d7576111d7615426565b90506020028101906111e9919061543a565b6111f2906154ea565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615581565b84825f01518360200151846040015160405160200161124794939291906155c9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615618565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d3919061529d565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f61519f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615629565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114699061563c565b90506111a5565b50600584018190555f61148286612f1c565b90505f6114928260400151613331565b9050806002856040516114a59190615618565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e3919061529d565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a5100061565e565b5f61158382612176565b6080015192915050565b5f80516020615b678339815191525f6115a58561349a565b90506115b085612e68565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b031690615675565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c868561223e565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d919061529d565b5f8781526008850160205260408120805490919061178c908490615629565b9091555050505050505050565b5f80516020615b678339815191525f6117b183612176565b90506004815160058111156117c8576117c861519f565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612ea3565b6118f261286a565b5f80516020615b678339815191525f61190a84612f1c565b90505f8061191b83604001516130f6565b50915091505f61192a83612176565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119645761196461519f565b60048111156119755761197561519f565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a595760405162461bcd60e51b815260040161068990615327565b826001600160401b03168160e001516001600160401b03161115611a8f5760405162461bcd60e51b815260040161068990615369565b600381516004811115611aa457611aa461519f565b14611af85760405162461bcd60e51b815260206004820152603160248201525f80516020615b878339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b3990600160a01b900461ffff168461565e565b611b439190615308565b905080886008015f8881526020019081526020015f205f828254611b679190615629565b90915550506020830151611b8490611b7f8385615695565b612ea3565b611b998360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bef60015f80516020615bc783398151915255565b5050565b5f80516020615ba78339815191525f611c0b83612f1c565b90505f80611c1c8360400151613715565b9150915080611c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c98906156a8565b9050118015611cca575060015f83815260088601602052604090205460ff166005811115611cc857611cc861519f565b145b611ce65760405162461bcd60e51b8152600401610689906156da565b5f8281526007850160205260408120611cfe91614f68565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b6783398151915293929190829060ff166004811115611e0c57611e0c61519f565b6004811115611e1d57611e1d61519f565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ea457611ea461519f565b1480611ec25750600381516004811115611ec057611ec061519f565b145b611f165760405162461bcd60e51b815260206004820152603260248201525f80516020615b87833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f248260400151612176565b905080606001516001600160401b03165f03611fa85760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fd5846040015184606001518560800151612631565b6040518263ffffffff1660e01b8152600401611ff191906152d6565b6020604051808303815f875af115801561200d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d50919061529d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ba7833981519152929190612079906156a8565b90501180156120ab575060015f83815260088301602052604090205460ff1660058111156120a9576120a961519f565b145b6120c75760405162461bcd60e51b8152600401610689906156da565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121009190600401615721565b6020604051808303815f875af115801561211c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612140919061529d565b505050565b5f61214e61286a565b6121598233346138b6565b905061217160015f80516020615bc783398151915255565b919050565b61217e614f9f565b5f8281525f80516020615be7833981519152602052604090819020815160e0810190925280545f80516020615ba7833981519152929190829060ff1660058111156121cb576121cb61519f565b60058111156121dc576121dc61519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612289573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b091908101906157b6565b91509150806123135760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237a919061529d565b8251146123de5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b0316156124545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124638460400151613c6d565b915091508187146124d05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615be7833981519152602052604081206002015481905f80516020615ba783398151915290600160801b90046001600160401b03166125228582613e45565b5f61252c87614053565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61257c8a858b612631565b6040518263ffffffff1660e01b815260040161259891906152d6565b6020604051808303815f875af11580156125b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d8919061529d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126aa5761266a816001615695565b61267590600861565e565b5081515f9083908390811061268c5761268c615426565b60200101906001600160f81b03191690815f1a905350600101612656565b505f5b6004811015612715576126c1816003615695565b6126cc90600861565e565b600263ffffffff16901c60f81b828260026126e79190615629565b815181106126f7576126f7615426565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b60208110156127775761272c81601f615695565b61273790600861565e565b86901c60f81b82612749836006615629565b8151811061275957612759615426565b60200101906001600160f81b03191690815f1a905350600101612718565b505f5b60088110156127e25761278e816007615695565b61279990600861565e565b6001600160401b038616901c60f81b826127b4836026615629565b815181106127c4576127c4615426565b60200101906001600160f81b03191690815f1a90535060010161277a565b505f5b600881101561284d576127f9816007615695565b61280490600861565e565b6001600160401b038516901c60f81b8261281f83602e615629565b8151811061282f5761282f615426565b60200101906001600160f81b03191690815f1a9053506001016127e5565b50949350505050565b61285e6140e3565b6128678161412e565b50565b5f80516020615bc783398151915280546001190161289b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b678339815191529061ffff8616108015906128ed575061271061ffff861611155b6129095760405162461bcd60e51b815260040161068990615888565b60028101546001600160401b0390811690851610156129825760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129e55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a5782610c6d565b90505f612a6489836141a2565b90506040518060600160405280612a783390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bc783398151915255565b5f612b27614f9f565b5f80516020615ba78339815191525f612b3f85612f1c565b90505f80612b508360400151613715565b915091508015612bb55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612be657612be661519f565b6005811115612bf757612bf761519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c6857612c6861519f565b1480612c865750600182516005811115612c8457612c8461519f565b145b612ce55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612cfa57612cfa61519f565b03612d0757506004612d0b565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3457612d3461519f565b90816005811115612d4757612d4761519f565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d7b57612d7b61519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e2f57612e2f61519f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612eef575f80fd5b505af1158015612f01573d5f803e3d5ffd5b505050505050565b611bef6001600160a01b03831682614707565b60408051606080820183525f8083526020830181905292820152905f80516020615ba78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f91573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fb891908101906157b6565b91509150806130185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b825482511461307b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130ee5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f835160361461311a5760405162461bcd60e51b8152600401610689906158d3565b5f805b600281101561316957613131816001615695565b61313c90600861565e565b61ffff1686828151811061315257613152615426565b016020015160f81c901b919091179060010161311d565b5061ffff81161561318c5760405162461bcd60e51b81526004016106899061591c565b5f805b60048110156131e7576131a3816003615695565b6131ae90600861565e565b63ffffffff16876131c0836002615629565b815181106131d0576131d0615426565b016020015160f81c901b919091179060010161318f565b5063ffffffff811660041461320e5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156132635761322581601f615695565b61323090600861565e565b8861323c836006615629565b8151811061324c5761324c615426565b016020015160f81c901b9190911790600101613211565b505f805b60088110156132c25761327b816007615695565b61328690600861565e565b6001600160401b03168961329b836026615629565b815181106132ab576132ab615426565b016020015160f81c901b9190911790600101613267565b505f805b6008811015613321576132da816007615695565b6132e590600861565e565b6001600160401b03168a6132fa83602e615629565b8151811061330a5761330a615426565b016020015160f81c901b91909117906001016132c6565b5091989097509095509350505050565b5f81516026146133535760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156133a25761336a816001615695565b61337590600861565e565b61ffff1684828151811061338b5761338b615426565b016020015160f81c901b9190911790600101613356565b5061ffff8116156133c55760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613420576133dc816003615695565b6133e790600861565e565b63ffffffff16856133f9836002615629565b8151811061340957613409615426565b016020015160f81c901b91909117906001016133c8565b5063ffffffff8116156134455760405162461bcd60e51b81526004016106899061595f565b5f805b602081101561284d5761345c81601f615695565b61346790600861565e565b86613473836006615629565b8151811061348357613483615426565b016020015160f81c901b9190911790600101613448565b6134a2614f9f565b5f8281525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff1660058111156134ef576134ef61519f565b60058111156135005761350061519f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135725761357261519f565b146135ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156136125761361261519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136be85826124da565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137385760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156137875761374f816001615695565b61375a90600861565e565b61ffff1685828151811061377057613770615426565b016020015160f81c901b919091179060010161373b565b5061ffff8116156137aa5760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613805576137c1816003615695565b6137cc90600861565e565b63ffffffff16866137de836002615629565b815181106137ee576137ee615426565b016020015160f81c901b91909117906001016137ad565b5063ffffffff811660031461382c5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156138815761384381601f615695565b61384e90600861565e565b8761385a836006615629565b8151811061386a5761386a615426565b016020015160f81c901b919091179060010161382f565b505f8660268151811061389657613896615426565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b67833981519152816138cf84610c6d565b90505f6138db87612176565b90506138e687612e68565b6139435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b6002815160058111156139585761395861519f565b146139b75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139c89190615675565b600485015460408401519192506139ea916001600160401b03909116906159a6565b6001600160401b0316816001600160401b03161115613a695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a758a846124da565b915091505f8a83604051602001613aa392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b3e57613b3e61519f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c905760405162461bcd60e51b8152600401610689906158d3565b5f805b6002811015613cdf57613ca7816001615695565b613cb290600861565e565b61ffff16858281518110613cc857613cc8615426565b016020015160f81c901b9190911790600101613c93565b5061ffff811615613d025760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613d5d57613d19816003615695565b613d2490600861565e565b63ffffffff1686613d36836002615629565b81518110613d4657613d46615426565b016020015160f81c901b9190911790600101613d05565b5063ffffffff8116600514613d845760405162461bcd60e51b81526004016106899061595f565b5f805b6020811015613dd957613d9b81601f615695565b613da690600861565e565b87613db2836006615629565b81518110613dc257613dc2615426565b016020015160f81c901b9190911790600101613d87565b505f805b6008811015613e3857613df1816007615695565b613dfc90600861565e565b6001600160401b031688613e11836026615629565b81518110613e2157613e21615426565b016020015160f81c901b9190911790600101613ddd565b5090969095509350505050565b5f80516020615ba78339815191525f6001600160401b038084169085161115613e7957613e72838561527d565b9050613e86565b613e83848461527d565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ee8575060028401548151613ee4916001600160401b031690615629565b8210155b15613f0e576001600160401b038316606082015281815260408101516020820152613f2d565b8281606001818151613f209190615675565b6001600160401b03169052505b6060810151613f3d9060646159a6565b602082015160028601546001600160401b039290921691613f689190600160401b900460ff1661565e565b1015613fcc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fe79190615629565b9052506040810180516001600160401b0387169190614007908390615695565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615be78339815191526020526040812060020180545f80516020615ba783398151915291600160401b9091046001600160401b031690600861409d836159d1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661412c57604051631afcd79f60e31b815260040160405180910390fd5b565b6141366140e3565b61413f8161479a565b6141476147b3565b612867608082013560a083013561416460e0850160c08601615186565b614175610100860160e087016159ec565b61ffff1661418b61012087016101008801615a05565b61419d610140880161012089016153c6565b6147c3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615ba78339815191524261424c6040860160208701615186565b6001600160401b0316116142be5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142ce6040850160208601615186565b6001600160401b03166142e46202a30042615629565b116143575760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143af5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143de5760405162461bcd60e51b815260040161068990615581565b60306143ed6040860186615a25565b9050146144525760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b61445c835f613e45565b5f806144f66040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a19190615186565b6001600160401b031681526020016144bc60408a018a615a25565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a07565b5f828152600786016020526040902091935091506145148282615aab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145419085906004016152d6565b6020604051808303815f875af115801561455d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614581919061529d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145f9576145f961519f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146d9918e01908e01615186565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561472a5760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614773576040519150601f19603f3d011682016040523d82523d5f602084013e614778565b606091505b505090508061214057604051630a12f52160e11b815260040160405180910390fd5b6147a26140e3565b6147aa614db6565b61286781614dbe565b6147bb6140e3565b61412c614f60565b6147cb6140e3565b5f80516020615b67833981519152836148375760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148595760405162461bcd60e51b815260040161068990615888565b858711156148c15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff161161492e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a715760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ae857614aa8816001615695565b614ab390600861565e565b5081515f90839083908110614aca57614aca615426565b60200101906001600160f81b03191690815f1a905350600101614a94565b505f5b6004811015614b5057614aff816003615695565b614b0a90600861565e565b600160ff919091161c60f81b82614b22836002615629565b81518110614b3257614b32615426565b60200101906001600160f81b03191690815f1a905350600101614aeb565b505f5b6020811015614bad5784518160208110614b6f57614b6f615426565b1a60f81b82614b7f836006615629565b81518110614b8f57614b8f615426565b60200101906001600160f81b03191690815f1a905350600101614b53565b505f5b6020811015614c0d5784602001518160208110614bcf57614bcf615426565b1a60f81b82614bdf836026615629565b81518110614bef57614bef615426565b60200101906001600160f81b03191690815f1a905350600101614bb0565b505f5b6008811015614c8157614c24816007615695565b614c2f90600861565e565b60ff1685604001516001600160401b0316901c60f81b82826046614c539190615629565b81518110614c6357614c63615426565b60200101906001600160f81b03191690815f1a905350600101614c10565b505f5b6030811015614cec5784608001518181518110614ca357614ca3615426565b01602001516001600160f81b03191682614cbe83604e615629565b81518110614cce57614cce615426565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6008811015614d5e57614d03816007615695565b614d0e90600861565e565b60608601516001600160401b0390811691161c60f81b82614d3083607e615629565b81518110614d4057614d40615426565b60200101906001600160f81b03191690815f1a905350600101614cef565b50600281604051614d6f9190615618565b602060405180830381855afa158015614d8a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dad919061529d565b94909350915050565b61412c6140e3565b614dc66140e3565b80355f80516020615ba783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e126080840160608501615a05565b60ff161115614e7f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e906080840160608501615a05565b60ff1611614ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f086080830160608401615a05565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f396060830160408401615186565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b0b6140e3565b508054614f74906156a8565b5f825580601f10614f83575050565b601f0160209004905f5260205f20908101906128679190614fdb565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fef575f8155600101614fdc565b5090565b8015158114612867575f80fd5b803563ffffffff81168114612171575f80fd5b5f805f60608486031215615025575f80fd5b83359250602084013561503781614ff3565b915061504560408501615000565b90509250925092565b5f6020828403121561505e575f80fd5b5035919050565b5f6101408284031215615076575f80fd5b50919050565b803561ffff81168114612171575f80fd5b80356001600160401b0381168114612171575f80fd5b5f805f606084860312156150b5575f80fd5b83356001600160401b038111156150ca575f80fd5b8401606081870312156150db575f80fd5b92506150e96020850161507c565b91506150456040850161508d565b5f60208284031215615107575f80fd5b610cb082615000565b5f8060408385031215615121575f80fd5b61512a83615000565b946020939093013593505050565b5f8060408385031215615149575f80fd5b82356001600160401b0381111561515e575f80fd5b83016080818603121561516f575f80fd5b915061517d60208401615000565b90509250929050565b5f60208284031215615196575f80fd5b610cb08261508d565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151d657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521160608401826001600160401b03169052565b50608083015161522c60808401826001600160401b03169052565b5060a083015161524760a08401826001600160401b03169052565b5060c083015161526260c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526257615262615269565b5f602082840312156152ad575f80fd5b5051919050565b5f5b838110156152ce5781810151838201526020016152b6565b50505f910152565b602081525f82518060208401526152f48160408501602087016152b4565b601f01601f19169190910160400192915050565b5f8261532257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612867575f80fd5b5f602082840312156153d6575f80fd5b8135610cb0816153b2565b5f808335601e198436030181126153f6575f80fd5b8301803591506001600160401b0382111561540f575f80fd5b6020019150600581901b360382131561262a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261544e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561548e5761548e615458565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154bc576154bc615458565b604052919050565b5f6001600160401b038211156154dc576154dc615458565b50601f01601f191660200190565b5f606082360312156154fa575f80fd5b61550261546c565b82358152602061551381850161508d565b8183015260408401356001600160401b0381111561552f575f80fd5b840136601f82011261553f575f80fd5b803561555261554d826154c4565b615494565b8181523684838501011115615565575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155da818460208a016152b4565b80830190508581526001600160401b0360c01b8560c01b166020820152835161560a8160288401602088016152b4565b016028019695505050505050565b5f825161544e8184602087016152b4565b80820180821115610c7d57610c7d615269565b5f63ffffffff80831681810361565457615654615269565b6001019392505050565b8082028115828204841417610c7d57610c7d615269565b6001600160401b0381811683821601908082111561526257615262615269565b81810381811115610c7d57610c7d615269565b600181811c908216806156bc57607f821691505b60208210810361507657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615733816156a8565b806020870152604060018084165f811461575457600181146157705761579d565b60ff19851660408a0152604084151560051b8a0101955061579d565b895f5260205f205f5b858110156157945781548b8201860152908301908801615779565b8a016040019650505b509398975050505050505050565b805161217181614ff3565b5f80604083850312156157c7575f80fd5b82516001600160401b03808211156157dd575f80fd5b90840190606082870312156157f0575f80fd5b6157f861546c565b8251815260208084015161580b816153b2565b82820152604084015183811115615820575f80fd5b80850194505087601f850112615834575f80fd5b8351925061584461554d846154c4565b8381528882858701011115615857575f80fd5b615866848383018488016152b4565b8060408401525081955061587b8188016157ab565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c9576159c9615269565b505092915050565b5f6001600160401b0380831681810361565457615654615269565b5f602082840312156159fc575f80fd5b610cb08261507c565b5f60208284031215615a15575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a3a575f80fd5b8301803591506001600160401b03821115615a53575f80fd5b60200191503681900382131561262a575f80fd5b601f82111561214057805f5260205f20601f840160051c81016020851015615a8c5750805b601f840160051c820191505b81811015610d50575f8155600101615a98565b81516001600160401b03811115615ac457615ac4615458565b615ad881615ad284546156a8565b84615a67565b602080601f831160018114615b0b575f8415615af45750858301515b5f19600386901b1c1916600185901b178555612f01565b5f85815260208120601f198616915b82811015615b3957888601518255948401946001909101908401615b1a565b5085821015615b5657878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d98380380615d9883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4b8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ff9565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615034565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615034565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504b565b610b90565b348015610286575f80fd5b5061029a610295366004615034565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615089565b610c83565b34801561032a575f80fd5b506101b86103393660046150dd565b610cb7565b348015610349575f80fd5b506101b86103583660046150f6565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511e565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461516c565b611560565b3480156103cf575f80fd5b5061029a6103de366004615034565b611579565b3480156103ee575f80fd5b506101b86103fd366004614ff9565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615034565b6117ca565b348015610440575f80fd5b506101b861044f3660046150f6565b6118d0565b34801561045f575f80fd5b506101b861046e3660046150dd565b611bd9565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615034565b611d91565b3480156104b7575f80fd5b506101b86104c6366004615034565b612017565b6102236104d9366004615034565b61212b565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615034565b61215c565b60405161022d9190615199565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b9f833981519152949193919290829060ff16600481111561059c5761059c615185565b60048111156105ad576105ad615185565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361215c565b905060028251600481111561064057610640615185565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615bbf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615bbf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f90600290600581111561071357610713615185565b0361076a57861561072b576107288487612224565b90505b5f836060015183608001516107409190615263565b905061074c85826124c0565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108729190615283565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b1615185565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff166005811115610a2457610a24615185565b6005811115610a3557610a35615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa4615185565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612617565b6040518263ffffffff1660e01b8152600401610b4a91906152bc565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a9190615283565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361283c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a51000836152ee565b92915050565b5f610c8c612850565b610c9884848434612887565b9050610cb060015f80516020615bff83398151915255565b9392505050565b5f80516020615b9f8339815191525f80610cd084612b04565b91509150610cdd82612e4e565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d15615185565b03610d3a575f83815260088501602052604081208054919055610d388282612e89565b505b610d5081610d4b8460400151611560565b612eef565b5050505050565b5f80516020615b9f8339815191525f610d6f84612f02565b90505f80610d8083604001516130dc565b50915091505f610d8f8361215c565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b81526004016106899061530d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b81526004016106899061534f565b60015f87815260068701602052604090205460ff166004811115610e3257610e32615185565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bdf8339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110309190615283565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153ac565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153c7565b91505f90508435602086013560146111416060890160408a016153ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153c7565b8363ffffffff168181106111d7576111d761540c565b90506020028101906111e99190615420565b6111f2906154d0565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615567565b84825f01518360200151846040015160405160200161124794939291906155af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129591906155fe565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d39190615283565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f615185565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161141291168661560f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615622565b90506111a5565b50600584018190555f61148286612f02565b90505f6114928260400151613317565b9050806002856040516114a591906155fe565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e39190615283565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615644565b5f6115838261215c565b6080015192915050565b5f80516020615b9f8339815191525f6115a585613480565b90506115b085612e4e565b15610d50575f8581526005830160205260409020546001600160a01b031633146115ec5760405162461bcd60e51b81526004016106899061565b565b5f85815260058301602052604090205460a082015161161b91600160b01b90046001600160401b0316906156ad565b6001600160401b03168160c001516001600160401b0316101561169c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f6116ad8685612224565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170490611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179e9190615283565b5f878152600885016020526040812080549091906117bd90849061560f565b9091555050505050505050565b5f80516020615b9f8339815191525f6117e28361215c565b90506004815160058111156117f9576117f9615185565b146118635760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b0316331461189a5760405162461bcd60e51b81526004016106899061565b565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612e89565b6118d8612850565b5f80516020615b9f8339815191525f6118f084612f02565b90505f8061190183604001516130dc565b50915091505f6119108361215c565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194a5761194a615185565b600481111561195b5761195b615185565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a3f5760405162461bcd60e51b81526004016106899061530d565b826001600160401b03168160e001516001600160401b03161115611a755760405162461bcd60e51b81526004016106899061534f565b600381516004811115611a8a57611a8a615185565b14611ade5760405162461bcd60e51b815260206004820152603160248201525f80516020615bbf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b1f90600160a01b900461ffff1684615644565b611b2991906152ee565b905080886008015f8881526020019081526020015f205f828254611b4d919061560f565b90915550506020830151611b6a90611b6583856156cd565b612e89565b611b7f8360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd560015f80516020615bff83398151915255565b5050565b5f80516020615bdf8339815191525f611bf183612f02565b90505f80611c0283604001516136fb565b9150915080611c645760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c7e906156e0565b9050118015611cb0575060015f83815260088601602052604090205460ff166005811115611cae57611cae615185565b145b611ccc5760405162461bcd60e51b815260040161068990615712565b5f8281526007850160205260408120611ce491614f4e565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b9f83398151915293929190829060ff166004811115611df257611df2615185565b6004811115611e0357611e03615185565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8a57611e8a615185565b1480611ea85750600381516004811115611ea657611ea6615185565b145b611efc5760405162461bcd60e51b815260206004820152603260248201525f80516020615bbf833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f0a826040015161215c565b905080606001516001600160401b03165f03611f8e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fbb846040015184606001518560800151612617565b6040518263ffffffff1660e01b8152600401611fd791906152bc565b6020604051808303815f875af1158015611ff3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d509190615283565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bdf83398151915292919061205f906156e0565b9050118015612091575060015f83815260088301602052604090205460ff16600581111561208f5761208f615185565b145b6120ad5760405162461bcd60e51b815260040161068990615712565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e69190600401615759565b6020604051808303815f875af1158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121269190615283565b505050565b5f612134612850565b61213f82333461389c565b905061215760015f80516020615bff83398151915255565b919050565b612164614f85565b5f8281525f80516020615c1f833981519152602052604090819020815160e0810190925280545f80516020615bdf833981519152929190829060ff1660058111156121b1576121b1615185565b60058111156121c2576121c2615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561226f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229691908101906157ee565b91509150806122f95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123609190615283565b8251146123c45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561243a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124498460400151613c53565b915091508187146124b65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615c1f833981519152602052604081206002015481905f80516020615bdf83398151915290600160801b90046001600160401b03166125088582613e2b565b5f61251287614039565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125628a858b612617565b6040518263ffffffff1660e01b815260040161257e91906152bc565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190615283565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612690576126508160016156cd565b61265b906008615644565b5081515f908390839081106126725761267261540c565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b60048110156126fb576126a78160036156cd565b6126b2906008615644565b600263ffffffff16901c60f81b828260026126cd919061560f565b815181106126dd576126dd61540c565b60200101906001600160f81b03191690815f1a905350600101612693565b505f5b602081101561275d5761271281601f6156cd565b61271d906008615644565b86901c60f81b8261272f83600661560f565b8151811061273f5761273f61540c565b60200101906001600160f81b03191690815f1a9053506001016126fe565b505f5b60088110156127c8576127748160076156cd565b61277f906008615644565b6001600160401b038616901c60f81b8261279a83602661560f565b815181106127aa576127aa61540c565b60200101906001600160f81b03191690815f1a905350600101612760565b505f5b6008811015612833576127df8160076156cd565b6127ea906008615644565b6001600160401b038516901c60f81b8261280583602e61560f565b815181106128155761281561540c565b60200101906001600160f81b03191690815f1a9053506001016127cb565b50949350505050565b6128446140c9565b61284d81614114565b50565b5f80516020615bff83398151915280546001190161288157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b9f8339815191529061ffff8616108015906128d3575061271061ffff861611155b6128ef5760405162461bcd60e51b8152600401610689906158c0565b60028101546001600160401b0390811690851610156129685760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129cb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a325760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a3d82610c6d565b90505f612a4a8983614188565b90506040518060600160405280612a5e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bff83398151915255565b5f612b0d614f85565b5f80516020615bdf8339815191525f612b2585612f02565b90505f80612b3683604001516136fb565b915091508015612b9b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcc57612bcc615185565b6005811115612bdd57612bdd615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4e57612c4e615185565b1480612c6c5750600182516005811115612c6a57612c6a615185565b145b612ccb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612ce057612ce0615185565b03612ced57506004612cf1565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1a57612d1a615185565b90816005811115612d2d57612d2d615185565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6157612d61615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1557612e15615185565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed5575f80fd5b505af1158015612ee7573d5f803e3d5ffd5b505050505050565b611bd56001600160a01b038316826146ed565b60408051606080820183525f8083526020830181905292820152905f80516020615bdf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f77573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9e91908101906157ee565b9150915080612ffe5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130615760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131005760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561314f576131178160016156cd565b613122906008615644565b61ffff168682815181106131385761313861540c565b016020015160f81c901b9190911790600101613103565b5061ffff8116156131725760405162461bcd60e51b815260040161068990615954565b5f805b60048110156131cd576131898160036156cd565b613194906008615644565b63ffffffff16876131a683600261560f565b815181106131b6576131b661540c565b016020015160f81c901b9190911790600101613175565b5063ffffffff81166004146131f45760405162461bcd60e51b815260040161068990615997565b5f805b60208110156132495761320b81601f6156cd565b613216906008615644565b8861322283600661560f565b815181106132325761323261540c565b016020015160f81c901b91909117906001016131f7565b505f805b60088110156132a8576132618160076156cd565b61326c906008615644565b6001600160401b03168961328183602661560f565b815181106132915761329161540c565b016020015160f81c901b919091179060010161324d565b505f805b6008811015613307576132c08160076156cd565b6132cb906008615644565b6001600160401b03168a6132e083602e61560f565b815181106132f0576132f061540c565b016020015160f81c901b91909117906001016132ac565b5091989097509095509350505050565b5f81516026146133395760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613388576133508160016156cd565b61335b906008615644565b61ffff168482815181106133715761337161540c565b016020015160f81c901b919091179060010161333c565b5061ffff8116156133ab5760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613406576133c28160036156cd565b6133cd906008615644565b63ffffffff16856133df83600261560f565b815181106133ef576133ef61540c565b016020015160f81c901b91909117906001016133ae565b5063ffffffff81161561342b5760405162461bcd60e51b815260040161068990615997565b5f805b60208110156128335761344281601f6156cd565b61344d906008615644565b8661345983600661560f565b815181106134695761346961540c565b016020015160f81c901b919091179060010161342e565b613488614f85565b5f8281525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff1660058111156134d5576134d5615185565b60058111156134e6576134e6615185565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355857613558615185565b146135b45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f8576135f8615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a485826124c0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371e5760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561376d576137358160016156cd565b613740906008615644565b61ffff168582815181106137565761375661540c565b016020015160f81c901b9190911790600101613721565b5061ffff8116156137905760405162461bcd60e51b815260040161068990615954565b5f805b60048110156137eb576137a78160036156cd565b6137b2906008615644565b63ffffffff16866137c483600261560f565b815181106137d4576137d461540c565b016020015160f81c901b9190911790600101613793565b5063ffffffff81166003146138125760405162461bcd60e51b815260040161068990615997565b5f805b60208110156138675761382981601f6156cd565b613834906008615644565b8761384083600661560f565b815181106138505761385061540c565b016020015160f81c901b9190911790600101613815565b505f8660268151811061387c5761387c61540c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b9f833981519152816138b584610c6d565b90505f6138c18761215c565b90506138cc87612e4e565b6139295760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b60028151600581111561393e5761393e615185565b1461399d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139ae91906156ad565b600485015460408401519192506139d0916001600160401b03909116906159de565b6001600160401b0316816001600160401b03161115613a4f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a5b8a846124c0565b915091505f8a83604051602001613a8992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2457613b24615185565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c765760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613cc557613c8d8160016156cd565b613c98906008615644565b61ffff16858281518110613cae57613cae61540c565b016020015160f81c901b9190911790600101613c79565b5061ffff811615613ce85760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613d4357613cff8160036156cd565b613d0a906008615644565b63ffffffff1686613d1c83600261560f565b81518110613d2c57613d2c61540c565b016020015160f81c901b9190911790600101613ceb565b5063ffffffff8116600514613d6a5760405162461bcd60e51b815260040161068990615997565b5f805b6020811015613dbf57613d8181601f6156cd565b613d8c906008615644565b87613d9883600661560f565b81518110613da857613da861540c565b016020015160f81c901b9190911790600101613d6d565b505f805b6008811015613e1e57613dd78160076156cd565b613de2906008615644565b6001600160401b031688613df783602661560f565b81518110613e0757613e0761540c565b016020015160f81c901b9190911790600101613dc3565b5090969095509350505050565b5f80516020615bdf8339815191525f6001600160401b038084169085161115613e5f57613e588385615263565b9050613e6c565b613e698484615263565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ece575060028401548151613eca916001600160401b03169061560f565b8210155b15613ef4576001600160401b038316606082015281815260408101516020820152613f13565b8281606001818151613f0691906156ad565b6001600160401b03169052505b6060810151613f239060646159de565b602082015160028601546001600160401b039290921691613f4e9190600160401b900460ff16615644565b1015613fb25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fcd919061560f565b9052506040810180516001600160401b0387169190613fed9083906156cd565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c1f8339815191526020526040812060020180545f80516020615bdf83398151915291600160401b9091046001600160401b031690600861408383615a09565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411257604051631afcd79f60e31b815260040160405180910390fd5b565b61411c6140c9565b61412581614780565b61412d614799565b61284d608082013560a083013561414a60e0850160c0860161516c565b61415b610100860160e08701615a24565b61ffff1661417161012087016101008801615a3d565b614183610140880161012089016153ac565b6147a9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142135760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bdf83398151915242614232604086016020870161516c565b6001600160401b0316116142a45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142b4604085016020860161516c565b6001600160401b03166142ca6202a3004261560f565b1161433d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143955760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143c45760405162461bcd60e51b815260040161068990615567565b60306143d36040860186615a5d565b9050146144385760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614442835f613e2b565b5f806144dc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614487919061516c565b6001600160401b031681526020016144a260408a018a615a5d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ed565b5f828152600786016020526040902091935091506144fa8282615ae3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145279085906004016152bc565b6020604051808303815f875af1158015614543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145679190615283565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145df576145df615185565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146bf918e01908e0161516c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147105760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614759576040519150601f19603f3d011682016040523d82523d5f602084013e61475e565b606091505b505090508061212657604051630a12f52160e11b815260040160405180910390fd5b6147886140c9565b614790614d9c565b61284d81614da4565b6147a16140c9565b614112614f46565b6147b16140c9565b5f80516020615b9f8339815191528361481d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b61271084111561483f5760405162461bcd60e51b8152600401610689906158c0565b858711156148a75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149145760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149865760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a575760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ace57614a8e8160016156cd565b614a99906008615644565b5081515f90839083908110614ab057614ab061540c565b60200101906001600160f81b03191690815f1a905350600101614a7a565b505f5b6004811015614b3657614ae58160036156cd565b614af0906008615644565b600160ff919091161c60f81b82614b0883600261560f565b81518110614b1857614b1861540c565b60200101906001600160f81b03191690815f1a905350600101614ad1565b505f5b6020811015614b935784518160208110614b5557614b5561540c565b1a60f81b82614b6583600661560f565b81518110614b7557614b7561540c565b60200101906001600160f81b03191690815f1a905350600101614b39565b505f5b6020811015614bf35784602001518160208110614bb557614bb561540c565b1a60f81b82614bc583602661560f565b81518110614bd557614bd561540c565b60200101906001600160f81b03191690815f1a905350600101614b96565b505f5b6008811015614c6757614c0a8160076156cd565b614c15906008615644565b60ff1685604001516001600160401b0316901c60f81b82826046614c39919061560f565b81518110614c4957614c4961540c565b60200101906001600160f81b03191690815f1a905350600101614bf6565b505f5b6030811015614cd25784608001518181518110614c8957614c8961540c565b01602001516001600160f81b03191682614ca483604e61560f565b81518110614cb457614cb461540c565b60200101906001600160f81b03191690815f1a905350600101614c6a565b505f5b6008811015614d4457614ce98160076156cd565b614cf4906008615644565b60608601516001600160401b0390811691161c60f81b82614d1683607e61560f565b81518110614d2657614d2661540c565b60200101906001600160f81b03191690815f1a905350600101614cd5565b50600281604051614d5591906155fe565b602060405180830381855afa158015614d70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d939190615283565b94909350915050565b6141126140c9565b614dac6140c9565b80355f80516020615bdf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df86080840160608501615a3d565b60ff161115614e655760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e766080840160608501615a3d565b60ff1611614ede5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614eee6080830160608401615a3d565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f1f606083016040840161516c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af16140c9565b508054614f5a906156e0565b5f825580601f10614f69575050565b601f0160209004905f5260205f209081019061284d9190614fc1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd5575f8155600101614fc2565b5090565b801515811461284d575f80fd5b803563ffffffff81168114612157575f80fd5b5f805f6060848603121561500b575f80fd5b83359250602084013561501d81614fd9565b915061502b60408501614fe6565b90509250925092565b5f60208284031215615044575f80fd5b5035919050565b5f610140828403121561505c575f80fd5b50919050565b803561ffff81168114612157575f80fd5b80356001600160401b0381168114612157575f80fd5b5f805f6060848603121561509b575f80fd5b83356001600160401b038111156150b0575f80fd5b8401606081870312156150c1575f80fd5b92506150cf60208501615062565b915061502b60408501615073565b5f602082840312156150ed575f80fd5b610cb082614fe6565b5f8060408385031215615107575f80fd5b61511083614fe6565b946020939093013593505050565b5f806040838503121561512f575f80fd5b82356001600160401b03811115615144575f80fd5b830160808186031215615155575f80fd5b915061516360208401614fe6565b90509250929050565b5f6020828403121561517c575f80fd5b610cb082615073565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f760608401826001600160401b03169052565b50608083015161521260808401826001600160401b03169052565b5060a083015161522d60a08401826001600160401b03169052565b5060c083015161524860c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152485761524861524f565b5f60208284031215615293575f80fd5b5051919050565b5f5b838110156152b457818101518382015260200161529c565b50505f910152565b602081525f82518060208401526152da81604085016020870161529a565b601f01601f19169190910160400192915050565b5f8261530857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284d575f80fd5b5f602082840312156153bc575f80fd5b8135610cb081615398565b5f808335601e198436030181126153dc575f80fd5b8301803591506001600160401b038211156153f5575f80fd5b6020019150600581901b3603821315612610575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615434575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154745761547461543e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a2576154a261543e565b604052919050565b5f6001600160401b038211156154c2576154c261543e565b50601f01601f191660200190565b5f606082360312156154e0575f80fd5b6154e8615452565b8235815260206154f9818501615073565b8183015260408401356001600160401b03811115615515575f80fd5b840136601f820112615525575f80fd5b8035615538615533826154aa565b61547a565b818152368483850101111561554b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c0818460208a0161529a565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f081602884016020880161529a565b016028019695505050505050565b5f825161543481846020870161529a565b80820180821115610c7d57610c7d61524f565b5f63ffffffff80831681810361563a5761563a61524f565b6001019392505050565b8082028115828204841417610c7d57610c7d61524f565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156152485761524861524f565b81810381811115610c7d57610c7d61524f565b600181811c908216806156f457607f821691505b60208210810361505c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576b816156e0565b806020870152604060018084165f811461578c57600181146157a8576157d5565b60ff19851660408a0152604084151560051b8a010195506157d5565b895f5260205f205f5b858110156157cc5781548b82018601529083019088016157b1565b8a016040019650505b509398975050505050505050565b805161215781614fd9565b5f80604083850312156157ff575f80fd5b82516001600160401b0380821115615815575f80fd5b9084019060608287031215615828575f80fd5b615830615452565b8251815260208084015161584381615398565b82820152604084015183811115615858575f80fd5b80850194505087601f85011261586c575f80fd5b8351925061587c615533846154aa565b838152888285870101111561588f575f80fd5b61589e8483830184880161529a565b806040840152508195506158b38188016157e3565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0157615a0161524f565b505092915050565b5f6001600160401b0380831681810361563a5761563a61524f565b5f60208284031215615a34575f80fd5b610cb082615062565b5f60208284031215615a4d575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a72575f80fd5b8301803591506001600160401b03821115615a8b575f80fd5b602001915036819003821315612610575f80fd5b601f82111561212657805f5260205f20601f840160051c81016020851015615ac45750805b601f840160051c820191505b81811015610d50575f8155600101615ad0565b81516001600160401b03811115615afc57615afc61543e565b615b1081615b0a84546156e0565b84615a9f565b602080601f831160018114615b43575f8415615b2c5750858301515b5f19600386901b1c1916600185901b178555612ee7565b5f85815260208120601f198616915b82811015615b7157888601518255948401946001909101908401615b52565b5085821015615b8e57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 38f7288ae..56ac2c55e 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -164,7 +164,14 @@ abstract contract PoSValidatorManager is Validator memory validator = _initializeEndValidation(validationID); - if (!_isPoSValidator(validationID)) { + if (_isPoSValidator(validationID)) { + // PoS validations can only be ended by their owners. + require( + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + } else { + // Non-PoS validations can be ended by anyone, and do not get rewards, so return here. return; } From 3286116ba599601014e4068f677b68d0e3c6a152 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 10:03:09 -0400 Subject: [PATCH 33/36] Small fix --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 316d22a9b..6eaab5861 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160da3803806160da83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529e565b6103ec565b005b61019e6101ae3660046152d9565b61088f565b6101f16101c13660046152d9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152d9565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615304565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615342565b610b3d565b61019e61029936600461535b565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615383565b610db2565b6101f16102dc3660046153e7565b6113e6565b6102316102ef3660046152d9565b6113ff565b61019e61030236600461529e565b611413565b61020c603081565b61019e61031d3660046152d9565b611650565b61019e61033036600461535b565b611756565b6101f1610343366004615400565b611a5f565b61019e610356366004615342565b611a8b565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152d9565b611c43565b61019e6103a23660046152d9565b611ec9565b61020c601481565b6103c26103bd3660046152d9565b611fdd565b6040516101fb9190615434565b6102316202a30081565b6101f16103e73660046154fb565b6120a5565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ee1833981519152949193919290829060ff16600481111561045457610454615420565b600481111561046557610465615420565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611fdd565b90506002825160048111156104f8576104f8615420565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615f018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615420565b036106225786156105e3576105e084876120da565b90505b5f836060015183608001516105f89190615574565b90506106048582612376565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a9190615594565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615420565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff1660058111156108dc576108dc615420565b60058111156108ed576108ed615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615420565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124cd565b6040518263ffffffff1660e01b8152600401610a0291906155cd565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190615594565b50505050565b5f610a5864e8d4a51000836155ff565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af084846126f4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee18339815191525f80610b568461270e565b91509150610b6382612a58565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615420565b03610bc0575f83815260088501602052604081208054919055610bbe8282612a93565b505b610bd681610bd184604001516113e6565b612b09565b5050505050565b5f80516020615ee18339815191525f610bf584612b2c565b90505f80610c068360400151612d06565b50915091505f610c1583611fdd565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b81526004016105419061561e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615660565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615420565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f218339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb69190615594565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156a9565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156c4565b91505f9050843560208601356014610fc76060890160408a016156a9565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156c4565b8363ffffffff1681811061105d5761105d615709565b905060200281019061106f919061571d565b611078906157cd565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615864565b84825f0151836020015184604001516040516020016110cd94939291906158ac565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b91906158fb565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111599190615594565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615420565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661590c565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef9061591f565b905061102b565b50600584018190555f61130886612b2c565b90505f6113188260400151612f41565b90508060028560405161132b91906158fb565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113699190615594565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615941565b5f61140982611fdd565b6080015192915050565b5f80516020615ee18339815191525f61142b856130b3565b905061143685612a58565b15610bd6575f8581526005830160205260409020546001600160a01b031633146114725760405162461bcd60e51b815260040161054190615958565b5f85815260058301602052604090205460a08201516114a191600160b01b90046001600160401b0316906159aa565b6001600160401b03168160c001516001600160401b031610156115225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61153386856120da565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158a906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611600573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116249190615594565b5f8781526008850160205260408120805490919061164390849061590c565b9091555050505050505050565b5f80516020615ee18339815191525f61166883611fdd565b905060048151600581111561167f5761167f615420565b146116e95760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b031633146117205760405162461bcd60e51b815260040161054190615958565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612a93565b61175e61332e565b5f80516020615ee18339815191525f61177684612b2c565b90505f806117878360400151612d06565b50915091505f61179683611fdd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d0576117d0615420565b60048111156117e1576117e1615420565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c55760405162461bcd60e51b81526004016105419061561e565b826001600160401b03168160e001516001600160401b031611156118fb5760405162461bcd60e51b815260040161054190615660565b60038151600481111561191057611910615420565b146119645760405162461bcd60e51b815260206004820152603160248201525f80516020615f018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a590600160a01b900461ffff1684615941565b6119af91906155ff565b905080886008015f8881526020019081526020015f205f8282546119d3919061590c565b909155505060208301516119f0906119eb83856159ca565b612a93565b611a058360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5b60015f80516020615f4183398151915255565b5050565b5f611a6861332e565b611a73833384613378565b9050610a5860015f80516020615f4183398151915255565b5f80516020615f218339815191525f611aa383612b2c565b90505f80611ab48360400151613732565b9150915080611b165760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b30906159dd565b9050118015611b62575060015f83815260088601602052604090205460ff166005811115611b6057611b60615420565b145b611b7e5760405162461bcd60e51b815260040161054190615a15565b5f8281526007850160205260408120611b96916151ee565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee183398151915293929190829060ff166004811115611ca457611ca4615420565b6004811115611cb557611cb5615420565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3c57611d3c615420565b1480611d5a5750600381516004811115611d5857611d58615420565b145b611dae5760405162461bcd60e51b815260206004820152603260248201525f80516020615f01833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dbc8260400151611fdd565b905080606001516001600160401b03165f03611e405760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e6d8460400151846060015185608001516124cd565b6040518263ffffffff1660e01b8152600401611e8991906155cd565b6020604051808303815f875af1158015611ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190615594565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f21833981519152929190611f11906159dd565b9050118015611f43575060015f83815260088301602052604090205460ff166005811115611f4157611f41615420565b145b611f5f5760405162461bcd60e51b815260040161054190615a15565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f989190600401615a5c565b6020604051808303815f875af1158015611fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd89190615594565b505050565b611fe5615225565b5f8281525f80516020615f61833981519152602052604090819020815160e0810190925280545f80516020615f21833981519152929190829060ff16600581111561203257612032615420565b600581111561204357612043615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120ae61332e565b6120ba858585856138d3565b90506120d260015f80516020615f4183398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612125573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214c9190810190615af1565b91509150806121af5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122169190615594565b82511461227a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156122f05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806122ff8460400151613b48565b9150915081871461236c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f61833981519152602052604081206002015481905f80516020615f2183398151915290600160801b90046001600160401b03166123be8582613d20565b5f6123c887613f2e565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124188a858b6124cd565b6040518263ffffffff1660e01b815260040161243491906155cd565b6020604051808303815f875af1158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190615594565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612546576125068160016159ca565b612511906008615941565b5081515f9083908390811061252857612528615709565b60200101906001600160f81b03191690815f1a9053506001016124f2565b505f5b60048110156125b15761255d8160036159ca565b612568906008615941565b600263ffffffff16901c60f81b82826002612583919061590c565b8151811061259357612593615709565b60200101906001600160f81b03191690815f1a905350600101612549565b505f5b6020811015612613576125c881601f6159ca565b6125d3906008615941565b86901c60f81b826125e583600661590c565b815181106125f5576125f5615709565b60200101906001600160f81b03191690815f1a9053506001016125b4565b505f5b600881101561267e5761262a8160076159ca565b612635906008615941565b6001600160401b038616901c60f81b8261265083602661590c565b8151811061266057612660615709565b60200101906001600160f81b03191690815f1a905350600101612616565b505f5b60088110156126e9576126958160076159ca565b6126a0906008615941565b6001600160401b038516901c60f81b826126bb83602e61590c565b815181106126cb576126cb615709565b60200101906001600160f81b03191690815f1a905350600101612681565b5090505b9392505050565b6126fc613fbe565b61270582614009565b611a5b81614080565b5f612717615225565b5f80516020615f218339815191525f61272f85612b2c565b90505f806127408360400151613732565b9150915080156127a55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d6576127d6615420565b60058111156127e7576127e7615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285857612858615420565b1480612876575060018251600581111561287457612874615420565b145b6128d55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156128ea576128ea615420565b036128f7575060046128fb565b5060055b6020808301515f9081526009880190915260408120558181600581111561292457612924615420565b9081600581111561293757612937615420565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296b5761296b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a1f57612a1f615420565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aee575f80fd5b505af1158015612b00573d5f803e3d5ffd5b50505050505050565b5f80516020615ec183398151915254611a5b906001600160a01b03168383614121565b60408051606080820183525f8083526020830181905292820152905f80516020615f218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc89190810190615af1565b9150915080612c285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612c8b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612cfe5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d2a5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612d7957612d418160016159ca565b612d4c906008615941565b61ffff16868281518110612d6257612d62615709565b016020015160f81c901b9190911790600101612d2d565b5061ffff811615612d9c5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015612df757612db38160036159ca565b612dbe906008615941565b63ffffffff1687612dd083600261590c565b81518110612de057612de0615709565b016020015160f81c901b9190911790600101612d9f565b5063ffffffff8116600414612e1e5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015612e7357612e3581601f6159ca565b612e40906008615941565b88612e4c83600661590c565b81518110612e5c57612e5c615709565b016020015160f81c901b9190911790600101612e21565b505f805b6008811015612ed257612e8b8160076159ca565b612e96906008615941565b6001600160401b031689612eab83602661590c565b81518110612ebb57612ebb615709565b016020015160f81c901b9190911790600101612e77565b505f805b6008811015612f3157612eea8160076159ca565b612ef5906008615941565b6001600160401b03168a612f0a83602e61590c565b81518110612f1a57612f1a615709565b016020015160f81c901b9190911790600101612ed6565b5091989097509095509350505050565b5f8151602614612f635760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612fb257612f7a8160016159ca565b612f85906008615941565b61ffff16848281518110612f9b57612f9b615709565b016020015160f81c901b9190911790600101612f66565b5061ffff811615612fd55760405162461bcd60e51b815260040161054190615c0c565b5f805b600481101561303057612fec8160036159ca565b612ff7906008615941565b63ffffffff168561300983600261590c565b8151811061301957613019615709565b016020015160f81c901b9190911790600101612fd8565b5063ffffffff8116156130555760405162461bcd60e51b815260040161054190615c4f565b5f805b60208110156130aa5761306c81601f6159ca565b613077906008615941565b8661308383600661590c565b8151811061309357613093615709565b016020015160f81c901b9190911790600101613058565b50949350505050565b6130bb615225565b5f8281525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff16600581111561310857613108615420565b600581111561311957613119615420565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318b5761318b615420565b146131e75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322b5761322b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d78582612376565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4183398151915280546001190161335f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4183398151915255565b5f5f80516020615ee18339815191528161339461022c85614180565b90505f6133a087611fdd565b90506133ab87612a58565b6134085760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561341d5761341d615420565b1461347c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f82826080015161348d91906159aa565b600485015460408401519192506134af916001600160401b0390911690615c96565b6001600160401b0316816001600160401b0316111561352e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061353a8a84612376565b915091505f8a8360405160200161356892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360357613603615420565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137555760405162461bcd60e51b815260040161054190615bc3565b5f805b60028110156137a45761376c8160016159ca565b613777906008615941565b61ffff1685828151811061378d5761378d615709565b016020015160f81c901b9190911790600101613758565b5061ffff8116156137c75760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613822576137de8160036159ca565b6137e9906008615941565b63ffffffff16866137fb83600261590c565b8151811061380b5761380b615709565b016020015160f81c901b91909117906001016137ca565b5063ffffffff81166003146138495760405162461bcd60e51b815260040161054190615c4f565b5f805b602081101561389e5761386081601f6159ca565b61386b906008615941565b8761387783600661590c565b8151811061388757613887615709565b016020015160f81c901b919091179060010161384c565b505f866026815181106138b3576138b3615709565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee18339815191529061ffff86161080159061391f575061271061ffff861611155b61393b5760405162461bcd60e51b815260040161054190615cc1565b60028101546001600160401b0390811690851610156139b45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a175760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a7e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613a8884614180565b90505f613a9482610a48565b90505f613aa189836141a3565b90506040518060600160405280613ab53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6b5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015613bba57613b828160016159ca565b613b8d906008615941565b61ffff16858281518110613ba357613ba3615709565b016020015160f81c901b9190911790600101613b6e565b5061ffff811615613bdd5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613c3857613bf48160036159ca565b613bff906008615941565b63ffffffff1686613c1183600261590c565b81518110613c2157613c21615709565b016020015160f81c901b9190911790600101613be0565b5063ffffffff8116600514613c5f5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015613cb457613c7681601f6159ca565b613c81906008615941565b87613c8d83600661590c565b81518110613c9d57613c9d615709565b016020015160f81c901b9190911790600101613c62565b505f805b6008811015613d1357613ccc8160076159ca565b613cd7906008615941565b6001600160401b031688613cec83602661590c565b81518110613cfc57613cfc615709565b016020015160f81c901b9190911790600101613cb8565b5090969095509350505050565b5f80516020615f218339815191525f6001600160401b038084169085161115613d5457613d4d8385615574565b9050613d61565b613d5e8484615574565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc3575060028401548151613dbf916001600160401b03169061590c565b8210155b15613de9576001600160401b038316606082015281815260408101516020820152613e08565b8281606001818151613dfb91906159aa565b6001600160401b03169052505b6060810151613e18906064615c96565b602082015160028601546001600160401b039290921691613e439190600160401b900460ff16615941565b1015613ea75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ec2919061590c565b9052506040810180516001600160401b0387169190613ee29083906159ca565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f618339815191526020526040812060020180545f80516020615f2183398151915291600160401b9091046001600160401b0316906008613f7883615d0c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400757604051631afcd79f60e31b815260040160405180910390fd5b565b614011613fbe565b61401a81614708565b614022614721565b61407d608082013560a083013561403f60e0850160c086016153e7565b614050610100860160e08701615d27565b61ffff1661406661012087016101008801615d40565b614078610140880161012089016156a9565b614731565b50565b614088613fbe565b5f80516020615ec18339815191526001600160a01b0382166141015760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614975565b5f610a58825f80516020615ec1833981519152546001600160a01b0316906149d6565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615f218339815191524261424d60408601602087016153e7565b6001600160401b0316116142bf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142cf60408501602086016153e7565b6001600160401b03166142e56202a3004261590c565b116143585760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143b05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143df5760405162461bcd60e51b815260040161054190615864565b60306143ee6040860186615d60565b9050146144535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b61445d835f613d20565b5f806144f76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a291906153e7565b6001600160401b031681526020016144bd60408a018a615d60565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b38565b5f828152600786016020526040902091935091506145158282615de6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145429085906004016155cd565b6020604051808303815f875af115801561455e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145829190615594565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fa576145fa615420565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146da918e01908e016153e7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614710613fbe565b614718614ee7565b61407d81614eef565b614729613fbe565b614007615091565b614739613fbe565b5f80516020615ee1833981519152836147a55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147c75760405162461bcd60e51b815260040161054190615cc1565b8587111561482f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff161161489c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff8416111561490e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149896001600160a01b03841683615099565b905080515f141580156149ad5750808060200190518101906149ab9190615ea5565b155b15611fd857604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a409190615594565b9050614a576001600160a01b0385163330866150a6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614abf9190615594565b9050818111614b255760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b2f82826159ca565b95945050505050565b5f6060826080015151603014614ba25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1957614bd98160016159ca565b614be4906008615941565b5081515f90839083908110614bfb57614bfb615709565b60200101906001600160f81b03191690815f1a905350600101614bc5565b505f5b6004811015614c8157614c308160036159ca565b614c3b906008615941565b600160ff919091161c60f81b82614c5383600261590c565b81518110614c6357614c63615709565b60200101906001600160f81b03191690815f1a905350600101614c1c565b505f5b6020811015614cde5784518160208110614ca057614ca0615709565b1a60f81b82614cb083600661590c565b81518110614cc057614cc0615709565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6020811015614d3e5784602001518160208110614d0057614d00615709565b1a60f81b82614d1083602661590c565b81518110614d2057614d20615709565b60200101906001600160f81b03191690815f1a905350600101614ce1565b505f5b6008811015614db257614d558160076159ca565b614d60906008615941565b60ff1685604001516001600160401b0316901c60f81b82826046614d84919061590c565b81518110614d9457614d94615709565b60200101906001600160f81b03191690815f1a905350600101614d41565b505f5b6030811015614e1d5784608001518181518110614dd457614dd4615709565b01602001516001600160f81b03191682614def83604e61590c565b81518110614dff57614dff615709565b60200101906001600160f81b03191690815f1a905350600101614db5565b505f5b6008811015614e8f57614e348160076159ca565b614e3f906008615941565b60608601516001600160401b0390811691161c60f81b82614e6183607e61590c565b81518110614e7157614e71615709565b60200101906001600160f81b03191690815f1a905350600101614e20565b50600281604051614ea091906158fb565b602060405180830381855afa158015614ebb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ede9190615594565b94909350915050565b614007613fbe565b614ef7613fbe565b80355f80516020615f2183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f436080840160608501615d40565b60ff161115614fb05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fc16080840160608501615d40565b60ff16116150295760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150396080830160608401615d40565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506a60608301604084016153e7565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613365613fbe565b60606126ed83835f6150df565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd9060840161414e565b6060814710156151045760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b0316848660405161511f91906158fb565b5f6040518083038185875af1925050503d805f8114615159576040519150601f19603f3d011682016040523d82523d5f602084013e61515e565b606091505b509150915061236c86838360608261517e57615179826151c5565b6126ed565b815115801561519557506001600160a01b0384163b155b156151be57604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b50806126ed565b8051156151d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fa906159dd565b5f825580601f10615209575050565b601f0160209004905f5260205f209081019061407d9190615261565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615275575f8155600101615262565b5090565b801515811461407d575f80fd5b803563ffffffff81168114615299575f80fd5b919050565b5f805f606084860312156152b0575f80fd5b8335925060208401356152c281615279565b91506152d060408501615286565b90509250925092565b5f602082840312156152e9575f80fd5b5035919050565b6001600160a01b038116811461407d575f80fd5b5f80828403610160811215615317575f80fd5b61014080821215615326575f80fd5b8493508301359050615337816152f0565b809150509250929050565b5f60208284031215615352575f80fd5b6126ed82615286565b5f806040838503121561536c575f80fd5b61537583615286565b946020939093013593505050565b5f8060408385031215615394575f80fd5b82356001600160401b038111156153a9575f80fd5b8301608081860312156153ba575f80fd5b91506153c860208401615286565b90509250929050565b80356001600160401b0381168114615299575f80fd5b5f602082840312156153f7575f80fd5b6126ed826153d1565b5f8060408385031215615411575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549260608401826001600160401b03169052565b5060808301516154ad60808401826001600160401b03169052565b5060a08301516154c860a08401826001600160401b03169052565b5060c08301516154e360c08401826001600160401b03169052565b5092915050565b803561ffff81168114615299575f80fd5b5f805f806080858703121561550e575f80fd5b84356001600160401b03811115615523575f80fd5b850160608188031215615534575f80fd5b9350615542602086016154ea565b9250615550604086016153d1565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e3576154e3615560565b5f602082840312156155a4575f80fd5b5051919050565b5f5b838110156155c55781810151838201526020016155ad565b50505f910152565b602081525f82518060208401526155eb8160408501602087016155ab565b601f01601f19169190910160400192915050565b5f8261561957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156b9575f80fd5b81356126ed816152f0565b5f808335601e198436030181126156d9575f80fd5b8301803591506001600160401b038211156156f2575f80fd5b6020019150600581901b36038213156124c6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615731575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157715761577161573b565b60405290565b604051601f8201601f191681016001600160401b038111828210171561579f5761579f61573b565b604052919050565b5f6001600160401b038211156157bf576157bf61573b565b50601f01601f191660200190565b5f606082360312156157dd575f80fd5b6157e561574f565b8235815260206157f68185016153d1565b8183015260408401356001600160401b03811115615812575f80fd5b840136601f820112615822575f80fd5b8035615835615830826157a7565b615777565b8181523684838501011115615848575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158bd818460208a016155ab565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ed8160288401602088016155ab565b016028019695505050505050565b5f82516157318184602087016155ab565b80820180821115610a5857610a58615560565b5f63ffffffff80831681810361593757615937615560565b6001019392505050565b8082028115828204841417610a5857610a58615560565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e3576154e3615560565b81810381811115610a5857610a58615560565b600181811c908216806159f157607f821691505b602082108103615a0f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6e816159dd565b806020870152604060018084165f8114615a8f5760018114615aab57615ad8565b60ff19851660408a0152604084151560051b8a01019550615ad8565b895f5260205f205f5b85811015615acf5781548b8201860152908301908801615ab4565b8a016040019650505b509398975050505050505050565b805161529981615279565b5f8060408385031215615b02575f80fd5b82516001600160401b0380821115615b18575f80fd5b9084019060608287031215615b2b575f80fd5b615b3361574f565b82518152602080840151615b46816152f0565b82820152604084015183811115615b5b575f80fd5b80850194505087601f850112615b6f575f80fd5b83519250615b7f615830846157a7565b8381528882858701011115615b92575f80fd5b615ba1848383018488016155ab565b80604084015250819550615bb6818801615ae6565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cb957615cb9615560565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593757615937615560565b5f60208284031215615d37575f80fd5b6126ed826154ea565b5f60208284031215615d50575f80fd5b813560ff811681146126ed575f80fd5b5f808335601e19843603018112615d75575f80fd5b8301803591506001600160401b03821115615d8e575f80fd5b6020019150368190038213156124c6575f80fd5b601f821115611fd857805f5260205f20601f840160051c81016020851015615dc75750805b601f840160051c820191505b81811015610bd6575f8155600101615dd3565b81516001600160401b03811115615dff57615dff61573b565b615e1381615e0d84546159dd565b84615da2565b602080601f831160018114615e46575f8415615e2f5750858301515b5f19600386901b1c1916600185901b178555615e9d565b5f85815260208120601f198616915b82811015615e7457888601518255948401946001909101908401615e55565b5085821015615e9157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb5575f80fd5b81516126ed8161527956fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160db3803806160db83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529f565b6103ec565b005b61019e6101ae3660046152da565b610890565b6101f16101c13660046152da565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152da565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615305565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615343565b610b3e565b61019e61029936600461535c565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615384565b610db3565b6101f16102dc3660046153e8565b6113e7565b6102316102ef3660046152da565b611400565b61019e61030236600461529f565b611414565b61020c603081565b61019e61031d3660046152da565b611651565b61019e61033036600461535c565b611757565b6101f1610343366004615401565b611a60565b61019e610356366004615343565b611a8c565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152da565b611c44565b61019e6103a23660046152da565b611eca565b61020c601481565b6103c26103bd3660046152da565b611fde565b6040516101fb9190615435565b6102316202a30081565b6101f16103e73660046154fc565b6120a6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff16600481111561044d5761044d615421565b600481111561045e5761045e615421565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fde565b90506002835160048111156104f9576104f9615421565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f028339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f028339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615421565b036106235786156105e4576105e183876120db565b90505b5f846060015183608001516105f99190615575565b90506106058482612377565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190615595565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615421565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff1660058111156108dd576108dd615421565b60058111156108ee576108ee615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615421565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ce565b6040518263ffffffff1660e01b8152600401610a0391906155ce565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a439190615595565b50505050565b5f610a5964e8d4a5100083615600565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126f5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee28339815191525f80610b578461270f565b91509150610b6482612a59565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615421565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a94565b505b610bd781610bd284604001516113e7565b612b0a565b5050505050565b5f80516020615ee28339815191525f610bf684612b2d565b90505f80610c078360400151612d07565b50915091505f610c1683611fde565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016105429061561f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615661565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615421565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f228339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb79190615595565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156aa565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156c5565b91505f9050843560208601356014610fc86060890160408a016156aa565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156c5565b8363ffffffff1681811061105e5761105e61570a565b9050602002810190611070919061571e565b611079906157ce565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615865565b84825f0151836020015184604001516040516020016110ce94939291906158ad565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c91906158fc565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a9190615595565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615421565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661590d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615920565b905061102c565b50600584018190555f61130986612b2d565b90505f6113198260400151612f42565b90508060028560405161132c91906158fc565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a9190615595565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615942565b5f61140a82611fde565b6080015192915050565b5f80516020615ee28339815191525f61142c856130b4565b905061143785612a59565b15610bd7575f8581526005830160205260409020546001600160a01b031633146114735760405162461bcd60e51b815260040161054290615959565b5f85815260058301602052604090205460a08201516114a291600160b01b90046001600160401b0316906159ab565b6001600160401b03168160c001516001600160401b031610156115235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153486856120db565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158b906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611601573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116259190615595565b5f8781526008850160205260408120805490919061164490849061590d565b9091555050505050505050565b5f80516020615ee28339815191525f61166983611fde565b905060048151600581111561168057611680615421565b146116ea5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117215760405162461bcd60e51b815260040161054290615959565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a94565b61175f61332f565b5f80516020615ee28339815191525f61177784612b2d565b90505f806117888360400151612d07565b50915091505f61179783611fde565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d1576117d1615421565b60048111156117e2576117e2615421565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c65760405162461bcd60e51b81526004016105429061561f565b826001600160401b03168160e001516001600160401b031611156118fc5760405162461bcd60e51b815260040161054290615661565b60038151600481111561191157611911615421565b146119655760405162461bcd60e51b815260206004820152603160248201525f80516020615f028339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a690600160a01b900461ffff1684615942565b6119b09190615600565b905080886008015f8881526020019081526020015f205f8282546119d4919061590d565b909155505060208301516119f1906119ec83856159cb565b612a94565b611a068360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5c60015f80516020615f4283398151915255565b5050565b5f611a6961332f565b611a74833384613379565b9050610a5960015f80516020615f4283398151915255565b5f80516020615f228339815191525f611aa483612b2d565b90505f80611ab58360400151613733565b9150915080611b175760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b31906159de565b9050118015611b63575060015f83815260088601602052604090205460ff166005811115611b6157611b61615421565b145b611b7f5760405162461bcd60e51b815260040161054290615a16565b5f8281526007850160205260408120611b97916151ef565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff166004811115611ca557611ca5615421565b6004811115611cb657611cb6615421565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3d57611d3d615421565b1480611d5b5750600381516004811115611d5957611d59615421565b145b611daf5760405162461bcd60e51b815260206004820152603260248201525f80516020615f02833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dbd8260400151611fde565b905080606001516001600160401b03165f03611e415760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e6e8460400151846060015185608001516124ce565b6040518263ffffffff1660e01b8152600401611e8a91906155ce565b6020604051808303815f875af1158015611ea6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd79190615595565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f22833981519152929190611f12906159de565b9050118015611f44575060015f83815260088301602052604090205460ff166005811115611f4257611f42615421565b145b611f605760405162461bcd60e51b815260040161054290615a16565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f999190600401615a5d565b6020604051808303815f875af1158015611fb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd99190615595565b505050565b611fe6615226565b5f8281525f80516020615f62833981519152602052604090819020815160e0810190925280545f80516020615f22833981519152929190829060ff16600581111561203357612033615421565b600581111561204457612044615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120af61332f565b6120bb858585856138d4565b90506120d360015f80516020615f4283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612126573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214d9190810190615af2565b91509150806121b05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190615595565b82511461227b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123008460400151613b49565b9150915081871461236d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f62833981519152602052604081206002015481905f80516020615f2283398151915290600160801b90046001600160401b03166123bf8582613d21565b5f6123c987613f2f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124198a858b6124ce565b6040518263ffffffff1660e01b815260040161243591906155ce565b6020604051808303815f875af1158015612451573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124759190615595565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612547576125078160016159cb565b612512906008615942565b5081515f908390839081106125295761252961570a565b60200101906001600160f81b03191690815f1a9053506001016124f3565b505f5b60048110156125b25761255e8160036159cb565b612569906008615942565b600263ffffffff16901c60f81b82826002612584919061590d565b815181106125945761259461570a565b60200101906001600160f81b03191690815f1a90535060010161254a565b505f5b6020811015612614576125c981601f6159cb565b6125d4906008615942565b86901c60f81b826125e683600661590d565b815181106125f6576125f661570a565b60200101906001600160f81b03191690815f1a9053506001016125b5565b505f5b600881101561267f5761262b8160076159cb565b612636906008615942565b6001600160401b038616901c60f81b8261265183602661590d565b815181106126615761266161570a565b60200101906001600160f81b03191690815f1a905350600101612617565b505f5b60088110156126ea576126968160076159cb565b6126a1906008615942565b6001600160401b038516901c60f81b826126bc83602e61590d565b815181106126cc576126cc61570a565b60200101906001600160f81b03191690815f1a905350600101612682565b5090505b9392505050565b6126fd613fbf565b6127068261400a565b611a5c81614081565b5f612718615226565b5f80516020615f228339815191525f61273085612b2d565b90505f806127418360400151613733565b9150915080156127a65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d7576127d7615421565b60058111156127e8576127e8615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285957612859615421565b1480612877575060018251600581111561287557612875615421565b145b6128d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128eb576128eb615421565b036128f8575060046128fc565b5060055b6020808301515f9081526009880190915260408120558181600581111561292557612925615421565b9081600581111561293857612938615421565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296c5761296c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2057612a20615421565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aef575f80fd5b505af1158015612b01573d5f803e3d5ffd5b50505050505050565b5f80516020615ec283398151915254611a5c906001600160a01b03168383614122565b60408051606080820183525f8083526020830181905292820152905f80516020615f228339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc99190810190615af2565b9150915080612c295760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c8c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612cff5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d2b5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612d7a57612d428160016159cb565b612d4d906008615942565b61ffff16868281518110612d6357612d6361570a565b016020015160f81c901b9190911790600101612d2e565b5061ffff811615612d9d5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015612df857612db48160036159cb565b612dbf906008615942565b63ffffffff1687612dd183600261590d565b81518110612de157612de161570a565b016020015160f81c901b9190911790600101612da0565b5063ffffffff8116600414612e1f5760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015612e7457612e3681601f6159cb565b612e41906008615942565b88612e4d83600661590d565b81518110612e5d57612e5d61570a565b016020015160f81c901b9190911790600101612e22565b505f805b6008811015612ed357612e8c8160076159cb565b612e97906008615942565b6001600160401b031689612eac83602661590d565b81518110612ebc57612ebc61570a565b016020015160f81c901b9190911790600101612e78565b505f805b6008811015612f3257612eeb8160076159cb565b612ef6906008615942565b6001600160401b03168a612f0b83602e61590d565b81518110612f1b57612f1b61570a565b016020015160f81c901b9190911790600101612ed7565b5091989097509095509350505050565b5f8151602614612f645760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612fb357612f7b8160016159cb565b612f86906008615942565b61ffff16848281518110612f9c57612f9c61570a565b016020015160f81c901b9190911790600101612f67565b5061ffff811615612fd65760405162461bcd60e51b815260040161054290615c0d565b5f805b600481101561303157612fed8160036159cb565b612ff8906008615942565b63ffffffff168561300a83600261590d565b8151811061301a5761301a61570a565b016020015160f81c901b9190911790600101612fd9565b5063ffffffff8116156130565760405162461bcd60e51b815260040161054290615c50565b5f805b60208110156130ab5761306d81601f6159cb565b613078906008615942565b8661308483600661590d565b815181106130945761309461570a565b016020015160f81c901b9190911790600101613059565b50949350505050565b6130bc615226565b5f8281525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff16600581111561310957613109615421565b600581111561311a5761311a615421565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318c5761318c615421565b146131e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322c5761322c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d88582612377565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4283398151915280546001190161336057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4283398151915255565b5f5f80516020615ee28339815191528161339561022c85614181565b90505f6133a187611fde565b90506133ac87612a59565b6134095760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561341e5761341e615421565b1461347d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161348e91906159ab565b600485015460408401519192506134b0916001600160401b0390911690615c97565b6001600160401b0316816001600160401b0316111561352f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061353b8a84612377565b915091505f8a8360405160200161356992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360457613604615421565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137565760405162461bcd60e51b815260040161054290615bc4565b5f805b60028110156137a55761376d8160016159cb565b613778906008615942565b61ffff1685828151811061378e5761378e61570a565b016020015160f81c901b9190911790600101613759565b5061ffff8116156137c85760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613823576137df8160036159cb565b6137ea906008615942565b63ffffffff16866137fc83600261590d565b8151811061380c5761380c61570a565b016020015160f81c901b91909117906001016137cb565b5063ffffffff811660031461384a5760405162461bcd60e51b815260040161054290615c50565b5f805b602081101561389f5761386181601f6159cb565b61386c906008615942565b8761387883600661590d565b815181106138885761388861570a565b016020015160f81c901b919091179060010161384d565b505f866026815181106138b4576138b461570a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee28339815191529061ffff861610801590613920575061271061ffff861611155b61393c5760405162461bcd60e51b815260040161054290615cc2565b60028101546001600160401b0390811690851610156139b55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a185760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a7f5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8984614181565b90505f613a9582610a49565b90505f613aa289836141a4565b90506040518060600160405280613ab63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6c5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015613bbb57613b838160016159cb565b613b8e906008615942565b61ffff16858281518110613ba457613ba461570a565b016020015160f81c901b9190911790600101613b6f565b5061ffff811615613bde5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613c3957613bf58160036159cb565b613c00906008615942565b63ffffffff1686613c1283600261590d565b81518110613c2257613c2261570a565b016020015160f81c901b9190911790600101613be1565b5063ffffffff8116600514613c605760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015613cb557613c7781601f6159cb565b613c82906008615942565b87613c8e83600661590d565b81518110613c9e57613c9e61570a565b016020015160f81c901b9190911790600101613c63565b505f805b6008811015613d1457613ccd8160076159cb565b613cd8906008615942565b6001600160401b031688613ced83602661590d565b81518110613cfd57613cfd61570a565b016020015160f81c901b9190911790600101613cb9565b5090969095509350505050565b5f80516020615f228339815191525f6001600160401b038084169085161115613d5557613d4e8385615575565b9050613d62565b613d5f8484615575565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc4575060028401548151613dc0916001600160401b03169061590d565b8210155b15613dea576001600160401b038316606082015281815260408101516020820152613e09565b8281606001818151613dfc91906159ab565b6001600160401b03169052505b6060810151613e19906064615c97565b602082015160028601546001600160401b039290921691613e449190600160401b900460ff16615942565b1015613ea85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec3919061590d565b9052506040810180516001600160401b0387169190613ee39083906159cb565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f628339815191526020526040812060020180545f80516020615f2283398151915291600160401b9091046001600160401b0316906008613f7983615d0d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400857604051631afcd79f60e31b815260040160405180910390fd5b565b614012613fbf565b61401b81614709565b614023614722565b61407e608082013560a083013561404060e0850160c086016153e8565b614051610100860160e08701615d28565b61ffff1661406761012087016101008801615d41565b614079610140880161012089016156aa565b614732565b50565b614089613fbf565b5f80516020615ec28339815191526001600160a01b0382166141025760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614976565b5f610a59825f80516020615ec2833981519152546001600160a01b0316906149d7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f228339815191524261424e60408601602087016153e8565b6001600160401b0316116142c05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d060408501602086016153e8565b6001600160401b03166142e66202a3004261590d565b116143595760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e05760405162461bcd60e51b815260040161054290615865565b60306143ef6040860186615d61565b9050146144545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61445e835f613d21565b5f806144f86040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a391906153e8565b6001600160401b031681526020016144be60408a018a615d61565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b39565b5f828152600786016020526040902091935091506145168282615de7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145439085906004016155ce565b6020604051808303815f875af115801561455f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145839190615595565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fb576145fb615421565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146db918e01908e016153e8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614711613fbf565b614719614ee8565b61407e81614ef0565b61472a613fbf565b614008615092565b61473a613fbf565b5f80516020615ee2833981519152836147a65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147c85760405162461bcd60e51b815260040161054290615cc2565b858711156148305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff161161489d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff8416111561490f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61498a6001600160a01b0384168361509a565b905080515f141580156149ae5750808060200190518101906149ac9190615ea6565b155b15611fd957604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a419190615595565b9050614a586001600160a01b0385163330866150a7565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac09190615595565b9050818111614b265760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3082826159cb565b95945050505050565b5f6060826080015151603014614ba35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1a57614bda8160016159cb565b614be5906008615942565b5081515f90839083908110614bfc57614bfc61570a565b60200101906001600160f81b03191690815f1a905350600101614bc6565b505f5b6004811015614c8257614c318160036159cb565b614c3c906008615942565b600160ff919091161c60f81b82614c5483600261590d565b81518110614c6457614c6461570a565b60200101906001600160f81b03191690815f1a905350600101614c1d565b505f5b6020811015614cdf5784518160208110614ca157614ca161570a565b1a60f81b82614cb183600661590d565b81518110614cc157614cc161570a565b60200101906001600160f81b03191690815f1a905350600101614c85565b505f5b6020811015614d3f5784602001518160208110614d0157614d0161570a565b1a60f81b82614d1183602661590d565b81518110614d2157614d2161570a565b60200101906001600160f81b03191690815f1a905350600101614ce2565b505f5b6008811015614db357614d568160076159cb565b614d61906008615942565b60ff1685604001516001600160401b0316901c60f81b82826046614d85919061590d565b81518110614d9557614d9561570a565b60200101906001600160f81b03191690815f1a905350600101614d42565b505f5b6030811015614e1e5784608001518181518110614dd557614dd561570a565b01602001516001600160f81b03191682614df083604e61590d565b81518110614e0057614e0061570a565b60200101906001600160f81b03191690815f1a905350600101614db6565b505f5b6008811015614e9057614e358160076159cb565b614e40906008615942565b60608601516001600160401b0390811691161c60f81b82614e6283607e61590d565b81518110614e7257614e7261570a565b60200101906001600160f81b03191690815f1a905350600101614e21565b50600281604051614ea191906158fc565b602060405180830381855afa158015614ebc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614edf9190615595565b94909350915050565b614008613fbf565b614ef8613fbf565b80355f80516020615f2283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f446080840160608501615d41565b60ff161115614fb15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc26080840160608501615d41565b60ff161161502a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61503a6080830160608401615d41565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506b60608301604084016153e8565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613366613fbf565b60606126ee83835f6150e0565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd9060840161414f565b6060814710156151055760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b0316848660405161512091906158fc565b5f6040518083038185875af1925050503d805f811461515a576040519150601f19603f3d011682016040523d82523d5f602084013e61515f565b606091505b509150915061236d86838360608261517f5761517a826151c6565b6126ee565b815115801561519657506001600160a01b0384163b155b156151bf57604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126ee565b8051156151d65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fb906159de565b5f825580601f1061520a575050565b601f0160209004905f5260205f209081019061407e9190615262565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615276575f8155600101615263565b5090565b801515811461407e575f80fd5b803563ffffffff8116811461529a575f80fd5b919050565b5f805f606084860312156152b1575f80fd5b8335925060208401356152c38161527a565b91506152d160408501615287565b90509250925092565b5f602082840312156152ea575f80fd5b5035919050565b6001600160a01b038116811461407e575f80fd5b5f80828403610160811215615318575f80fd5b61014080821215615327575f80fd5b8493508301359050615338816152f1565b809150509250929050565b5f60208284031215615353575f80fd5b6126ee82615287565b5f806040838503121561536d575f80fd5b61537683615287565b946020939093013593505050565b5f8060408385031215615395575f80fd5b82356001600160401b038111156153aa575f80fd5b8301608081860312156153bb575f80fd5b91506153c960208401615287565b90509250929050565b80356001600160401b038116811461529a575f80fd5b5f602082840312156153f8575f80fd5b6126ee826153d2565b5f8060408385031215615412575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549360608401826001600160401b03169052565b5060808301516154ae60808401826001600160401b03169052565b5060a08301516154c960a08401826001600160401b03169052565b5060c08301516154e460c08401826001600160401b03169052565b5092915050565b803561ffff8116811461529a575f80fd5b5f805f806080858703121561550f575f80fd5b84356001600160401b03811115615524575f80fd5b850160608188031215615535575f80fd5b9350615543602086016154eb565b9250615551604086016153d2565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e4576154e4615561565b5f602082840312156155a5575f80fd5b5051919050565b5f5b838110156155c65781810151838201526020016155ae565b50505f910152565b602081525f82518060208401526155ec8160408501602087016155ac565b601f01601f19169190910160400192915050565b5f8261561a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156ba575f80fd5b81356126ee816152f1565b5f808335601e198436030181126156da575f80fd5b8301803591506001600160401b038211156156f3575f80fd5b6020019150600581901b36038213156124c7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615732575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157725761577261573c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a0576157a061573c565b604052919050565b5f6001600160401b038211156157c0576157c061573c565b50601f01601f191660200190565b5f606082360312156157de575f80fd5b6157e6615750565b8235815260206157f78185016153d2565b8183015260408401356001600160401b03811115615813575f80fd5b840136601f820112615823575f80fd5b8035615836615831826157a8565b615778565b8181523684838501011115615849575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158be818460208a016155ac565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ee8160288401602088016155ac565b016028019695505050505050565b5f82516157328184602087016155ac565b80820180821115610a5957610a59615561565b5f63ffffffff80831681810361593857615938615561565b6001019392505050565b8082028115828204841417610a5957610a59615561565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e4576154e4615561565b81810381811115610a5957610a59615561565b600181811c908216806159f257607f821691505b602082108103615a1057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6f816159de565b806020870152604060018084165f8114615a905760018114615aac57615ad9565b60ff19851660408a0152604084151560051b8a01019550615ad9565b895f5260205f205f5b85811015615ad05781548b8201860152908301908801615ab5565b8a016040019650505b509398975050505050505050565b805161529a8161527a565b5f8060408385031215615b03575f80fd5b82516001600160401b0380821115615b19575f80fd5b9084019060608287031215615b2c575f80fd5b615b34615750565b82518152602080840151615b47816152f1565b82820152604084015183811115615b5c575f80fd5b80850194505087601f850112615b70575f80fd5b83519250615b80615831846157a8565b8381528882858701011115615b93575f80fd5b615ba2848383018488016155ac565b80604084015250819550615bb7818801615ae7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cba57615cba615561565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593857615938615561565b5f60208284031215615d38575f80fd5b6126ee826154eb565b5f60208284031215615d51575f80fd5b813560ff811681146126ee575f80fd5b5f808335601e19843603018112615d76575f80fd5b8301803591506001600160401b03821115615d8f575f80fd5b6020019150368190038213156124c7575f80fd5b601f821115611fd957805f5260205f20601f840160051c81016020851015615dc85750805b601f840160051c820191505b81811015610bd7575f8155600101615dd4565b81516001600160401b03811115615e0057615e0061573c565b615e1481615e0e84546159de565b84615da3565b602080601f831160018114615e47575f8415615e305750858301515b5f19600386901b1c1916600185901b178555615e9e565b5f85815260208120601f198616915b82811015615e7557888601518255948401946001909101908401615e56565b5085821015615e9257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb6575f80fd5b81516126ee8161527a56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index de6df87d5..4ce5754f9 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d98380380615d9883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4b8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ff9565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615034565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615034565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504b565b610b90565b348015610286575f80fd5b5061029a610295366004615034565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615089565b610c83565b34801561032a575f80fd5b506101b86103393660046150dd565b610cb7565b348015610349575f80fd5b506101b86103583660046150f6565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511e565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461516c565b611560565b3480156103cf575f80fd5b5061029a6103de366004615034565b611579565b3480156103ee575f80fd5b506101b86103fd366004614ff9565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615034565b6117ca565b348015610440575f80fd5b506101b861044f3660046150f6565b6118d0565b34801561045f575f80fd5b506101b861046e3660046150dd565b611bd9565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615034565b611d91565b3480156104b7575f80fd5b506101b86104c6366004615034565b612017565b6102236104d9366004615034565b61212b565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615034565b61215c565b60405161022d9190615199565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b9f833981519152949193919290829060ff16600481111561059c5761059c615185565b60048111156105ad576105ad615185565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361215c565b905060028251600481111561064057610640615185565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615bbf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615bbf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f90600290600581111561071357610713615185565b0361076a57861561072b576107288487612224565b90505b5f836060015183608001516107409190615263565b905061074c85826124c0565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108729190615283565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b1615185565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff166005811115610a2457610a24615185565b6005811115610a3557610a35615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa4615185565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612617565b6040518263ffffffff1660e01b8152600401610b4a91906152bc565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a9190615283565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361283c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a51000836152ee565b92915050565b5f610c8c612850565b610c9884848434612887565b9050610cb060015f80516020615bff83398151915255565b9392505050565b5f80516020615b9f8339815191525f80610cd084612b04565b91509150610cdd82612e4e565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d15615185565b03610d3a575f83815260088501602052604081208054919055610d388282612e89565b505b610d5081610d4b8460400151611560565b612eef565b5050505050565b5f80516020615b9f8339815191525f610d6f84612f02565b90505f80610d8083604001516130dc565b50915091505f610d8f8361215c565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b81526004016106899061530d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b81526004016106899061534f565b60015f87815260068701602052604090205460ff166004811115610e3257610e32615185565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bdf8339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110309190615283565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153ac565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153c7565b91505f90508435602086013560146111416060890160408a016153ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153c7565b8363ffffffff168181106111d7576111d761540c565b90506020028101906111e99190615420565b6111f2906154d0565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615567565b84825f01518360200151846040015160405160200161124794939291906155af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129591906155fe565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d39190615283565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f615185565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161141291168661560f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615622565b90506111a5565b50600584018190555f61148286612f02565b90505f6114928260400151613317565b9050806002856040516114a591906155fe565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e39190615283565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615644565b5f6115838261215c565b6080015192915050565b5f80516020615b9f8339815191525f6115a585613480565b90506115b085612e4e565b15610d50575f8581526005830160205260409020546001600160a01b031633146115ec5760405162461bcd60e51b81526004016106899061565b565b5f85815260058301602052604090205460a082015161161b91600160b01b90046001600160401b0316906156ad565b6001600160401b03168160c001516001600160401b0316101561169c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f6116ad8685612224565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170490611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179e9190615283565b5f878152600885016020526040812080549091906117bd90849061560f565b9091555050505050505050565b5f80516020615b9f8339815191525f6117e28361215c565b90506004815160058111156117f9576117f9615185565b146118635760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b0316331461189a5760405162461bcd60e51b81526004016106899061565b565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612e89565b6118d8612850565b5f80516020615b9f8339815191525f6118f084612f02565b90505f8061190183604001516130dc565b50915091505f6119108361215c565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194a5761194a615185565b600481111561195b5761195b615185565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a3f5760405162461bcd60e51b81526004016106899061530d565b826001600160401b03168160e001516001600160401b03161115611a755760405162461bcd60e51b81526004016106899061534f565b600381516004811115611a8a57611a8a615185565b14611ade5760405162461bcd60e51b815260206004820152603160248201525f80516020615bbf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b1f90600160a01b900461ffff1684615644565b611b2991906152ee565b905080886008015f8881526020019081526020015f205f828254611b4d919061560f565b90915550506020830151611b6a90611b6583856156cd565b612e89565b611b7f8360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd560015f80516020615bff83398151915255565b5050565b5f80516020615bdf8339815191525f611bf183612f02565b90505f80611c0283604001516136fb565b9150915080611c645760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c7e906156e0565b9050118015611cb0575060015f83815260088601602052604090205460ff166005811115611cae57611cae615185565b145b611ccc5760405162461bcd60e51b815260040161068990615712565b5f8281526007850160205260408120611ce491614f4e565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b9f83398151915293929190829060ff166004811115611df257611df2615185565b6004811115611e0357611e03615185565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8a57611e8a615185565b1480611ea85750600381516004811115611ea657611ea6615185565b145b611efc5760405162461bcd60e51b815260206004820152603260248201525f80516020615bbf833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f0a826040015161215c565b905080606001516001600160401b03165f03611f8e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fbb846040015184606001518560800151612617565b6040518263ffffffff1660e01b8152600401611fd791906152bc565b6020604051808303815f875af1158015611ff3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d509190615283565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bdf83398151915292919061205f906156e0565b9050118015612091575060015f83815260088301602052604090205460ff16600581111561208f5761208f615185565b145b6120ad5760405162461bcd60e51b815260040161068990615712565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e69190600401615759565b6020604051808303815f875af1158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121269190615283565b505050565b5f612134612850565b61213f82333461389c565b905061215760015f80516020615bff83398151915255565b919050565b612164614f85565b5f8281525f80516020615c1f833981519152602052604090819020815160e0810190925280545f80516020615bdf833981519152929190829060ff1660058111156121b1576121b1615185565b60058111156121c2576121c2615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561226f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229691908101906157ee565b91509150806122f95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123609190615283565b8251146123c45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561243a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124498460400151613c53565b915091508187146124b65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615c1f833981519152602052604081206002015481905f80516020615bdf83398151915290600160801b90046001600160401b03166125088582613e2b565b5f61251287614039565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125628a858b612617565b6040518263ffffffff1660e01b815260040161257e91906152bc565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190615283565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612690576126508160016156cd565b61265b906008615644565b5081515f908390839081106126725761267261540c565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b60048110156126fb576126a78160036156cd565b6126b2906008615644565b600263ffffffff16901c60f81b828260026126cd919061560f565b815181106126dd576126dd61540c565b60200101906001600160f81b03191690815f1a905350600101612693565b505f5b602081101561275d5761271281601f6156cd565b61271d906008615644565b86901c60f81b8261272f83600661560f565b8151811061273f5761273f61540c565b60200101906001600160f81b03191690815f1a9053506001016126fe565b505f5b60088110156127c8576127748160076156cd565b61277f906008615644565b6001600160401b038616901c60f81b8261279a83602661560f565b815181106127aa576127aa61540c565b60200101906001600160f81b03191690815f1a905350600101612760565b505f5b6008811015612833576127df8160076156cd565b6127ea906008615644565b6001600160401b038516901c60f81b8261280583602e61560f565b815181106128155761281561540c565b60200101906001600160f81b03191690815f1a9053506001016127cb565b50949350505050565b6128446140c9565b61284d81614114565b50565b5f80516020615bff83398151915280546001190161288157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b9f8339815191529061ffff8616108015906128d3575061271061ffff861611155b6128ef5760405162461bcd60e51b8152600401610689906158c0565b60028101546001600160401b0390811690851610156129685760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129cb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a325760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a3d82610c6d565b90505f612a4a8983614188565b90506040518060600160405280612a5e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bff83398151915255565b5f612b0d614f85565b5f80516020615bdf8339815191525f612b2585612f02565b90505f80612b3683604001516136fb565b915091508015612b9b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcc57612bcc615185565b6005811115612bdd57612bdd615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4e57612c4e615185565b1480612c6c5750600182516005811115612c6a57612c6a615185565b145b612ccb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612ce057612ce0615185565b03612ced57506004612cf1565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1a57612d1a615185565b90816005811115612d2d57612d2d615185565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6157612d61615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1557612e15615185565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed5575f80fd5b505af1158015612ee7573d5f803e3d5ffd5b505050505050565b611bd56001600160a01b038316826146ed565b60408051606080820183525f8083526020830181905292820152905f80516020615bdf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f77573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9e91908101906157ee565b9150915080612ffe5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130615760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131005760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561314f576131178160016156cd565b613122906008615644565b61ffff168682815181106131385761313861540c565b016020015160f81c901b9190911790600101613103565b5061ffff8116156131725760405162461bcd60e51b815260040161068990615954565b5f805b60048110156131cd576131898160036156cd565b613194906008615644565b63ffffffff16876131a683600261560f565b815181106131b6576131b661540c565b016020015160f81c901b9190911790600101613175565b5063ffffffff81166004146131f45760405162461bcd60e51b815260040161068990615997565b5f805b60208110156132495761320b81601f6156cd565b613216906008615644565b8861322283600661560f565b815181106132325761323261540c565b016020015160f81c901b91909117906001016131f7565b505f805b60088110156132a8576132618160076156cd565b61326c906008615644565b6001600160401b03168961328183602661560f565b815181106132915761329161540c565b016020015160f81c901b919091179060010161324d565b505f805b6008811015613307576132c08160076156cd565b6132cb906008615644565b6001600160401b03168a6132e083602e61560f565b815181106132f0576132f061540c565b016020015160f81c901b91909117906001016132ac565b5091989097509095509350505050565b5f81516026146133395760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613388576133508160016156cd565b61335b906008615644565b61ffff168482815181106133715761337161540c565b016020015160f81c901b919091179060010161333c565b5061ffff8116156133ab5760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613406576133c28160036156cd565b6133cd906008615644565b63ffffffff16856133df83600261560f565b815181106133ef576133ef61540c565b016020015160f81c901b91909117906001016133ae565b5063ffffffff81161561342b5760405162461bcd60e51b815260040161068990615997565b5f805b60208110156128335761344281601f6156cd565b61344d906008615644565b8661345983600661560f565b815181106134695761346961540c565b016020015160f81c901b919091179060010161342e565b613488614f85565b5f8281525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff1660058111156134d5576134d5615185565b60058111156134e6576134e6615185565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355857613558615185565b146135b45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f8576135f8615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a485826124c0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371e5760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561376d576137358160016156cd565b613740906008615644565b61ffff168582815181106137565761375661540c565b016020015160f81c901b9190911790600101613721565b5061ffff8116156137905760405162461bcd60e51b815260040161068990615954565b5f805b60048110156137eb576137a78160036156cd565b6137b2906008615644565b63ffffffff16866137c483600261560f565b815181106137d4576137d461540c565b016020015160f81c901b9190911790600101613793565b5063ffffffff81166003146138125760405162461bcd60e51b815260040161068990615997565b5f805b60208110156138675761382981601f6156cd565b613834906008615644565b8761384083600661560f565b815181106138505761385061540c565b016020015160f81c901b9190911790600101613815565b505f8660268151811061387c5761387c61540c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b9f833981519152816138b584610c6d565b90505f6138c18761215c565b90506138cc87612e4e565b6139295760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b60028151600581111561393e5761393e615185565b1461399d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139ae91906156ad565b600485015460408401519192506139d0916001600160401b03909116906159de565b6001600160401b0316816001600160401b03161115613a4f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a5b8a846124c0565b915091505f8a83604051602001613a8992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2457613b24615185565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c765760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613cc557613c8d8160016156cd565b613c98906008615644565b61ffff16858281518110613cae57613cae61540c565b016020015160f81c901b9190911790600101613c79565b5061ffff811615613ce85760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613d4357613cff8160036156cd565b613d0a906008615644565b63ffffffff1686613d1c83600261560f565b81518110613d2c57613d2c61540c565b016020015160f81c901b9190911790600101613ceb565b5063ffffffff8116600514613d6a5760405162461bcd60e51b815260040161068990615997565b5f805b6020811015613dbf57613d8181601f6156cd565b613d8c906008615644565b87613d9883600661560f565b81518110613da857613da861540c565b016020015160f81c901b9190911790600101613d6d565b505f805b6008811015613e1e57613dd78160076156cd565b613de2906008615644565b6001600160401b031688613df783602661560f565b81518110613e0757613e0761540c565b016020015160f81c901b9190911790600101613dc3565b5090969095509350505050565b5f80516020615bdf8339815191525f6001600160401b038084169085161115613e5f57613e588385615263565b9050613e6c565b613e698484615263565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ece575060028401548151613eca916001600160401b03169061560f565b8210155b15613ef4576001600160401b038316606082015281815260408101516020820152613f13565b8281606001818151613f0691906156ad565b6001600160401b03169052505b6060810151613f239060646159de565b602082015160028601546001600160401b039290921691613f4e9190600160401b900460ff16615644565b1015613fb25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fcd919061560f565b9052506040810180516001600160401b0387169190613fed9083906156cd565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c1f8339815191526020526040812060020180545f80516020615bdf83398151915291600160401b9091046001600160401b031690600861408383615a09565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411257604051631afcd79f60e31b815260040160405180910390fd5b565b61411c6140c9565b61412581614780565b61412d614799565b61284d608082013560a083013561414a60e0850160c0860161516c565b61415b610100860160e08701615a24565b61ffff1661417161012087016101008801615a3d565b614183610140880161012089016153ac565b6147a9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142135760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bdf83398151915242614232604086016020870161516c565b6001600160401b0316116142a45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142b4604085016020860161516c565b6001600160401b03166142ca6202a3004261560f565b1161433d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143955760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143c45760405162461bcd60e51b815260040161068990615567565b60306143d36040860186615a5d565b9050146144385760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614442835f613e2b565b5f806144dc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614487919061516c565b6001600160401b031681526020016144a260408a018a615a5d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ed565b5f828152600786016020526040902091935091506144fa8282615ae3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145279085906004016152bc565b6020604051808303815f875af1158015614543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145679190615283565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145df576145df615185565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146bf918e01908e0161516c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147105760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614759576040519150601f19603f3d011682016040523d82523d5f602084013e61475e565b606091505b505090508061212657604051630a12f52160e11b815260040160405180910390fd5b6147886140c9565b614790614d9c565b61284d81614da4565b6147a16140c9565b614112614f46565b6147b16140c9565b5f80516020615b9f8339815191528361481d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b61271084111561483f5760405162461bcd60e51b8152600401610689906158c0565b858711156148a75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149145760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149865760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a575760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ace57614a8e8160016156cd565b614a99906008615644565b5081515f90839083908110614ab057614ab061540c565b60200101906001600160f81b03191690815f1a905350600101614a7a565b505f5b6004811015614b3657614ae58160036156cd565b614af0906008615644565b600160ff919091161c60f81b82614b0883600261560f565b81518110614b1857614b1861540c565b60200101906001600160f81b03191690815f1a905350600101614ad1565b505f5b6020811015614b935784518160208110614b5557614b5561540c565b1a60f81b82614b6583600661560f565b81518110614b7557614b7561540c565b60200101906001600160f81b03191690815f1a905350600101614b39565b505f5b6020811015614bf35784602001518160208110614bb557614bb561540c565b1a60f81b82614bc583602661560f565b81518110614bd557614bd561540c565b60200101906001600160f81b03191690815f1a905350600101614b96565b505f5b6008811015614c6757614c0a8160076156cd565b614c15906008615644565b60ff1685604001516001600160401b0316901c60f81b82826046614c39919061560f565b81518110614c4957614c4961540c565b60200101906001600160f81b03191690815f1a905350600101614bf6565b505f5b6030811015614cd25784608001518181518110614c8957614c8961540c565b01602001516001600160f81b03191682614ca483604e61560f565b81518110614cb457614cb461540c565b60200101906001600160f81b03191690815f1a905350600101614c6a565b505f5b6008811015614d4457614ce98160076156cd565b614cf4906008615644565b60608601516001600160401b0390811691161c60f81b82614d1683607e61560f565b81518110614d2657614d2661540c565b60200101906001600160f81b03191690815f1a905350600101614cd5565b50600281604051614d5591906155fe565b602060405180830381855afa158015614d70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d939190615283565b94909350915050565b6141126140c9565b614dac6140c9565b80355f80516020615bdf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df86080840160608501615a3d565b60ff161115614e655760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e766080840160608501615a3d565b60ff1611614ede5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614eee6080830160608401615a3d565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f1f606083016040840161516c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af16140c9565b508054614f5a906156e0565b5f825580601f10614f69575050565b601f0160209004905f5260205f209081019061284d9190614fc1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd5575f8155600101614fc2565b5090565b801515811461284d575f80fd5b803563ffffffff81168114612157575f80fd5b5f805f6060848603121561500b575f80fd5b83359250602084013561501d81614fd9565b915061502b60408501614fe6565b90509250925092565b5f60208284031215615044575f80fd5b5035919050565b5f610140828403121561505c575f80fd5b50919050565b803561ffff81168114612157575f80fd5b80356001600160401b0381168114612157575f80fd5b5f805f6060848603121561509b575f80fd5b83356001600160401b038111156150b0575f80fd5b8401606081870312156150c1575f80fd5b92506150cf60208501615062565b915061502b60408501615073565b5f602082840312156150ed575f80fd5b610cb082614fe6565b5f8060408385031215615107575f80fd5b61511083614fe6565b946020939093013593505050565b5f806040838503121561512f575f80fd5b82356001600160401b03811115615144575f80fd5b830160808186031215615155575f80fd5b915061516360208401614fe6565b90509250929050565b5f6020828403121561517c575f80fd5b610cb082615073565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f760608401826001600160401b03169052565b50608083015161521260808401826001600160401b03169052565b5060a083015161522d60a08401826001600160401b03169052565b5060c083015161524860c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152485761524861524f565b5f60208284031215615293575f80fd5b5051919050565b5f5b838110156152b457818101518382015260200161529c565b50505f910152565b602081525f82518060208401526152da81604085016020870161529a565b601f01601f19169190910160400192915050565b5f8261530857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284d575f80fd5b5f602082840312156153bc575f80fd5b8135610cb081615398565b5f808335601e198436030181126153dc575f80fd5b8301803591506001600160401b038211156153f5575f80fd5b6020019150600581901b3603821315612610575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615434575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154745761547461543e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a2576154a261543e565b604052919050565b5f6001600160401b038211156154c2576154c261543e565b50601f01601f191660200190565b5f606082360312156154e0575f80fd5b6154e8615452565b8235815260206154f9818501615073565b8183015260408401356001600160401b03811115615515575f80fd5b840136601f820112615525575f80fd5b8035615538615533826154aa565b61547a565b818152368483850101111561554b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c0818460208a0161529a565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f081602884016020880161529a565b016028019695505050505050565b5f825161543481846020870161529a565b80820180821115610c7d57610c7d61524f565b5f63ffffffff80831681810361563a5761563a61524f565b6001019392505050565b8082028115828204841417610c7d57610c7d61524f565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156152485761524861524f565b81810381811115610c7d57610c7d61524f565b600181811c908216806156f457607f821691505b60208210810361505c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576b816156e0565b806020870152604060018084165f811461578c57600181146157a8576157d5565b60ff19851660408a0152604084151560051b8a010195506157d5565b895f5260205f205f5b858110156157cc5781548b82018601529083019088016157b1565b8a016040019650505b509398975050505050505050565b805161215781614fd9565b5f80604083850312156157ff575f80fd5b82516001600160401b0380821115615815575f80fd5b9084019060608287031215615828575f80fd5b615830615452565b8251815260208084015161584381615398565b82820152604084015183811115615858575f80fd5b80850194505087601f85011261586c575f80fd5b8351925061587c615533846154aa565b838152888285870101111561588f575f80fd5b61589e8483830184880161529a565b806040840152508195506158b38188016157e3565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0157615a0161524f565b505092915050565b5f6001600160401b0380831681810361563a5761563a61524f565b5f60208284031215615a34575f80fd5b610cb082615062565b5f60208284031215615a4d575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a72575f80fd5b8301803591506001600160401b03821115615a8b575f80fd5b602001915036819003821315612610575f80fd5b601f82111561212657805f5260205f20601f840160051c81016020851015615ac45750805b601f840160051c820191505b81811015610d50575f8155600101615ad0565b81516001600160401b03811115615afc57615afc61543e565b615b1081615b0a84546156e0565b84615a9f565b602080601f831160018114615b43575f8415615b2c5750858301515b5f19600386901b1c1916600185901b178555612ee7565b5f85815260208120601f198616915b82811015615b7157888601518255948401946001909101908401615b52565b5085821015615b8e57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d99380380615d9983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ffa565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615035565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615035565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504c565b610b91565b348015610286575f80fd5b5061029a610295366004615035565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a36600461508a565b610c84565b34801561032a575f80fd5b506101b86103393660046150de565b610cb8565b348015610349575f80fd5b506101b86103583660046150f7565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511f565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461516d565b611561565b3480156103cf575f80fd5b5061029a6103de366004615035565b61157a565b3480156103ee575f80fd5b506101b86103fd366004614ffa565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615035565b6117cb565b348015610440575f80fd5b506101b861044f3660046150f7565b6118d1565b34801561045f575f80fd5b506101b861046e3660046150de565b611bda565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615035565b611d92565b3480156104b7575f80fd5b506101b86104c6366004615035565b612018565b6102236104d9366004615035565b61212c565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615035565b61215d565b60405161022d919061519a565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff16600481111561059557610595615186565b60048111156105a6576105a6615186565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261215d565b905060028351600481111561064157610641615186565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f90600290600581111561071457610714615186565b0361076b57861561072c576107298387612225565b90505b5f846060015183608001516107419190615264565b905061074d84826124c1565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108739190615284565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b2615186565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff166005811115610a2557610a25615186565b6005811115610a3657610a36615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa5615186565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612618565b6040518263ffffffff1660e01b8152600401610b4b91906152bd565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b9190615284565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361283d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152ef565b92915050565b5f610c8d612851565b610c9984848434612888565b9050610cb160015f80516020615c0083398151915255565b9392505050565b5f80516020615ba08339815191525f80610cd184612b05565b91509150610cde82612e4f565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d16615186565b03610d3b575f83815260088501602052604081208054919055610d398282612e8a565b505b610d5181610d4c8460400151611561565b612ef0565b5050505050565b5f80516020615ba08339815191525f610d7084612f03565b90505f80610d8183604001516130dd565b50915091505f610d908361215d565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061530e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615350565b60015f87815260068701602052604090205460ff166004811115610e3357610e33615186565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be08339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110319190615284565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ad565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153c8565b91505f90508435602086013560146111426060890160408a016153ad565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153c8565b8363ffffffff168181106111d8576111d861540d565b90506020028101906111ea9190615421565b6111f3906154d1565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615568565b84825f01518360200151846040015160405160200161124894939291906155b0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129691906155ff565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d49190615284565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561136057611360615186565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615610565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615623565b90506111a6565b50600584018190555f61148386612f03565b90505f6114938260400151613318565b9050806002856040516114a691906155ff565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e49190615284565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615645565b5f6115848261215d565b6080015192915050565b5f80516020615ba08339815191525f6115a685613481565b90506115b185612e4f565b15610d51575f8581526005830160205260409020546001600160a01b031633146115ed5760405162461bcd60e51b815260040161068a9061565c565b5f85815260058301602052604090205460a082015161161c91600160b01b90046001600160401b0316906156ae565b6001600160401b03168160c001516001600160401b0316101561169d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116ae8685612225565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170590611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179f9190615284565b5f878152600885016020526040812080549091906117be908490615610565b9091555050505050505050565b5f80516020615ba08339815191525f6117e38361215d565b90506004815160058111156117fa576117fa615186565b146118645760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b0316331461189b5760405162461bcd60e51b815260040161068a9061565c565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e8a565b6118d9612851565b5f80516020615ba08339815191525f6118f184612f03565b90505f8061190283604001516130dd565b50915091505f6119118361215d565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194b5761194b615186565b600481111561195c5761195c615186565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a405760405162461bcd60e51b815260040161068a9061530e565b826001600160401b03168160e001516001600160401b03161115611a765760405162461bcd60e51b815260040161068a90615350565b600381516004811115611a8b57611a8b615186565b14611adf5760405162461bcd60e51b815260206004820152603160248201525f80516020615bc08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2090600160a01b900461ffff1684615645565b611b2a91906152ef565b905080886008015f8881526020019081526020015f205f828254611b4e9190615610565b90915550506020830151611b6b90611b6683856156ce565b612e8a565b611b808360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd660015f80516020615c0083398151915255565b5050565b5f80516020615be08339815191525f611bf283612f03565b90505f80611c0383604001516136fc565b9150915080611c655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c7f906156e1565b9050118015611cb1575060015f83815260088601602052604090205460ff166005811115611caf57611caf615186565b145b611ccd5760405162461bcd60e51b815260040161068a90615713565b5f8281526007850160205260408120611ce591614f4f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff166004811115611df357611df3615186565b6004811115611e0457611e04615186565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8b57611e8b615186565b1480611ea95750600381516004811115611ea757611ea7615186565b145b611efd5760405162461bcd60e51b815260206004820152603260248201525f80516020615bc0833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f0b826040015161215d565b905080606001516001600160401b03165f03611f8f5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fbc846040015184606001518560800151612618565b6040518263ffffffff1660e01b8152600401611fd891906152bd565b6020604051808303815f875af1158015611ff4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d519190615284565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be0833981519152929190612060906156e1565b9050118015612092575060015f83815260088301602052604090205460ff16600581111561209057612090615186565b145b6120ae5760405162461bcd60e51b815260040161068a90615713565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e7919060040161575a565b6020604051808303815f875af1158015612103573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121279190615284565b505050565b5f612135612851565b61214082333461389d565b905061215860015f80516020615c0083398151915255565b919050565b612165614f86565b5f8281525f80516020615c20833981519152602052604090819020815160e0810190925280545f80516020615be0833981519152929190829060ff1660058111156121b2576121b2615186565b60058111156121c3576121c3615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612270573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229791908101906157ef565b91509150806122fa5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123619190615284565b8251146123c55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561243b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061244a8460400151613c54565b915091508187146124b75760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c20833981519152602052604081206002015481905f80516020615be083398151915290600160801b90046001600160401b03166125098582613e2c565b5f6125138761403a565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125638a858b612618565b6040518263ffffffff1660e01b815260040161257f91906152bd565b6020604051808303815f875af115801561259b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bf9190615284565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612691576126518160016156ce565b61265c906008615645565b5081515f908390839081106126735761267361540d565b60200101906001600160f81b03191690815f1a90535060010161263d565b505f5b60048110156126fc576126a88160036156ce565b6126b3906008615645565b600263ffffffff16901c60f81b828260026126ce9190615610565b815181106126de576126de61540d565b60200101906001600160f81b03191690815f1a905350600101612694565b505f5b602081101561275e5761271381601f6156ce565b61271e906008615645565b86901c60f81b82612730836006615610565b815181106127405761274061540d565b60200101906001600160f81b03191690815f1a9053506001016126ff565b505f5b60088110156127c9576127758160076156ce565b612780906008615645565b6001600160401b038616901c60f81b8261279b836026615610565b815181106127ab576127ab61540d565b60200101906001600160f81b03191690815f1a905350600101612761565b505f5b6008811015612834576127e08160076156ce565b6127eb906008615645565b6001600160401b038516901c60f81b8261280683602e615610565b815181106128165761281661540d565b60200101906001600160f81b03191690815f1a9053506001016127cc565b50949350505050565b6128456140ca565b61284e81614115565b50565b5f80516020615c0083398151915280546001190161288257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba08339815191529061ffff8616108015906128d4575061271061ffff861611155b6128f05760405162461bcd60e51b815260040161068a906158c1565b60028101546001600160401b0390811690851610156129695760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a335760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a3e82610c6e565b90505f612a4b8983614189565b90506040518060600160405280612a5f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0083398151915255565b5f612b0e614f86565b5f80516020615be08339815191525f612b2685612f03565b90505f80612b3783604001516136fc565b915091508015612b9c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcd57612bcd615186565b6005811115612bde57612bde615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4f57612c4f615186565b1480612c6d5750600182516005811115612c6b57612c6b615186565b145b612ccc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce157612ce1615186565b03612cee57506004612cf2565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1b57612d1b615186565b90816005811115612d2e57612d2e615186565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6257612d62615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1657612e16615186565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed6575f80fd5b505af1158015612ee8573d5f803e3d5ffd5b505050505050565b611bd66001600160a01b038316826146ee565b60408051606080820183525f8083526020830181905292820152905f80516020615be08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f78573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9f91908101906157ef565b9150915080612fff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130625760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130d55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131015760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613150576131188160016156ce565b613123906008615645565b61ffff168682815181106131395761313961540d565b016020015160f81c901b9190911790600101613104565b5061ffff8116156131735760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156131ce5761318a8160036156ce565b613195906008615645565b63ffffffff16876131a7836002615610565b815181106131b7576131b761540d565b016020015160f81c901b9190911790600101613176565b5063ffffffff81166004146131f55760405162461bcd60e51b815260040161068a90615998565b5f805b602081101561324a5761320c81601f6156ce565b613217906008615645565b88613223836006615610565b815181106132335761323361540d565b016020015160f81c901b91909117906001016131f8565b505f805b60088110156132a9576132628160076156ce565b61326d906008615645565b6001600160401b031689613282836026615610565b815181106132925761329261540d565b016020015160f81c901b919091179060010161324e565b505f805b6008811015613308576132c18160076156ce565b6132cc906008615645565b6001600160401b03168a6132e183602e615610565b815181106132f1576132f161540d565b016020015160f81c901b91909117906001016132ad565b5091989097509095509350505050565b5f815160261461333a5760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613389576133518160016156ce565b61335c906008615645565b61ffff168482815181106133725761337261540d565b016020015160f81c901b919091179060010161333d565b5061ffff8116156133ac5760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613407576133c38160036156ce565b6133ce906008615645565b63ffffffff16856133e0836002615610565b815181106133f0576133f061540d565b016020015160f81c901b91909117906001016133af565b5063ffffffff81161561342c5760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156128345761344381601f6156ce565b61344e906008615645565b8661345a836006615610565b8151811061346a5761346a61540d565b016020015160f81c901b919091179060010161342f565b613489614f86565b5f8281525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff1660058111156134d6576134d6615186565b60058111156134e7576134e7615186565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355957613559615186565b146135b55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f9576135f9615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a585826124c1565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371f5760405162461bcd60e51b815260040161068a9061590c565b5f805b600281101561376e576137368160016156ce565b613741906008615645565b61ffff168582815181106137575761375761540d565b016020015160f81c901b9190911790600101613722565b5061ffff8116156137915760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156137ec576137a88160036156ce565b6137b3906008615645565b63ffffffff16866137c5836002615610565b815181106137d5576137d561540d565b016020015160f81c901b9190911790600101613794565b5063ffffffff81166003146138135760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156138685761382a81601f6156ce565b613835906008615645565b87613841836006615610565b815181106138515761385161540d565b016020015160f81c901b9190911790600101613816565b505f8660268151811061387d5761387d61540d565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba0833981519152816138b684610c6e565b90505f6138c28761215d565b90506138cd87612e4f565b61392a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b60028151600581111561393f5761393f615186565b1461399e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139af91906156ae565b600485015460408401519192506139d1916001600160401b03909116906159df565b6001600160401b0316816001600160401b03161115613a505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a5c8a846124c1565b915091505f8a83604051602001613a8a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2557613b25615186565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c775760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613cc657613c8e8160016156ce565b613c99906008615645565b61ffff16858281518110613caf57613caf61540d565b016020015160f81c901b9190911790600101613c7a565b5061ffff811615613ce95760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613d4457613d008160036156ce565b613d0b906008615645565b63ffffffff1686613d1d836002615610565b81518110613d2d57613d2d61540d565b016020015160f81c901b9190911790600101613cec565b5063ffffffff8116600514613d6b5760405162461bcd60e51b815260040161068a90615998565b5f805b6020811015613dc057613d8281601f6156ce565b613d8d906008615645565b87613d99836006615610565b81518110613da957613da961540d565b016020015160f81c901b9190911790600101613d6e565b505f805b6008811015613e1f57613dd88160076156ce565b613de3906008615645565b6001600160401b031688613df8836026615610565b81518110613e0857613e0861540d565b016020015160f81c901b9190911790600101613dc4565b5090969095509350505050565b5f80516020615be08339815191525f6001600160401b038084169085161115613e6057613e598385615264565b9050613e6d565b613e6a8484615264565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ecf575060028401548151613ecb916001600160401b031690615610565b8210155b15613ef5576001600160401b038316606082015281815260408101516020820152613f14565b8281606001818151613f0791906156ae565b6001600160401b03169052505b6060810151613f249060646159df565b602082015160028601546001600160401b039290921691613f4f9190600160401b900460ff16615645565b1015613fb35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fce9190615610565b9052506040810180516001600160401b0387169190613fee9083906156ce565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c208339815191526020526040812060020180545f80516020615be083398151915291600160401b9091046001600160401b031690600861408483615a0a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411357604051631afcd79f60e31b815260040160405180910390fd5b565b61411d6140ca565b61412681614781565b61412e61479a565b61284e608082013560a083013561414b60e0850160c0860161516d565b61415c610100860160e08701615a25565b61ffff1661417261012087016101008801615a3e565b614184610140880161012089016153ad565b6147aa565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be083398151915242614233604086016020870161516d565b6001600160401b0316116142a55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142b5604085016020860161516d565b6001600160401b03166142cb6202a30042615610565b1161433e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143965760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143c55760405162461bcd60e51b815260040161068a90615568565b60306143d46040860186615a5e565b9050146144395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614443835f613e2c565b5f806144dd6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614488919061516d565b6001600160401b031681526020016144a360408a018a615a5e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ee565b5f828152600786016020526040902091935091506144fb8282615ae4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145289085906004016152bd565b6020604051808303815f875af1158015614544573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145689190615284565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e0576145e0615186565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c0918e01908e0161516d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147115760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461475a576040519150601f19603f3d011682016040523d82523d5f602084013e61475f565b606091505b505090508061212757604051630a12f52160e11b815260040160405180910390fd5b6147896140ca565b614791614d9d565b61284e81614da5565b6147a26140ca565b614113614f47565b6147b26140ca565b5f80516020615ba08339815191528361481e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148405760405162461bcd60e51b815260040161068a906158c1565b858711156148a85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149155760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149875760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614acf57614a8f8160016156ce565b614a9a906008615645565b5081515f90839083908110614ab157614ab161540d565b60200101906001600160f81b03191690815f1a905350600101614a7b565b505f5b6004811015614b3757614ae68160036156ce565b614af1906008615645565b600160ff919091161c60f81b82614b09836002615610565b81518110614b1957614b1961540d565b60200101906001600160f81b03191690815f1a905350600101614ad2565b505f5b6020811015614b945784518160208110614b5657614b5661540d565b1a60f81b82614b66836006615610565b81518110614b7657614b7661540d565b60200101906001600160f81b03191690815f1a905350600101614b3a565b505f5b6020811015614bf45784602001518160208110614bb657614bb661540d565b1a60f81b82614bc6836026615610565b81518110614bd657614bd661540d565b60200101906001600160f81b03191690815f1a905350600101614b97565b505f5b6008811015614c6857614c0b8160076156ce565b614c16906008615645565b60ff1685604001516001600160401b0316901c60f81b82826046614c3a9190615610565b81518110614c4a57614c4a61540d565b60200101906001600160f81b03191690815f1a905350600101614bf7565b505f5b6030811015614cd35784608001518181518110614c8a57614c8a61540d565b01602001516001600160f81b03191682614ca583604e615610565b81518110614cb557614cb561540d565b60200101906001600160f81b03191690815f1a905350600101614c6b565b505f5b6008811015614d4557614cea8160076156ce565b614cf5906008615645565b60608601516001600160401b0390811691161c60f81b82614d1783607e615610565b81518110614d2757614d2761540d565b60200101906001600160f81b03191690815f1a905350600101614cd6565b50600281604051614d5691906155ff565b602060405180830381855afa158015614d71573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d949190615284565b94909350915050565b6141136140ca565b614dad6140ca565b80355f80516020615be083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df96080840160608501615a3e565b60ff161115614e665760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e776080840160608501615a3e565b60ff1611614edf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614eef6080830160608401615a3e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f20606083016040840161516d565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af26140ca565b508054614f5b906156e1565b5f825580601f10614f6a575050565b601f0160209004905f5260205f209081019061284e9190614fc2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd6575f8155600101614fc3565b5090565b801515811461284e575f80fd5b803563ffffffff81168114612158575f80fd5b5f805f6060848603121561500c575f80fd5b83359250602084013561501e81614fda565b915061502c60408501614fe7565b90509250925092565b5f60208284031215615045575f80fd5b5035919050565b5f610140828403121561505d575f80fd5b50919050565b803561ffff81168114612158575f80fd5b80356001600160401b0381168114612158575f80fd5b5f805f6060848603121561509c575f80fd5b83356001600160401b038111156150b1575f80fd5b8401606081870312156150c2575f80fd5b92506150d060208501615063565b915061502c60408501615074565b5f602082840312156150ee575f80fd5b610cb182614fe7565b5f8060408385031215615108575f80fd5b61511183614fe7565b946020939093013593505050565b5f8060408385031215615130575f80fd5b82356001600160401b03811115615145575f80fd5b830160808186031215615156575f80fd5b915061516460208401614fe7565b90509250929050565b5f6020828403121561517d575f80fd5b610cb182615074565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f860608401826001600160401b03169052565b50608083015161521360808401826001600160401b03169052565b5060a083015161522e60a08401826001600160401b03169052565b5060c083015161524960c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524957615249615250565b5f60208284031215615294575f80fd5b5051919050565b5f5b838110156152b557818101518382015260200161529d565b50505f910152565b602081525f82518060208401526152db81604085016020870161529b565b601f01601f19169190910160400192915050565b5f8261530957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284e575f80fd5b5f602082840312156153bd575f80fd5b8135610cb181615399565b5f808335601e198436030181126153dd575f80fd5b8301803591506001600160401b038211156153f6575f80fd5b6020019150600581901b3603821315612611575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615435575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154755761547561543f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a3576154a361543f565b604052919050565b5f6001600160401b038211156154c3576154c361543f565b50601f01601f191660200190565b5f606082360312156154e1575f80fd5b6154e9615453565b8235815260206154fa818501615074565b8183015260408401356001600160401b03811115615516575f80fd5b840136601f820112615526575f80fd5b8035615539615534826154ab565b61547b565b818152368483850101111561554c575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c1818460208a0161529b565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f181602884016020880161529b565b016028019695505050505050565b5f825161543581846020870161529b565b80820180821115610c7e57610c7e615250565b5f63ffffffff80831681810361563b5761563b615250565b6001019392505050565b8082028115828204841417610c7e57610c7e615250565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524957615249615250565b81810381811115610c7e57610c7e615250565b600181811c908216806156f557607f821691505b60208210810361505d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576c816156e1565b806020870152604060018084165f811461578d57600181146157a9576157d6565b60ff19851660408a0152604084151560051b8a010195506157d6565b895f5260205f205f5b858110156157cd5781548b82018601529083019088016157b2565b8a016040019650505b509398975050505050505050565b805161215881614fda565b5f8060408385031215615800575f80fd5b82516001600160401b0380821115615816575f80fd5b9084019060608287031215615829575f80fd5b615831615453565b8251815260208084015161584481615399565b82820152604084015183811115615859575f80fd5b80850194505087601f85011261586d575f80fd5b8351925061587d615534846154ab565b8381528882858701011115615890575f80fd5b61589f8483830184880161529b565b806040840152508195506158b48188016157e4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0257615a02615250565b505092915050565b5f6001600160401b0380831681810361563b5761563b615250565b5f60208284031215615a35575f80fd5b610cb182615063565b5f60208284031215615a4e575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a73575f80fd5b8301803591506001600160401b03821115615a8c575f80fd5b602001915036819003821315612611575f80fd5b601f82111561212757805f5260205f20601f840160051c81016020851015615ac55750805b601f840160051c820191505b81811015610d51575f8155600101615ad1565b81516001600160401b03811115615afd57615afd61543f565b615b1181615b0b84546156e1565b84615aa0565b602080601f831160018114615b44575f8415615b2d5750858301515b5f19600386901b1c1916600185901b178555612ee8565b5f85815260208120601f198616915b82811015615b7257888601518255948401946001909101908401615b53565b5085821015615b8f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 56ac2c55e..8a7026f58 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -398,9 +398,9 @@ abstract contract PoSValidatorManager is uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - bytes32 validationID = $._delegatorStakes[delegationID].validationID; Delegator memory delegator = $._delegatorStakes[delegationID]; + bytes32 validationID = delegator.validationID; Validator memory validator = getValidator(validationID); // Ensure the delegator is active From 6b1e9c07b64fa22a0cab81d9078e5acc5b8c97f3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 10:05:48 -0400 Subject: [PATCH 34/36] Small fix --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6eaab5861..7d787d8c7 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160db3803806160db83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529f565b6103ec565b005b61019e6101ae3660046152da565b610890565b6101f16101c13660046152da565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152da565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615305565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615343565b610b3e565b61019e61029936600461535c565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615384565b610db3565b6101f16102dc3660046153e8565b6113e7565b6102316102ef3660046152da565b611400565b61019e61030236600461529f565b611414565b61020c603081565b61019e61031d3660046152da565b611651565b61019e61033036600461535c565b611757565b6101f1610343366004615401565b611a60565b61019e610356366004615343565b611a8c565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152da565b611c44565b61019e6103a23660046152da565b611eca565b61020c601481565b6103c26103bd3660046152da565b611fde565b6040516101fb9190615435565b6102316202a30081565b6101f16103e73660046154fc565b6120a6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff16600481111561044d5761044d615421565b600481111561045e5761045e615421565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fde565b90506002835160048111156104f9576104f9615421565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f028339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f028339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615421565b036106235786156105e4576105e183876120db565b90505b5f846060015183608001516105f99190615575565b90506106058482612377565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190615595565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615421565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff1660058111156108dd576108dd615421565b60058111156108ee576108ee615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615421565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ce565b6040518263ffffffff1660e01b8152600401610a0391906155ce565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a439190615595565b50505050565b5f610a5964e8d4a5100083615600565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126f5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee28339815191525f80610b578461270f565b91509150610b6482612a59565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615421565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a94565b505b610bd781610bd284604001516113e7565b612b0a565b5050505050565b5f80516020615ee28339815191525f610bf684612b2d565b90505f80610c078360400151612d07565b50915091505f610c1683611fde565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016105429061561f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615661565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615421565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f228339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb79190615595565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156aa565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156c5565b91505f9050843560208601356014610fc86060890160408a016156aa565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156c5565b8363ffffffff1681811061105e5761105e61570a565b9050602002810190611070919061571e565b611079906157ce565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615865565b84825f0151836020015184604001516040516020016110ce94939291906158ad565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c91906158fc565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a9190615595565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615421565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661590d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615920565b905061102c565b50600584018190555f61130986612b2d565b90505f6113198260400151612f42565b90508060028560405161132c91906158fc565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a9190615595565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615942565b5f61140a82611fde565b6080015192915050565b5f80516020615ee28339815191525f61142c856130b4565b905061143785612a59565b15610bd7575f8581526005830160205260409020546001600160a01b031633146114735760405162461bcd60e51b815260040161054290615959565b5f85815260058301602052604090205460a08201516114a291600160b01b90046001600160401b0316906159ab565b6001600160401b03168160c001516001600160401b031610156115235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153486856120db565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158b906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611601573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116259190615595565b5f8781526008850160205260408120805490919061164490849061590d565b9091555050505050505050565b5f80516020615ee28339815191525f61166983611fde565b905060048151600581111561168057611680615421565b146116ea5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117215760405162461bcd60e51b815260040161054290615959565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a94565b61175f61332f565b5f80516020615ee28339815191525f61177784612b2d565b90505f806117888360400151612d07565b50915091505f61179783611fde565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d1576117d1615421565b60048111156117e2576117e2615421565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c65760405162461bcd60e51b81526004016105429061561f565b826001600160401b03168160e001516001600160401b031611156118fc5760405162461bcd60e51b815260040161054290615661565b60038151600481111561191157611911615421565b146119655760405162461bcd60e51b815260206004820152603160248201525f80516020615f028339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a690600160a01b900461ffff1684615942565b6119b09190615600565b905080886008015f8881526020019081526020015f205f8282546119d4919061590d565b909155505060208301516119f1906119ec83856159cb565b612a94565b611a068360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5c60015f80516020615f4283398151915255565b5050565b5f611a6961332f565b611a74833384613379565b9050610a5960015f80516020615f4283398151915255565b5f80516020615f228339815191525f611aa483612b2d565b90505f80611ab58360400151613733565b9150915080611b175760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b31906159de565b9050118015611b63575060015f83815260088601602052604090205460ff166005811115611b6157611b61615421565b145b611b7f5760405162461bcd60e51b815260040161054290615a16565b5f8281526007850160205260408120611b97916151ef565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff166004811115611ca557611ca5615421565b6004811115611cb657611cb6615421565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3d57611d3d615421565b1480611d5b5750600381516004811115611d5957611d59615421565b145b611daf5760405162461bcd60e51b815260206004820152603260248201525f80516020615f02833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dbd8260400151611fde565b905080606001516001600160401b03165f03611e415760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e6e8460400151846060015185608001516124ce565b6040518263ffffffff1660e01b8152600401611e8a91906155ce565b6020604051808303815f875af1158015611ea6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd79190615595565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f22833981519152929190611f12906159de565b9050118015611f44575060015f83815260088301602052604090205460ff166005811115611f4257611f42615421565b145b611f605760405162461bcd60e51b815260040161054290615a16565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f999190600401615a5d565b6020604051808303815f875af1158015611fb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd99190615595565b505050565b611fe6615226565b5f8281525f80516020615f62833981519152602052604090819020815160e0810190925280545f80516020615f22833981519152929190829060ff16600581111561203357612033615421565b600581111561204457612044615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120af61332f565b6120bb858585856138d4565b90506120d360015f80516020615f4283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612126573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214d9190810190615af2565b91509150806121b05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190615595565b82511461227b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123008460400151613b49565b9150915081871461236d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f62833981519152602052604081206002015481905f80516020615f2283398151915290600160801b90046001600160401b03166123bf8582613d21565b5f6123c987613f2f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124198a858b6124ce565b6040518263ffffffff1660e01b815260040161243591906155ce565b6020604051808303815f875af1158015612451573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124759190615595565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612547576125078160016159cb565b612512906008615942565b5081515f908390839081106125295761252961570a565b60200101906001600160f81b03191690815f1a9053506001016124f3565b505f5b60048110156125b25761255e8160036159cb565b612569906008615942565b600263ffffffff16901c60f81b82826002612584919061590d565b815181106125945761259461570a565b60200101906001600160f81b03191690815f1a90535060010161254a565b505f5b6020811015612614576125c981601f6159cb565b6125d4906008615942565b86901c60f81b826125e683600661590d565b815181106125f6576125f661570a565b60200101906001600160f81b03191690815f1a9053506001016125b5565b505f5b600881101561267f5761262b8160076159cb565b612636906008615942565b6001600160401b038616901c60f81b8261265183602661590d565b815181106126615761266161570a565b60200101906001600160f81b03191690815f1a905350600101612617565b505f5b60088110156126ea576126968160076159cb565b6126a1906008615942565b6001600160401b038516901c60f81b826126bc83602e61590d565b815181106126cc576126cc61570a565b60200101906001600160f81b03191690815f1a905350600101612682565b5090505b9392505050565b6126fd613fbf565b6127068261400a565b611a5c81614081565b5f612718615226565b5f80516020615f228339815191525f61273085612b2d565b90505f806127418360400151613733565b9150915080156127a65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d7576127d7615421565b60058111156127e8576127e8615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285957612859615421565b1480612877575060018251600581111561287557612875615421565b145b6128d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128eb576128eb615421565b036128f8575060046128fc565b5060055b6020808301515f9081526009880190915260408120558181600581111561292557612925615421565b9081600581111561293857612938615421565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296c5761296c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2057612a20615421565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aef575f80fd5b505af1158015612b01573d5f803e3d5ffd5b50505050505050565b5f80516020615ec283398151915254611a5c906001600160a01b03168383614122565b60408051606080820183525f8083526020830181905292820152905f80516020615f228339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc99190810190615af2565b9150915080612c295760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c8c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612cff5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d2b5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612d7a57612d428160016159cb565b612d4d906008615942565b61ffff16868281518110612d6357612d6361570a565b016020015160f81c901b9190911790600101612d2e565b5061ffff811615612d9d5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015612df857612db48160036159cb565b612dbf906008615942565b63ffffffff1687612dd183600261590d565b81518110612de157612de161570a565b016020015160f81c901b9190911790600101612da0565b5063ffffffff8116600414612e1f5760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015612e7457612e3681601f6159cb565b612e41906008615942565b88612e4d83600661590d565b81518110612e5d57612e5d61570a565b016020015160f81c901b9190911790600101612e22565b505f805b6008811015612ed357612e8c8160076159cb565b612e97906008615942565b6001600160401b031689612eac83602661590d565b81518110612ebc57612ebc61570a565b016020015160f81c901b9190911790600101612e78565b505f805b6008811015612f3257612eeb8160076159cb565b612ef6906008615942565b6001600160401b03168a612f0b83602e61590d565b81518110612f1b57612f1b61570a565b016020015160f81c901b9190911790600101612ed7565b5091989097509095509350505050565b5f8151602614612f645760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612fb357612f7b8160016159cb565b612f86906008615942565b61ffff16848281518110612f9c57612f9c61570a565b016020015160f81c901b9190911790600101612f67565b5061ffff811615612fd65760405162461bcd60e51b815260040161054290615c0d565b5f805b600481101561303157612fed8160036159cb565b612ff8906008615942565b63ffffffff168561300a83600261590d565b8151811061301a5761301a61570a565b016020015160f81c901b9190911790600101612fd9565b5063ffffffff8116156130565760405162461bcd60e51b815260040161054290615c50565b5f805b60208110156130ab5761306d81601f6159cb565b613078906008615942565b8661308483600661590d565b815181106130945761309461570a565b016020015160f81c901b9190911790600101613059565b50949350505050565b6130bc615226565b5f8281525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff16600581111561310957613109615421565b600581111561311a5761311a615421565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318c5761318c615421565b146131e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322c5761322c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d88582612377565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4283398151915280546001190161336057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4283398151915255565b5f5f80516020615ee28339815191528161339561022c85614181565b90505f6133a187611fde565b90506133ac87612a59565b6134095760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561341e5761341e615421565b1461347d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161348e91906159ab565b600485015460408401519192506134b0916001600160401b0390911690615c97565b6001600160401b0316816001600160401b0316111561352f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061353b8a84612377565b915091505f8a8360405160200161356992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360457613604615421565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137565760405162461bcd60e51b815260040161054290615bc4565b5f805b60028110156137a55761376d8160016159cb565b613778906008615942565b61ffff1685828151811061378e5761378e61570a565b016020015160f81c901b9190911790600101613759565b5061ffff8116156137c85760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613823576137df8160036159cb565b6137ea906008615942565b63ffffffff16866137fc83600261590d565b8151811061380c5761380c61570a565b016020015160f81c901b91909117906001016137cb565b5063ffffffff811660031461384a5760405162461bcd60e51b815260040161054290615c50565b5f805b602081101561389f5761386181601f6159cb565b61386c906008615942565b8761387883600661590d565b815181106138885761388861570a565b016020015160f81c901b919091179060010161384d565b505f866026815181106138b4576138b461570a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee28339815191529061ffff861610801590613920575061271061ffff861611155b61393c5760405162461bcd60e51b815260040161054290615cc2565b60028101546001600160401b0390811690851610156139b55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a185760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a7f5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8984614181565b90505f613a9582610a49565b90505f613aa289836141a4565b90506040518060600160405280613ab63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6c5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015613bbb57613b838160016159cb565b613b8e906008615942565b61ffff16858281518110613ba457613ba461570a565b016020015160f81c901b9190911790600101613b6f565b5061ffff811615613bde5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613c3957613bf58160036159cb565b613c00906008615942565b63ffffffff1686613c1283600261590d565b81518110613c2257613c2261570a565b016020015160f81c901b9190911790600101613be1565b5063ffffffff8116600514613c605760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015613cb557613c7781601f6159cb565b613c82906008615942565b87613c8e83600661590d565b81518110613c9e57613c9e61570a565b016020015160f81c901b9190911790600101613c63565b505f805b6008811015613d1457613ccd8160076159cb565b613cd8906008615942565b6001600160401b031688613ced83602661590d565b81518110613cfd57613cfd61570a565b016020015160f81c901b9190911790600101613cb9565b5090969095509350505050565b5f80516020615f228339815191525f6001600160401b038084169085161115613d5557613d4e8385615575565b9050613d62565b613d5f8484615575565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc4575060028401548151613dc0916001600160401b03169061590d565b8210155b15613dea576001600160401b038316606082015281815260408101516020820152613e09565b8281606001818151613dfc91906159ab565b6001600160401b03169052505b6060810151613e19906064615c97565b602082015160028601546001600160401b039290921691613e449190600160401b900460ff16615942565b1015613ea85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec3919061590d565b9052506040810180516001600160401b0387169190613ee39083906159cb565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f628339815191526020526040812060020180545f80516020615f2283398151915291600160401b9091046001600160401b0316906008613f7983615d0d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400857604051631afcd79f60e31b815260040160405180910390fd5b565b614012613fbf565b61401b81614709565b614023614722565b61407e608082013560a083013561404060e0850160c086016153e8565b614051610100860160e08701615d28565b61ffff1661406761012087016101008801615d41565b614079610140880161012089016156aa565b614732565b50565b614089613fbf565b5f80516020615ec28339815191526001600160a01b0382166141025760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614976565b5f610a59825f80516020615ec2833981519152546001600160a01b0316906149d7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f228339815191524261424e60408601602087016153e8565b6001600160401b0316116142c05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d060408501602086016153e8565b6001600160401b03166142e66202a3004261590d565b116143595760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e05760405162461bcd60e51b815260040161054290615865565b60306143ef6040860186615d61565b9050146144545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61445e835f613d21565b5f806144f86040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a391906153e8565b6001600160401b031681526020016144be60408a018a615d61565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b39565b5f828152600786016020526040902091935091506145168282615de7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145439085906004016155ce565b6020604051808303815f875af115801561455f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145839190615595565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fb576145fb615421565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146db918e01908e016153e8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614711613fbf565b614719614ee8565b61407e81614ef0565b61472a613fbf565b614008615092565b61473a613fbf565b5f80516020615ee2833981519152836147a65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147c85760405162461bcd60e51b815260040161054290615cc2565b858711156148305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff161161489d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff8416111561490f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61498a6001600160a01b0384168361509a565b905080515f141580156149ae5750808060200190518101906149ac9190615ea6565b155b15611fd957604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a419190615595565b9050614a586001600160a01b0385163330866150a7565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac09190615595565b9050818111614b265760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3082826159cb565b95945050505050565b5f6060826080015151603014614ba35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1a57614bda8160016159cb565b614be5906008615942565b5081515f90839083908110614bfc57614bfc61570a565b60200101906001600160f81b03191690815f1a905350600101614bc6565b505f5b6004811015614c8257614c318160036159cb565b614c3c906008615942565b600160ff919091161c60f81b82614c5483600261590d565b81518110614c6457614c6461570a565b60200101906001600160f81b03191690815f1a905350600101614c1d565b505f5b6020811015614cdf5784518160208110614ca157614ca161570a565b1a60f81b82614cb183600661590d565b81518110614cc157614cc161570a565b60200101906001600160f81b03191690815f1a905350600101614c85565b505f5b6020811015614d3f5784602001518160208110614d0157614d0161570a565b1a60f81b82614d1183602661590d565b81518110614d2157614d2161570a565b60200101906001600160f81b03191690815f1a905350600101614ce2565b505f5b6008811015614db357614d568160076159cb565b614d61906008615942565b60ff1685604001516001600160401b0316901c60f81b82826046614d85919061590d565b81518110614d9557614d9561570a565b60200101906001600160f81b03191690815f1a905350600101614d42565b505f5b6030811015614e1e5784608001518181518110614dd557614dd561570a565b01602001516001600160f81b03191682614df083604e61590d565b81518110614e0057614e0061570a565b60200101906001600160f81b03191690815f1a905350600101614db6565b505f5b6008811015614e9057614e358160076159cb565b614e40906008615942565b60608601516001600160401b0390811691161c60f81b82614e6283607e61590d565b81518110614e7257614e7261570a565b60200101906001600160f81b03191690815f1a905350600101614e21565b50600281604051614ea191906158fc565b602060405180830381855afa158015614ebc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614edf9190615595565b94909350915050565b614008613fbf565b614ef8613fbf565b80355f80516020615f2283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f446080840160608501615d41565b60ff161115614fb15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc26080840160608501615d41565b60ff161161502a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61503a6080830160608401615d41565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506b60608301604084016153e8565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613366613fbf565b60606126ee83835f6150e0565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd9060840161414f565b6060814710156151055760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b0316848660405161512091906158fc565b5f6040518083038185875af1925050503d805f811461515a576040519150601f19603f3d011682016040523d82523d5f602084013e61515f565b606091505b509150915061236d86838360608261517f5761517a826151c6565b6126ee565b815115801561519657506001600160a01b0384163b155b156151bf57604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126ee565b8051156151d65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fb906159de565b5f825580601f1061520a575050565b601f0160209004905f5260205f209081019061407e9190615262565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615276575f8155600101615263565b5090565b801515811461407e575f80fd5b803563ffffffff8116811461529a575f80fd5b919050565b5f805f606084860312156152b1575f80fd5b8335925060208401356152c38161527a565b91506152d160408501615287565b90509250925092565b5f602082840312156152ea575f80fd5b5035919050565b6001600160a01b038116811461407e575f80fd5b5f80828403610160811215615318575f80fd5b61014080821215615327575f80fd5b8493508301359050615338816152f1565b809150509250929050565b5f60208284031215615353575f80fd5b6126ee82615287565b5f806040838503121561536d575f80fd5b61537683615287565b946020939093013593505050565b5f8060408385031215615395575f80fd5b82356001600160401b038111156153aa575f80fd5b8301608081860312156153bb575f80fd5b91506153c960208401615287565b90509250929050565b80356001600160401b038116811461529a575f80fd5b5f602082840312156153f8575f80fd5b6126ee826153d2565b5f8060408385031215615412575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549360608401826001600160401b03169052565b5060808301516154ae60808401826001600160401b03169052565b5060a08301516154c960a08401826001600160401b03169052565b5060c08301516154e460c08401826001600160401b03169052565b5092915050565b803561ffff8116811461529a575f80fd5b5f805f806080858703121561550f575f80fd5b84356001600160401b03811115615524575f80fd5b850160608188031215615535575f80fd5b9350615543602086016154eb565b9250615551604086016153d2565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e4576154e4615561565b5f602082840312156155a5575f80fd5b5051919050565b5f5b838110156155c65781810151838201526020016155ae565b50505f910152565b602081525f82518060208401526155ec8160408501602087016155ac565b601f01601f19169190910160400192915050565b5f8261561a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156ba575f80fd5b81356126ee816152f1565b5f808335601e198436030181126156da575f80fd5b8301803591506001600160401b038211156156f3575f80fd5b6020019150600581901b36038213156124c7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615732575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157725761577261573c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a0576157a061573c565b604052919050565b5f6001600160401b038211156157c0576157c061573c565b50601f01601f191660200190565b5f606082360312156157de575f80fd5b6157e6615750565b8235815260206157f78185016153d2565b8183015260408401356001600160401b03811115615813575f80fd5b840136601f820112615823575f80fd5b8035615836615831826157a8565b615778565b8181523684838501011115615849575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158be818460208a016155ac565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ee8160288401602088016155ac565b016028019695505050505050565b5f82516157328184602087016155ac565b80820180821115610a5957610a59615561565b5f63ffffffff80831681810361593857615938615561565b6001019392505050565b8082028115828204841417610a5957610a59615561565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e4576154e4615561565b81810381811115610a5957610a59615561565b600181811c908216806159f257607f821691505b602082108103615a1057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6f816159de565b806020870152604060018084165f8114615a905760018114615aac57615ad9565b60ff19851660408a0152604084151560051b8a01019550615ad9565b895f5260205f205f5b85811015615ad05781548b8201860152908301908801615ab5565b8a016040019650505b509398975050505050505050565b805161529a8161527a565b5f8060408385031215615b03575f80fd5b82516001600160401b0380821115615b19575f80fd5b9084019060608287031215615b2c575f80fd5b615b34615750565b82518152602080840151615b47816152f1565b82820152604084015183811115615b5c575f80fd5b80850194505087601f850112615b70575f80fd5b83519250615b80615831846157a8565b8381528882858701011115615b93575f80fd5b615ba2848383018488016155ac565b80604084015250819550615bb7818801615ae7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cba57615cba615561565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593857615938615561565b5f60208284031215615d38575f80fd5b6126ee826154eb565b5f60208284031215615d51575f80fd5b813560ff811681146126ee575f80fd5b5f808335601e19843603018112615d76575f80fd5b8301803591506001600160401b03821115615d8f575f80fd5b6020019150368190038213156124c7575f80fd5b601f821115611fd957805f5260205f20601f840160051c81016020851015615dc85750805b601f840160051c820191505b81811015610bd7575f8155600101615dd4565b81516001600160401b03811115615e0057615e0061573c565b615e1481615e0e84546159de565b84615da3565b602080601f831160018114615e47575f8415615e305750858301515b5f19600386901b1c1916600185901b178555615e9e565b5f85815260208120601f198616915b82811015615e7557888601518255948401946001909101908401615e56565b5085821015615e9257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb6575f80fd5b81516126ee8161527a56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160e13803806160e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152a5565b6103ec565b005b61019e6101ae3660046152e0565b610890565b6101f16101c13660046152e0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152e0565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461530b565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615349565b610b3e565b61019e610299366004615362565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461538a565b610db3565b6101f16102dc3660046153ee565b6113e7565b6102316102ef3660046152e0565b611400565b61019e6103023660046152a5565b611414565b61020c603081565b61019e61031d3660046152e0565b611657565b61019e610330366004615362565b61175d565b6101f1610343366004615407565b611a66565b61019e610356366004615349565b611a92565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152e0565b611c4a565b61019e6103a23660046152e0565b611ed0565b61020c601481565b6103c26103bd3660046152e0565b611fe4565b6040516101fb919061543b565b6102316202a30081565b6101f16103e7366004615502565b6120ac565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff16600481111561044d5761044d615427565b600481111561045e5761045e615427565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fe4565b90506002835160048111156104f9576104f9615427565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f088339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f088339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615427565b036106235786156105e4576105e183876120e1565b90505b5f846060015183608001516105f9919061557b565b9050610605848261237d565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b919061559b565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615427565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff1660058111156108dd576108dd615427565b60058111156108ee576108ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615427565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124d4565b6040518263ffffffff1660e01b8152600401610a0391906155d4565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a43919061559b565b50505050565b5f610a5964e8d4a5100083615606565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126fb565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee88339815191525f80610b5784612715565b91509150610b6482612a5f565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615427565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a9a565b505b610bd781610bd284604001516113e7565b612b10565b5050505050565b5f80516020615ee88339815191525f610bf684612b33565b90505f80610c078360400151612d0d565b50915091505f610c1683611fe4565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615625565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615667565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615427565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f288339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb7919061559b565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156b0565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156cb565b91505f9050843560208601356014610fc86060890160408a016156b0565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156cb565b8363ffffffff1681811061105e5761105e615710565b90506020028101906110709190615724565b611079906157d4565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b81526004016105429061586b565b84825f0151836020015184604001516040516020016110ce94939291906158b3565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c9190615902565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a919061559b565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615427565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611299911686615913565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615926565b905061102c565b50600584018190555f61130986612b33565b90505f6113198260400151612f48565b90508060028560405161132c9190615902565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a919061559b565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615948565b5f61140a82611fe4565b6080015192915050565b5f80516020615ee88339815191525f61142c856130ba565b905061143785612a5f565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061595f565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159b1565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120e1565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b919061559b565b5f8781526008850160205260408120805490919061164a908490615913565b9091555050505050505050565b5f80516020615ee88339815191525f61166f83611fe4565b905060048151600581111561168657611686615427565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061595f565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a9a565b611765613335565b5f80516020615ee88339815191525f61177d84612b33565b90505f8061178e8360400151612d0d565b50915091505f61179d83611fe4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615427565b60048111156117e8576117e8615427565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615625565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615667565b60038151600481111561191757611917615427565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f088339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615948565b6119b69190615606565b905080886008015f8881526020019081526020015f205f8282546119da9190615913565b909155505060208301516119f7906119f283856159d1565b612a9a565b611a0c8360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a6260015f80516020615f4883398151915255565b5050565b5f611a6f613335565b611a7a83338461337f565b9050610a5960015f80516020615f4883398151915255565b5f80516020615f288339815191525f611aaa83612b33565b90505f80611abb8360400151613739565b9150915080611b1d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b37906159e4565b9050118015611b69575060015f83815260088601602052604090205460ff166005811115611b6757611b67615427565b145b611b855760405162461bcd60e51b815260040161054290615a1c565b5f8281526007850160205260408120611b9d916151f5565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff166004811115611cab57611cab615427565b6004811115611cbc57611cbc615427565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d4357611d43615427565b1480611d615750600381516004811115611d5f57611d5f615427565b145b611db55760405162461bcd60e51b815260206004820152603260248201525f80516020615f08833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dc38260400151611fe4565b905080606001516001600160401b03165f03611e475760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e748460400151846060015185608001516124d4565b6040518263ffffffff1660e01b8152600401611e9091906155d4565b6020604051808303815f875af1158015611eac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd7919061559b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f28833981519152929190611f18906159e4565b9050118015611f4a575060015f83815260088301602052604090205460ff166005811115611f4857611f48615427565b145b611f665760405162461bcd60e51b815260040161054290615a1c565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f9f9190600401615a63565b6020604051808303815f875af1158015611fbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdf919061559b565b505050565b611fec61522c565b5f8281525f80516020615f68833981519152602052604090819020815160e0810190925280545f80516020615f28833981519152929190829060ff16600581111561203957612039615427565b600581111561204a5761204a615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120b5613335565b6120c1858585856138da565b90506120d960015f80516020615f4883398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561212c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121539190810190615af8565b91509150806121b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221d919061559b565b8251146122815760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123068460400151613b4f565b915091508187146123735760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f68833981519152602052604081206002015481905f80516020615f2883398151915290600160801b90046001600160401b03166123c58582613d27565b5f6123cf87613f35565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241f8a858b6124d4565b6040518263ffffffff1660e01b815260040161243b91906155d4565b6020604051808303815f875af1158015612457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247b919061559b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561254d5761250d8160016159d1565b612518906008615948565b5081515f9083908390811061252f5761252f615710565b60200101906001600160f81b03191690815f1a9053506001016124f9565b505f5b60048110156125b8576125648160036159d1565b61256f906008615948565b600263ffffffff16901c60f81b8282600261258a9190615913565b8151811061259a5761259a615710565b60200101906001600160f81b03191690815f1a905350600101612550565b505f5b602081101561261a576125cf81601f6159d1565b6125da906008615948565b86901c60f81b826125ec836006615913565b815181106125fc576125fc615710565b60200101906001600160f81b03191690815f1a9053506001016125bb565b505f5b6008811015612685576126318160076159d1565b61263c906008615948565b6001600160401b038616901c60f81b82612657836026615913565b8151811061266757612667615710565b60200101906001600160f81b03191690815f1a90535060010161261d565b505f5b60088110156126f05761269c8160076159d1565b6126a7906008615948565b6001600160401b038516901c60f81b826126c283602e615913565b815181106126d2576126d2615710565b60200101906001600160f81b03191690815f1a905350600101612688565b5090505b9392505050565b612703613fc5565b61270c82614010565b611a6281614087565b5f61271e61522c565b5f80516020615f288339815191525f61273685612b33565b90505f806127478360400151613739565b9150915080156127ac5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127dd576127dd615427565b60058111156127ee576127ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285f5761285f615427565b148061287d575060018251600581111561287b5761287b615427565b145b6128dc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128f1576128f1615427565b036128fe57506004612902565b5060055b6020808301515f9081526009880190915260408120558181600581111561292b5761292b615427565b9081600581111561293e5761293e615427565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561297257612972615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2657612a26615427565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612af5575f80fd5b505af1158015612b07573d5f803e3d5ffd5b50505050505050565b5f80516020615ec883398151915254611a62906001600160a01b03168383614128565b60408051606080820183525f8083526020830181905292820152905f80516020615f288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bcf9190810190615af8565b9150915080612c2f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c925760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d055760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d315760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612d8057612d488160016159d1565b612d53906008615948565b61ffff16868281518110612d6957612d69615710565b016020015160f81c901b9190911790600101612d34565b5061ffff811615612da35760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015612dfe57612dba8160036159d1565b612dc5906008615948565b63ffffffff1687612dd7836002615913565b81518110612de757612de7615710565b016020015160f81c901b9190911790600101612da6565b5063ffffffff8116600414612e255760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015612e7a57612e3c81601f6159d1565b612e47906008615948565b88612e53836006615913565b81518110612e6357612e63615710565b016020015160f81c901b9190911790600101612e28565b505f805b6008811015612ed957612e928160076159d1565b612e9d906008615948565b6001600160401b031689612eb2836026615913565b81518110612ec257612ec2615710565b016020015160f81c901b9190911790600101612e7e565b505f805b6008811015612f3857612ef18160076159d1565b612efc906008615948565b6001600160401b03168a612f1183602e615913565b81518110612f2157612f21615710565b016020015160f81c901b9190911790600101612edd565b5091989097509095509350505050565b5f8151602614612f6a5760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612fb957612f818160016159d1565b612f8c906008615948565b61ffff16848281518110612fa257612fa2615710565b016020015160f81c901b9190911790600101612f6d565b5061ffff811615612fdc5760405162461bcd60e51b815260040161054290615c13565b5f805b600481101561303757612ff38160036159d1565b612ffe906008615948565b63ffffffff1685613010836002615913565b8151811061302057613020615710565b016020015160f81c901b9190911790600101612fdf565b5063ffffffff81161561305c5760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156130b15761307381601f6159d1565b61307e906008615948565b8661308a836006615913565b8151811061309a5761309a615710565b016020015160f81c901b919091179060010161305f565b50949350505050565b6130c261522c565b5f8281525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff16600581111561310f5761310f615427565b600581111561312057613120615427565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561319257613192615427565b146131ee5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561323257613232615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132de858261237d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4883398151915280546001190161336657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4883398151915255565b5f5f80516020615ee88339815191528161339b61022c85614187565b90505f6133a787611fe4565b90506133b287612a5f565b61340f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561342457613424615427565b146134835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161349491906159b1565b600485015460408401519192506134b6916001600160401b0390911690615c9d565b6001600160401b0316816001600160401b031611156135355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f806135418a8461237d565b915091505f8a8360405160200161356f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360a5761360a615427565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461375c5760405162461bcd60e51b815260040161054290615bca565b5f805b60028110156137ab576137738160016159d1565b61377e906008615948565b61ffff1685828151811061379457613794615710565b016020015160f81c901b919091179060010161375f565b5061ffff8116156137ce5760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613829576137e58160036159d1565b6137f0906008615948565b63ffffffff1686613802836002615913565b8151811061381257613812615710565b016020015160f81c901b91909117906001016137d1565b5063ffffffff81166003146138505760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156138a55761386781601f6159d1565b613872906008615948565b8761387e836006615913565b8151811061388e5761388e615710565b016020015160f81c901b9190911790600101613853565b505f866026815181106138ba576138ba615710565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee88339815191529061ffff861610801590613926575061271061ffff861611155b6139425760405162461bcd60e51b815260040161054290615cc8565b60028101546001600160401b0390811690851610156139bb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a855760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8f84614187565b90505f613a9b82610a49565b90505f613aa889836141aa565b90506040518060600160405280613abc3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b725760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015613bc157613b898160016159d1565b613b94906008615948565b61ffff16858281518110613baa57613baa615710565b016020015160f81c901b9190911790600101613b75565b5061ffff811615613be45760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613c3f57613bfb8160036159d1565b613c06906008615948565b63ffffffff1686613c18836002615913565b81518110613c2857613c28615710565b016020015160f81c901b9190911790600101613be7565b5063ffffffff8116600514613c665760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015613cbb57613c7d81601f6159d1565b613c88906008615948565b87613c94836006615913565b81518110613ca457613ca4615710565b016020015160f81c901b9190911790600101613c69565b505f805b6008811015613d1a57613cd38160076159d1565b613cde906008615948565b6001600160401b031688613cf3836026615913565b81518110613d0357613d03615710565b016020015160f81c901b9190911790600101613cbf565b5090969095509350505050565b5f80516020615f288339815191525f6001600160401b038084169085161115613d5b57613d54838561557b565b9050613d68565b613d65848461557b565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dca575060028401548151613dc6916001600160401b031690615913565b8210155b15613df0576001600160401b038316606082015281815260408101516020820152613e0f565b8281606001818151613e0291906159b1565b6001600160401b03169052505b6060810151613e1f906064615c9d565b602082015160028601546001600160401b039290921691613e4a9190600160401b900460ff16615948565b1015613eae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec99190615913565b9052506040810180516001600160401b0387169190613ee99083906159d1565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f688339815191526020526040812060020180545f80516020615f2883398151915291600160401b9091046001600160401b0316906008613f7f83615d13565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400e57604051631afcd79f60e31b815260040160405180910390fd5b565b614018613fc5565b6140218161470f565b614029614728565b614084608082013560a083013561404660e0850160c086016153ee565b614057610100860160e08701615d2e565b61ffff1661406d61012087016101008801615d47565b61407f610140880161012089016156b0565b614738565b50565b61408f613fc5565b5f80516020615ec88339815191526001600160a01b0382166141085760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fdf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061497c565b5f610a59825f80516020615ec8833981519152546001600160a01b0316906149dd565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f288339815191524261425460408601602087016153ee565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d660408501602086016153ee565b6001600160401b03166142ec6202a30042615913565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b81526004016105429061586b565b60306143f56040860186615d67565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b614464835f613d27565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a991906153ee565b6001600160401b031681526020016144c460408a018a615d67565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b3f565b5f8281526007860160205260409020919350915061451c8282615ded565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016155d4565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614589919061559b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561460157614601615427565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e016153ee565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614717613fc5565b61471f614eee565b61408481614ef6565b614730613fc5565b61400e615098565b614740613fc5565b5f80516020615ee8833981519152836147ac5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147ce5760405162461bcd60e51b815260040161054290615cc8565b858711156148365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148a35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149155760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149906001600160a01b038416836150a0565b905080515f141580156149b45750808060200190518101906149b29190615eac565b155b15611fdf57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a47919061559b565b9050614a5e6001600160a01b0385163330866150ad565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac6919061559b565b9050818111614b2c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3682826159d1565b95945050505050565b5f6060826080015151603014614ba95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c2057614be08160016159d1565b614beb906008615948565b5081515f90839083908110614c0257614c02615710565b60200101906001600160f81b03191690815f1a905350600101614bcc565b505f5b6004811015614c8857614c378160036159d1565b614c42906008615948565b600160ff919091161c60f81b82614c5a836002615913565b81518110614c6a57614c6a615710565b60200101906001600160f81b03191690815f1a905350600101614c23565b505f5b6020811015614ce55784518160208110614ca757614ca7615710565b1a60f81b82614cb7836006615913565b81518110614cc757614cc7615710565b60200101906001600160f81b03191690815f1a905350600101614c8b565b505f5b6020811015614d455784602001518160208110614d0757614d07615710565b1a60f81b82614d17836026615913565b81518110614d2757614d27615710565b60200101906001600160f81b03191690815f1a905350600101614ce8565b505f5b6008811015614db957614d5c8160076159d1565b614d67906008615948565b60ff1685604001516001600160401b0316901c60f81b82826046614d8b9190615913565b81518110614d9b57614d9b615710565b60200101906001600160f81b03191690815f1a905350600101614d48565b505f5b6030811015614e245784608001518181518110614ddb57614ddb615710565b01602001516001600160f81b03191682614df683604e615913565b81518110614e0657614e06615710565b60200101906001600160f81b03191690815f1a905350600101614dbc565b505f5b6008811015614e9657614e3b8160076159d1565b614e46906008615948565b60608601516001600160401b0390811691161c60f81b82614e6883607e615913565b81518110614e7857614e78615710565b60200101906001600160f81b03191690815f1a905350600101614e27565b50600281604051614ea79190615902565b602060405180830381855afa158015614ec2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ee5919061559b565b94909350915050565b61400e613fc5565b614efe613fc5565b80355f80516020615f2883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f4a6080840160608501615d47565b60ff161115614fb75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc86080840160608501615d47565b60ff16116150305760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b6150406080830160608401615d47565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561507160608301604084016153ee565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61336c613fc5565b60606126f483835f6150e6565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614155565b60608147101561510b5760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b031684866040516151269190615902565b5f6040518083038185875af1925050503d805f8114615160576040519150601f19603f3d011682016040523d82523d5f602084013e615165565b606091505b509150915061237386838360608261518557615180826151cc565b6126f4565b815115801561519c57506001600160a01b0384163b155b156151c557604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126f4565b8051156151dc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615201906159e4565b5f825580601f10615210575050565b601f0160209004905f5260205f20908101906140849190615268565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561527c575f8155600101615269565b5090565b8015158114614084575f80fd5b803563ffffffff811681146152a0575f80fd5b919050565b5f805f606084860312156152b7575f80fd5b8335925060208401356152c981615280565b91506152d76040850161528d565b90509250925092565b5f602082840312156152f0575f80fd5b5035919050565b6001600160a01b0381168114614084575f80fd5b5f8082840361016081121561531e575f80fd5b6101408082121561532d575f80fd5b849350830135905061533e816152f7565b809150509250929050565b5f60208284031215615359575f80fd5b6126f48261528d565b5f8060408385031215615373575f80fd5b61537c8361528d565b946020939093013593505050565b5f806040838503121561539b575f80fd5b82356001600160401b038111156153b0575f80fd5b8301608081860312156153c1575f80fd5b91506153cf6020840161528d565b90509250929050565b80356001600160401b03811681146152a0575f80fd5b5f602082840312156153fe575f80fd5b6126f4826153d8565b5f8060408385031215615418575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549960608401826001600160401b03169052565b5060808301516154b460808401826001600160401b03169052565b5060a08301516154cf60a08401826001600160401b03169052565b5060c08301516154ea60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152a0575f80fd5b5f805f8060808587031215615515575f80fd5b84356001600160401b0381111561552a575f80fd5b85016060818803121561553b575f80fd5b9350615549602086016154f1565b9250615557604086016153d8565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154ea576154ea615567565b5f602082840312156155ab575f80fd5b5051919050565b5f5b838110156155cc5781810151838201526020016155b4565b50505f910152565b602081525f82518060208401526155f28160408501602087016155b2565b601f01601f19169190910160400192915050565b5f8261562057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156c0575f80fd5b81356126f4816152f7565b5f808335601e198436030181126156e0575f80fd5b8301803591506001600160401b038211156156f9575f80fd5b6020019150600581901b36038213156124cd575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615738575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561577857615778615742565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a6576157a6615742565b604052919050565b5f6001600160401b038211156157c6576157c6615742565b50601f01601f191660200190565b5f606082360312156157e4575f80fd5b6157ec615756565b8235815260206157fd8185016153d8565b8183015260408401356001600160401b03811115615819575f80fd5b840136601f820112615829575f80fd5b803561583c615837826157ae565b61577e565b818152368483850101111561584f575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158c4818460208a016155b2565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158f48160288401602088016155b2565b016028019695505050505050565b5f82516157388184602087016155b2565b80820180821115610a5957610a59615567565b5f63ffffffff80831681810361593e5761593e615567565b6001019392505050565b8082028115828204841417610a5957610a59615567565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154ea576154ea615567565b81810381811115610a5957610a59615567565b600181811c908216806159f857607f821691505b602082108103615a1657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a75816159e4565b806020870152604060018084165f8114615a965760018114615ab257615adf565b60ff19851660408a0152604084151560051b8a01019550615adf565b895f5260205f205f5b85811015615ad65781548b8201860152908301908801615abb565b8a016040019650505b509398975050505050505050565b80516152a081615280565b5f8060408385031215615b09575f80fd5b82516001600160401b0380821115615b1f575f80fd5b9084019060608287031215615b32575f80fd5b615b3a615756565b82518152602080840151615b4d816152f7565b82820152604084015183811115615b62575f80fd5b80850194505087601f850112615b76575f80fd5b83519250615b86615837846157ae565b8381528882858701011115615b99575f80fd5b615ba8848383018488016155b2565b80604084015250819550615bbd818801615aed565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cc057615cc0615567565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593e5761593e615567565b5f60208284031215615d3e575f80fd5b6126f4826154f1565b5f60208284031215615d57575f80fd5b813560ff811681146126f4575f80fd5b5f808335601e19843603018112615d7c575f80fd5b8301803591506001600160401b03821115615d95575f80fd5b6020019150368190038213156124cd575f80fd5b601f821115611fdf57805f5260205f20601f840160051c81016020851015615dce5750805b601f840160051c820191505b81811015610bd7575f8155600101615dda565b81516001600160401b03811115615e0657615e06615742565b615e1a81615e1484546159e4565b84615da9565b602080601f831160018114615e4d575f8415615e365750858301515b5f19600386901b1c1916600185901b178555615ea4565b5f85815260208120601f198616915b82811015615e7b57888601518255948401946001909101908401615e5c565b5085821015615e9857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ebc575f80fd5b81516126f48161528056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 4ce5754f9..a21ad1acd 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d99380380615d9983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ffa565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615035565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615035565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504c565b610b91565b348015610286575f80fd5b5061029a610295366004615035565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a36600461508a565b610c84565b34801561032a575f80fd5b506101b86103393660046150de565b610cb8565b348015610349575f80fd5b506101b86103583660046150f7565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511f565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461516d565b611561565b3480156103cf575f80fd5b5061029a6103de366004615035565b61157a565b3480156103ee575f80fd5b506101b86103fd366004614ffa565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615035565b6117cb565b348015610440575f80fd5b506101b861044f3660046150f7565b6118d1565b34801561045f575f80fd5b506101b861046e3660046150de565b611bda565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615035565b611d92565b3480156104b7575f80fd5b506101b86104c6366004615035565b612018565b6102236104d9366004615035565b61212c565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615035565b61215d565b60405161022d919061519a565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff16600481111561059557610595615186565b60048111156105a6576105a6615186565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261215d565b905060028351600481111561064157610641615186565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f90600290600581111561071457610714615186565b0361076b57861561072c576107298387612225565b90505b5f846060015183608001516107419190615264565b905061074d84826124c1565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108739190615284565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b2615186565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff166005811115610a2557610a25615186565b6005811115610a3657610a36615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa5615186565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612618565b6040518263ffffffff1660e01b8152600401610b4b91906152bd565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b9190615284565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361283d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152ef565b92915050565b5f610c8d612851565b610c9984848434612888565b9050610cb160015f80516020615c0083398151915255565b9392505050565b5f80516020615ba08339815191525f80610cd184612b05565b91509150610cde82612e4f565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d16615186565b03610d3b575f83815260088501602052604081208054919055610d398282612e8a565b505b610d5181610d4c8460400151611561565b612ef0565b5050505050565b5f80516020615ba08339815191525f610d7084612f03565b90505f80610d8183604001516130dd565b50915091505f610d908361215d565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061530e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615350565b60015f87815260068701602052604090205460ff166004811115610e3357610e33615186565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be08339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110319190615284565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ad565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153c8565b91505f90508435602086013560146111426060890160408a016153ad565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153c8565b8363ffffffff168181106111d8576111d861540d565b90506020028101906111ea9190615421565b6111f3906154d1565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615568565b84825f01518360200151846040015160405160200161124894939291906155b0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129691906155ff565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d49190615284565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561136057611360615186565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615610565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615623565b90506111a6565b50600584018190555f61148386612f03565b90505f6114938260400151613318565b9050806002856040516114a691906155ff565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e49190615284565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615645565b5f6115848261215d565b6080015192915050565b5f80516020615ba08339815191525f6115a685613481565b90506115b185612e4f565b15610d51575f8581526005830160205260409020546001600160a01b031633146115ed5760405162461bcd60e51b815260040161068a9061565c565b5f85815260058301602052604090205460a082015161161c91600160b01b90046001600160401b0316906156ae565b6001600160401b03168160c001516001600160401b0316101561169d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116ae8685612225565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170590611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179f9190615284565b5f878152600885016020526040812080549091906117be908490615610565b9091555050505050505050565b5f80516020615ba08339815191525f6117e38361215d565b90506004815160058111156117fa576117fa615186565b146118645760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b0316331461189b5760405162461bcd60e51b815260040161068a9061565c565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e8a565b6118d9612851565b5f80516020615ba08339815191525f6118f184612f03565b90505f8061190283604001516130dd565b50915091505f6119118361215d565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194b5761194b615186565b600481111561195c5761195c615186565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a405760405162461bcd60e51b815260040161068a9061530e565b826001600160401b03168160e001516001600160401b03161115611a765760405162461bcd60e51b815260040161068a90615350565b600381516004811115611a8b57611a8b615186565b14611adf5760405162461bcd60e51b815260206004820152603160248201525f80516020615bc08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2090600160a01b900461ffff1684615645565b611b2a91906152ef565b905080886008015f8881526020019081526020015f205f828254611b4e9190615610565b90915550506020830151611b6b90611b6683856156ce565b612e8a565b611b808360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd660015f80516020615c0083398151915255565b5050565b5f80516020615be08339815191525f611bf283612f03565b90505f80611c0383604001516136fc565b9150915080611c655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c7f906156e1565b9050118015611cb1575060015f83815260088601602052604090205460ff166005811115611caf57611caf615186565b145b611ccd5760405162461bcd60e51b815260040161068a90615713565b5f8281526007850160205260408120611ce591614f4f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff166004811115611df357611df3615186565b6004811115611e0457611e04615186565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8b57611e8b615186565b1480611ea95750600381516004811115611ea757611ea7615186565b145b611efd5760405162461bcd60e51b815260206004820152603260248201525f80516020615bc0833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f0b826040015161215d565b905080606001516001600160401b03165f03611f8f5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fbc846040015184606001518560800151612618565b6040518263ffffffff1660e01b8152600401611fd891906152bd565b6020604051808303815f875af1158015611ff4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d519190615284565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be0833981519152929190612060906156e1565b9050118015612092575060015f83815260088301602052604090205460ff16600581111561209057612090615186565b145b6120ae5760405162461bcd60e51b815260040161068a90615713565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e7919060040161575a565b6020604051808303815f875af1158015612103573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121279190615284565b505050565b5f612135612851565b61214082333461389d565b905061215860015f80516020615c0083398151915255565b919050565b612165614f86565b5f8281525f80516020615c20833981519152602052604090819020815160e0810190925280545f80516020615be0833981519152929190829060ff1660058111156121b2576121b2615186565b60058111156121c3576121c3615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612270573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229791908101906157ef565b91509150806122fa5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123619190615284565b8251146123c55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561243b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061244a8460400151613c54565b915091508187146124b75760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c20833981519152602052604081206002015481905f80516020615be083398151915290600160801b90046001600160401b03166125098582613e2c565b5f6125138761403a565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125638a858b612618565b6040518263ffffffff1660e01b815260040161257f91906152bd565b6020604051808303815f875af115801561259b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bf9190615284565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612691576126518160016156ce565b61265c906008615645565b5081515f908390839081106126735761267361540d565b60200101906001600160f81b03191690815f1a90535060010161263d565b505f5b60048110156126fc576126a88160036156ce565b6126b3906008615645565b600263ffffffff16901c60f81b828260026126ce9190615610565b815181106126de576126de61540d565b60200101906001600160f81b03191690815f1a905350600101612694565b505f5b602081101561275e5761271381601f6156ce565b61271e906008615645565b86901c60f81b82612730836006615610565b815181106127405761274061540d565b60200101906001600160f81b03191690815f1a9053506001016126ff565b505f5b60088110156127c9576127758160076156ce565b612780906008615645565b6001600160401b038616901c60f81b8261279b836026615610565b815181106127ab576127ab61540d565b60200101906001600160f81b03191690815f1a905350600101612761565b505f5b6008811015612834576127e08160076156ce565b6127eb906008615645565b6001600160401b038516901c60f81b8261280683602e615610565b815181106128165761281661540d565b60200101906001600160f81b03191690815f1a9053506001016127cc565b50949350505050565b6128456140ca565b61284e81614115565b50565b5f80516020615c0083398151915280546001190161288257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba08339815191529061ffff8616108015906128d4575061271061ffff861611155b6128f05760405162461bcd60e51b815260040161068a906158c1565b60028101546001600160401b0390811690851610156129695760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a335760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a3e82610c6e565b90505f612a4b8983614189565b90506040518060600160405280612a5f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0083398151915255565b5f612b0e614f86565b5f80516020615be08339815191525f612b2685612f03565b90505f80612b3783604001516136fc565b915091508015612b9c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcd57612bcd615186565b6005811115612bde57612bde615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4f57612c4f615186565b1480612c6d5750600182516005811115612c6b57612c6b615186565b145b612ccc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce157612ce1615186565b03612cee57506004612cf2565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1b57612d1b615186565b90816005811115612d2e57612d2e615186565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6257612d62615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1657612e16615186565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed6575f80fd5b505af1158015612ee8573d5f803e3d5ffd5b505050505050565b611bd66001600160a01b038316826146ee565b60408051606080820183525f8083526020830181905292820152905f80516020615be08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f78573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9f91908101906157ef565b9150915080612fff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130625760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130d55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131015760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613150576131188160016156ce565b613123906008615645565b61ffff168682815181106131395761313961540d565b016020015160f81c901b9190911790600101613104565b5061ffff8116156131735760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156131ce5761318a8160036156ce565b613195906008615645565b63ffffffff16876131a7836002615610565b815181106131b7576131b761540d565b016020015160f81c901b9190911790600101613176565b5063ffffffff81166004146131f55760405162461bcd60e51b815260040161068a90615998565b5f805b602081101561324a5761320c81601f6156ce565b613217906008615645565b88613223836006615610565b815181106132335761323361540d565b016020015160f81c901b91909117906001016131f8565b505f805b60088110156132a9576132628160076156ce565b61326d906008615645565b6001600160401b031689613282836026615610565b815181106132925761329261540d565b016020015160f81c901b919091179060010161324e565b505f805b6008811015613308576132c18160076156ce565b6132cc906008615645565b6001600160401b03168a6132e183602e615610565b815181106132f1576132f161540d565b016020015160f81c901b91909117906001016132ad565b5091989097509095509350505050565b5f815160261461333a5760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613389576133518160016156ce565b61335c906008615645565b61ffff168482815181106133725761337261540d565b016020015160f81c901b919091179060010161333d565b5061ffff8116156133ac5760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613407576133c38160036156ce565b6133ce906008615645565b63ffffffff16856133e0836002615610565b815181106133f0576133f061540d565b016020015160f81c901b91909117906001016133af565b5063ffffffff81161561342c5760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156128345761344381601f6156ce565b61344e906008615645565b8661345a836006615610565b8151811061346a5761346a61540d565b016020015160f81c901b919091179060010161342f565b613489614f86565b5f8281525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff1660058111156134d6576134d6615186565b60058111156134e7576134e7615186565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355957613559615186565b146135b55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f9576135f9615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a585826124c1565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371f5760405162461bcd60e51b815260040161068a9061590c565b5f805b600281101561376e576137368160016156ce565b613741906008615645565b61ffff168582815181106137575761375761540d565b016020015160f81c901b9190911790600101613722565b5061ffff8116156137915760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156137ec576137a88160036156ce565b6137b3906008615645565b63ffffffff16866137c5836002615610565b815181106137d5576137d561540d565b016020015160f81c901b9190911790600101613794565b5063ffffffff81166003146138135760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156138685761382a81601f6156ce565b613835906008615645565b87613841836006615610565b815181106138515761385161540d565b016020015160f81c901b9190911790600101613816565b505f8660268151811061387d5761387d61540d565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba0833981519152816138b684610c6e565b90505f6138c28761215d565b90506138cd87612e4f565b61392a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b60028151600581111561393f5761393f615186565b1461399e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139af91906156ae565b600485015460408401519192506139d1916001600160401b03909116906159df565b6001600160401b0316816001600160401b03161115613a505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a5c8a846124c1565b915091505f8a83604051602001613a8a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2557613b25615186565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c775760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613cc657613c8e8160016156ce565b613c99906008615645565b61ffff16858281518110613caf57613caf61540d565b016020015160f81c901b9190911790600101613c7a565b5061ffff811615613ce95760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613d4457613d008160036156ce565b613d0b906008615645565b63ffffffff1686613d1d836002615610565b81518110613d2d57613d2d61540d565b016020015160f81c901b9190911790600101613cec565b5063ffffffff8116600514613d6b5760405162461bcd60e51b815260040161068a90615998565b5f805b6020811015613dc057613d8281601f6156ce565b613d8d906008615645565b87613d99836006615610565b81518110613da957613da961540d565b016020015160f81c901b9190911790600101613d6e565b505f805b6008811015613e1f57613dd88160076156ce565b613de3906008615645565b6001600160401b031688613df8836026615610565b81518110613e0857613e0861540d565b016020015160f81c901b9190911790600101613dc4565b5090969095509350505050565b5f80516020615be08339815191525f6001600160401b038084169085161115613e6057613e598385615264565b9050613e6d565b613e6a8484615264565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ecf575060028401548151613ecb916001600160401b031690615610565b8210155b15613ef5576001600160401b038316606082015281815260408101516020820152613f14565b8281606001818151613f0791906156ae565b6001600160401b03169052505b6060810151613f249060646159df565b602082015160028601546001600160401b039290921691613f4f9190600160401b900460ff16615645565b1015613fb35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fce9190615610565b9052506040810180516001600160401b0387169190613fee9083906156ce565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c208339815191526020526040812060020180545f80516020615be083398151915291600160401b9091046001600160401b031690600861408483615a0a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411357604051631afcd79f60e31b815260040160405180910390fd5b565b61411d6140ca565b61412681614781565b61412e61479a565b61284e608082013560a083013561414b60e0850160c0860161516d565b61415c610100860160e08701615a25565b61ffff1661417261012087016101008801615a3e565b614184610140880161012089016153ad565b6147aa565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be083398151915242614233604086016020870161516d565b6001600160401b0316116142a55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142b5604085016020860161516d565b6001600160401b03166142cb6202a30042615610565b1161433e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143965760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143c55760405162461bcd60e51b815260040161068a90615568565b60306143d46040860186615a5e565b9050146144395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614443835f613e2c565b5f806144dd6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614488919061516d565b6001600160401b031681526020016144a360408a018a615a5e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ee565b5f828152600786016020526040902091935091506144fb8282615ae4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145289085906004016152bd565b6020604051808303815f875af1158015614544573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145689190615284565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e0576145e0615186565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c0918e01908e0161516d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147115760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461475a576040519150601f19603f3d011682016040523d82523d5f602084013e61475f565b606091505b505090508061212757604051630a12f52160e11b815260040160405180910390fd5b6147896140ca565b614791614d9d565b61284e81614da5565b6147a26140ca565b614113614f47565b6147b26140ca565b5f80516020615ba08339815191528361481e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148405760405162461bcd60e51b815260040161068a906158c1565b858711156148a85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149155760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149875760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614acf57614a8f8160016156ce565b614a9a906008615645565b5081515f90839083908110614ab157614ab161540d565b60200101906001600160f81b03191690815f1a905350600101614a7b565b505f5b6004811015614b3757614ae68160036156ce565b614af1906008615645565b600160ff919091161c60f81b82614b09836002615610565b81518110614b1957614b1961540d565b60200101906001600160f81b03191690815f1a905350600101614ad2565b505f5b6020811015614b945784518160208110614b5657614b5661540d565b1a60f81b82614b66836006615610565b81518110614b7657614b7661540d565b60200101906001600160f81b03191690815f1a905350600101614b3a565b505f5b6020811015614bf45784602001518160208110614bb657614bb661540d565b1a60f81b82614bc6836026615610565b81518110614bd657614bd661540d565b60200101906001600160f81b03191690815f1a905350600101614b97565b505f5b6008811015614c6857614c0b8160076156ce565b614c16906008615645565b60ff1685604001516001600160401b0316901c60f81b82826046614c3a9190615610565b81518110614c4a57614c4a61540d565b60200101906001600160f81b03191690815f1a905350600101614bf7565b505f5b6030811015614cd35784608001518181518110614c8a57614c8a61540d565b01602001516001600160f81b03191682614ca583604e615610565b81518110614cb557614cb561540d565b60200101906001600160f81b03191690815f1a905350600101614c6b565b505f5b6008811015614d4557614cea8160076156ce565b614cf5906008615645565b60608601516001600160401b0390811691161c60f81b82614d1783607e615610565b81518110614d2757614d2761540d565b60200101906001600160f81b03191690815f1a905350600101614cd6565b50600281604051614d5691906155ff565b602060405180830381855afa158015614d71573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d949190615284565b94909350915050565b6141136140ca565b614dad6140ca565b80355f80516020615be083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df96080840160608501615a3e565b60ff161115614e665760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e776080840160608501615a3e565b60ff1611614edf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614eef6080830160608401615a3e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f20606083016040840161516d565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af26140ca565b508054614f5b906156e1565b5f825580601f10614f6a575050565b601f0160209004905f5260205f209081019061284e9190614fc2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd6575f8155600101614fc3565b5090565b801515811461284e575f80fd5b803563ffffffff81168114612158575f80fd5b5f805f6060848603121561500c575f80fd5b83359250602084013561501e81614fda565b915061502c60408501614fe7565b90509250925092565b5f60208284031215615045575f80fd5b5035919050565b5f610140828403121561505d575f80fd5b50919050565b803561ffff81168114612158575f80fd5b80356001600160401b0381168114612158575f80fd5b5f805f6060848603121561509c575f80fd5b83356001600160401b038111156150b1575f80fd5b8401606081870312156150c2575f80fd5b92506150d060208501615063565b915061502c60408501615074565b5f602082840312156150ee575f80fd5b610cb182614fe7565b5f8060408385031215615108575f80fd5b61511183614fe7565b946020939093013593505050565b5f8060408385031215615130575f80fd5b82356001600160401b03811115615145575f80fd5b830160808186031215615156575f80fd5b915061516460208401614fe7565b90509250929050565b5f6020828403121561517d575f80fd5b610cb182615074565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f860608401826001600160401b03169052565b50608083015161521360808401826001600160401b03169052565b5060a083015161522e60a08401826001600160401b03169052565b5060c083015161524960c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524957615249615250565b5f60208284031215615294575f80fd5b5051919050565b5f5b838110156152b557818101518382015260200161529d565b50505f910152565b602081525f82518060208401526152db81604085016020870161529b565b601f01601f19169190910160400192915050565b5f8261530957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284e575f80fd5b5f602082840312156153bd575f80fd5b8135610cb181615399565b5f808335601e198436030181126153dd575f80fd5b8301803591506001600160401b038211156153f6575f80fd5b6020019150600581901b3603821315612611575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615435575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154755761547561543f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a3576154a361543f565b604052919050565b5f6001600160401b038211156154c3576154c361543f565b50601f01601f191660200190565b5f606082360312156154e1575f80fd5b6154e9615453565b8235815260206154fa818501615074565b8183015260408401356001600160401b03811115615516575f80fd5b840136601f820112615526575f80fd5b8035615539615534826154ab565b61547b565b818152368483850101111561554c575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c1818460208a0161529b565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f181602884016020880161529b565b016028019695505050505050565b5f825161543581846020870161529b565b80820180821115610c7e57610c7e615250565b5f63ffffffff80831681810361563b5761563b615250565b6001019392505050565b8082028115828204841417610c7e57610c7e615250565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524957615249615250565b81810381811115610c7e57610c7e615250565b600181811c908216806156f557607f821691505b60208210810361505d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576c816156e1565b806020870152604060018084165f811461578d57600181146157a9576157d6565b60ff19851660408a0152604084151560051b8a010195506157d6565b895f5260205f205f5b858110156157cd5781548b82018601529083019088016157b2565b8a016040019650505b509398975050505050505050565b805161215881614fda565b5f8060408385031215615800575f80fd5b82516001600160401b0380821115615816575f80fd5b9084019060608287031215615829575f80fd5b615831615453565b8251815260208084015161584481615399565b82820152604084015183811115615859575f80fd5b80850194505087601f85011261586d575f80fd5b8351925061587d615534846154ab565b8381528882858701011115615890575f80fd5b61589f8483830184880161529b565b806040840152508195506158b48188016157e4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0257615a02615250565b505092915050565b5f6001600160401b0380831681810361563b5761563b615250565b5f60208284031215615a35575f80fd5b610cb182615063565b5f60208284031215615a4e575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a73575f80fd5b8301803591506001600160401b03821115615a8c575f80fd5b602001915036819003821315612611575f80fd5b601f82111561212757805f5260205f20601f840160051c81016020851015615ac55750805b601f840160051c820191505b81811015610d51575f8155600101615ad1565b81516001600160401b03811115615afd57615afd61543f565b615b1181615b0b84546156e1565b84615aa0565b602080601f831160018114615b44575f8415615b2d5750858301515b5f19600386901b1c1916600185901b178555612ee8565b5f85815260208120601f198616915b82811015615b7257888601518255948401946001909101908401615b53565b5085821015615b8f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d9f380380615d9f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c528061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615000565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461503b565b6109d8565b3480156101e4575f80fd5b506102236101f336600461503b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615052565b610b91565b348015610286575f80fd5b5061029a61029536600461503b565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615090565b610c84565b34801561032a575f80fd5b506101b86103393660046150e4565b610cb8565b348015610349575f80fd5b506101b86103583660046150fd565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615125565b610f2d565b3480156103b0575f80fd5b506102236103bf366004615173565b611561565b3480156103cf575f80fd5b5061029a6103de36600461503b565b61157a565b3480156103ee575f80fd5b506101b86103fd366004615000565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461503b565b6117d1565b348015610440575f80fd5b506101b861044f3660046150fd565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150e4565b611be0565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461503b565b611d98565b3480156104b7575f80fd5b506101b86104c636600461503b565b61201e565b6102236104d936600461503b565b612132565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461503b565b612163565b60405161022d91906151a0565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff1660048111156105955761059561518c565b60048111156105a6576105a661518c565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a82612163565b90506002835160048111156106415761064161518c565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f9060029060058111156107145761071461518c565b0361076b57861561072c57610729838761222b565b90505b5f84606001518360800151610741919061526a565b905061074d84826124c7565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610873919061528a565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b261518c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff166005811115610a2557610a2561518c565b6005811115610a3657610a3661518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa561518c565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f61261e565b6040518263ffffffff1660e01b8152600401610b4b91906152c3565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b919061528a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2283612843565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152f5565b92915050565b5f610c8d612857565b610c998484843461288e565b9050610cb160015f80516020615c0683398151915255565b9392505050565b5f80516020615ba68339815191525f80610cd184612b0b565b91509150610cde82612e55565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d1661518c565b03610d3b575f83815260088501602052604081208054919055610d398282612e90565b505b610d5181610d4c8460400151611561565b612ef6565b5050505050565b5f80516020615ba68339815191525f610d7084612f09565b90505f80610d8183604001516130e3565b50915091505f610d9083612163565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a90615314565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615356565b60015f87815260068701602052604090205460ff166004811115610e3357610e3361518c565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be68339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611031919061528a565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153b3565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153ce565b91505f90508435602086013560146111426060890160408a016153b3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153ce565b8363ffffffff168181106111d8576111d8615413565b90506020028101906111ea9190615427565b6111f3906154d7565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a9061556e565b84825f01518360200151846040015160405160200161124894939291906155b6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615605565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d4919061528a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113605761136061518c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615616565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615629565b90506111a6565b50600584018190555f61148386612f09565b90505f611493826040015161331e565b9050806002856040516114a69190615605565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e4919061528a565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a5100061564b565b5f61158482612163565b6080015192915050565b5f80516020615ba68339815191525f6115a685613487565b90506115b185612e55565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a90615662565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156b4565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b4868561222b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a5919061528a565b5f878152600885016020526040812080549091906117c4908490615616565b9091555050505050505050565b5f80516020615ba68339815191525f6117e983612163565b90506004815160058111156118005761180061518c565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a90615662565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e90565b6118df612857565b5f80516020615ba68339815191525f6118f784612f09565b90505f8061190883604001516130e3565b50915091505f61191783612163565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119515761195161518c565b60048111156119625761196261518c565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a90615314565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615356565b600381516004811115611a9157611a9161518c565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615bc68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff168461564b565b611b3091906152f5565b905080886008015f8881526020019081526020015f205f828254611b549190615616565b90915550506020830151611b7190611b6c83856156d4565b612e90565b611b868360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bdc60015f80516020615c0683398151915255565b5050565b5f80516020615be68339815191525f611bf883612f09565b90505f80611c098360400151613702565b9150915080611c6b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c85906156e7565b9050118015611cb7575060015f83815260088601602052604090205460ff166005811115611cb557611cb561518c565b145b611cd35760405162461bcd60e51b815260040161068a90615719565b5f8281526007850160205260408120611ceb91614f55565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff166004811115611df957611df961518c565b6004811115611e0a57611e0a61518c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e9157611e9161518c565b1480611eaf5750600381516004811115611ead57611ead61518c565b145b611f035760405162461bcd60e51b815260206004820152603260248201525f80516020615bc6833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f118260400151612163565b905080606001516001600160401b03165f03611f955760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fc284604001518460600151856080015161261e565b6040518263ffffffff1660e01b8152600401611fde91906152c3565b6020604051808303815f875af1158015611ffa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d51919061528a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be6833981519152929190612066906156e7565b9050118015612098575060015f83815260088301602052604090205460ff1660058111156120965761209661518c565b145b6120b45760405162461bcd60e51b815260040161068a90615719565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120ed9190600401615760565b6020604051808303815f875af1158015612109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212d919061528a565b505050565b5f61213b612857565b6121468233346138a3565b905061215e60015f80516020615c0683398151915255565b919050565b61216b614f8c565b5f8281525f80516020615c26833981519152602052604090819020815160e0810190925280545f80516020615be6833981519152929190829060ff1660058111156121b8576121b861518c565b60058111156121c9576121c961518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229d91908101906157f5565b91509150806123005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612343573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612367919061528a565b8251146123cb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b0316156124415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f806124508460400151613c5a565b915091508187146124bd5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c26833981519152602052604081206002015481905f80516020615be683398151915290600160801b90046001600160401b031661250f8582613e32565b5f61251987614040565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125698a858b61261e565b6040518263ffffffff1660e01b815260040161258591906152c3565b6020604051808303815f875af11580156125a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c5919061528a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612697576126578160016156d4565b61266290600861564b565b5081515f9083908390811061267957612679615413565b60200101906001600160f81b03191690815f1a905350600101612643565b505f5b6004811015612702576126ae8160036156d4565b6126b990600861564b565b600263ffffffff16901c60f81b828260026126d49190615616565b815181106126e4576126e4615413565b60200101906001600160f81b03191690815f1a90535060010161269a565b505f5b60208110156127645761271981601f6156d4565b61272490600861564b565b86901c60f81b82612736836006615616565b8151811061274657612746615413565b60200101906001600160f81b03191690815f1a905350600101612705565b505f5b60088110156127cf5761277b8160076156d4565b61278690600861564b565b6001600160401b038616901c60f81b826127a1836026615616565b815181106127b1576127b1615413565b60200101906001600160f81b03191690815f1a905350600101612767565b505f5b600881101561283a576127e68160076156d4565b6127f190600861564b565b6001600160401b038516901c60f81b8261280c83602e615616565b8151811061281c5761281c615413565b60200101906001600160f81b03191690815f1a9053506001016127d2565b50949350505050565b61284b6140d0565b6128548161411b565b50565b5f80516020615c0683398151915280546001190161288857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba68339815191529061ffff8616108015906128da575061271061ffff861611155b6128f65760405162461bcd60e51b815260040161068a906158c7565b60028101546001600160401b03908116908516101561296f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a395760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a4482610c6e565b90505f612a51898361418f565b90506040518060600160405280612a653390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0683398151915255565b5f612b14614f8c565b5f80516020615be68339815191525f612b2c85612f09565b90505f80612b3d8360400151613702565b915091508015612ba25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bd357612bd361518c565b6005811115612be457612be461518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c5557612c5561518c565b1480612c735750600182516005811115612c7157612c7161518c565b145b612cd25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce757612ce761518c565b03612cf457506004612cf8565b5060055b6020808301515f90815260098801909152604081205581816005811115612d2157612d2161518c565b90816005811115612d3457612d3461518c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6857612d6861518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1c57612e1c61518c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612edc575f80fd5b505af1158015612eee573d5f803e3d5ffd5b505050505050565b611bdc6001600160a01b038316826146f4565b60408051606080820183525f8083526020830181905292820152905f80516020615be68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f7e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fa591908101906157f5565b91509150806130055760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131075760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156131565761311e8160016156d4565b61312990600861564b565b61ffff1686828151811061313f5761313f615413565b016020015160f81c901b919091179060010161310a565b5061ffff8116156131795760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156131d4576131908160036156d4565b61319b90600861564b565b63ffffffff16876131ad836002615616565b815181106131bd576131bd615413565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166004146131fb5760405162461bcd60e51b815260040161068a9061599e565b5f805b60208110156132505761321281601f6156d4565b61321d90600861564b565b88613229836006615616565b8151811061323957613239615413565b016020015160f81c901b91909117906001016131fe565b505f805b60088110156132af576132688160076156d4565b61327390600861564b565b6001600160401b031689613288836026615616565b8151811061329857613298615413565b016020015160f81c901b9190911790600101613254565b505f805b600881101561330e576132c78160076156d4565b6132d290600861564b565b6001600160401b03168a6132e783602e615616565b815181106132f7576132f7615413565b016020015160f81c901b91909117906001016132b3565b5091989097509095509350505050565b5f81516026146133405760405162461bcd60e51b815260040161068a90615912565b5f805b600281101561338f576133578160016156d4565b61336290600861564b565b61ffff1684828151811061337857613378615413565b016020015160f81c901b9190911790600101613343565b5061ffff8116156133b25760405162461bcd60e51b815260040161068a9061595b565b5f805b600481101561340d576133c98160036156d4565b6133d490600861564b565b63ffffffff16856133e6836002615616565b815181106133f6576133f6615413565b016020015160f81c901b91909117906001016133b5565b5063ffffffff8116156134325760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561283a5761344981601f6156d4565b61345490600861564b565b86613460836006615616565b8151811061347057613470615413565b016020015160f81c901b9190911790600101613435565b61348f614f8c565b5f8281525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff1660058111156134dc576134dc61518c565b60058111156134ed576134ed61518c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355f5761355f61518c565b146135bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135ff576135ff61518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136ab85826124c7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137255760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156137745761373c8160016156d4565b61374790600861564b565b61ffff1685828151811061375d5761375d615413565b016020015160f81c901b9190911790600101613728565b5061ffff8116156137975760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156137f2576137ae8160036156d4565b6137b990600861564b565b63ffffffff16866137cb836002615616565b815181106137db576137db615413565b016020015160f81c901b919091179060010161379a565b5063ffffffff81166003146138195760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561386e5761383081601f6156d4565b61383b90600861564b565b87613847836006615616565b8151811061385757613857615413565b016020015160f81c901b919091179060010161381c565b505f8660268151811061388357613883615413565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba6833981519152816138bc84610c6e565b90505f6138c887612163565b90506138d387612e55565b6139305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b6002815160058111156139455761394561518c565b146139a45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139b591906156b4565b600485015460408401519192506139d7916001600160401b03909116906159e5565b6001600160401b0316816001600160401b03161115613a565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a628a846124c7565b915091505f8a83604051602001613a9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2b57613b2b61518c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c7d5760405162461bcd60e51b815260040161068a90615912565b5f805b6002811015613ccc57613c948160016156d4565b613c9f90600861564b565b61ffff16858281518110613cb557613cb5615413565b016020015160f81c901b9190911790600101613c80565b5061ffff811615613cef5760405162461bcd60e51b815260040161068a9061595b565b5f805b6004811015613d4a57613d068160036156d4565b613d1190600861564b565b63ffffffff1686613d23836002615616565b81518110613d3357613d33615413565b016020015160f81c901b9190911790600101613cf2565b5063ffffffff8116600514613d715760405162461bcd60e51b815260040161068a9061599e565b5f805b6020811015613dc657613d8881601f6156d4565b613d9390600861564b565b87613d9f836006615616565b81518110613daf57613daf615413565b016020015160f81c901b9190911790600101613d74565b505f805b6008811015613e2557613dde8160076156d4565b613de990600861564b565b6001600160401b031688613dfe836026615616565b81518110613e0e57613e0e615413565b016020015160f81c901b9190911790600101613dca565b5090969095509350505050565b5f80516020615be68339815191525f6001600160401b038084169085161115613e6657613e5f838561526a565b9050613e73565b613e70848461526a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ed5575060028401548151613ed1916001600160401b031690615616565b8210155b15613efb576001600160401b038316606082015281815260408101516020820152613f1a565b8281606001818151613f0d91906156b4565b6001600160401b03169052505b6060810151613f2a9060646159e5565b602082015160028601546001600160401b039290921691613f559190600160401b900460ff1661564b565b1015613fb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fd49190615616565b9052506040810180516001600160401b0387169190613ff49083906156d4565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c268339815191526020526040812060020180545f80516020615be683398151915291600160401b9091046001600160401b031690600861408a83615a10565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411957604051631afcd79f60e31b815260040160405180910390fd5b565b6141236140d0565b61412c81614787565b6141346147a0565b612854608082013560a083013561415160e0850160c08601615173565b614162610100860160e08701615a2b565b61ffff1661417861012087016101008801615a44565b61418a610140880161012089016153b3565b6147b0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661421a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be6833981519152426142396040860160208701615173565b6001600160401b0316116142ab5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142bb6040850160208601615173565b6001600160401b03166142d16202a30042615616565b116143445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b833561439c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143cb5760405162461bcd60e51b815260040161068a9061556e565b60306143da6040860186615a64565b90501461443f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614449835f613e32565b5f806144e36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061448e9190615173565b6001600160401b031681526020016144a960408a018a615a64565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149f4565b5f828152600786016020526040902091935091506145018282615aea565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061452e9085906004016152c3565b6020604051808303815f875af115801561454a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456e919061528a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e6576145e661518c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c6918e01908e01615173565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147175760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614760576040519150601f19603f3d011682016040523d82523d5f602084013e614765565b606091505b505090508061212d57604051630a12f52160e11b815260040160405180910390fd5b61478f6140d0565b614797614da3565b61285481614dab565b6147a86140d0565b614119614f4d565b6147b86140d0565b5f80516020615ba6833981519152836148245760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148465760405162461bcd60e51b815260040161068a906158c7565b858711156148ae5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff161161491b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff8416111561498d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a5e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ad557614a958160016156d4565b614aa090600861564b565b5081515f90839083908110614ab757614ab7615413565b60200101906001600160f81b03191690815f1a905350600101614a81565b505f5b6004811015614b3d57614aec8160036156d4565b614af790600861564b565b600160ff919091161c60f81b82614b0f836002615616565b81518110614b1f57614b1f615413565b60200101906001600160f81b03191690815f1a905350600101614ad8565b505f5b6020811015614b9a5784518160208110614b5c57614b5c615413565b1a60f81b82614b6c836006615616565b81518110614b7c57614b7c615413565b60200101906001600160f81b03191690815f1a905350600101614b40565b505f5b6020811015614bfa5784602001518160208110614bbc57614bbc615413565b1a60f81b82614bcc836026615616565b81518110614bdc57614bdc615413565b60200101906001600160f81b03191690815f1a905350600101614b9d565b505f5b6008811015614c6e57614c118160076156d4565b614c1c90600861564b565b60ff1685604001516001600160401b0316901c60f81b82826046614c409190615616565b81518110614c5057614c50615413565b60200101906001600160f81b03191690815f1a905350600101614bfd565b505f5b6030811015614cd95784608001518181518110614c9057614c90615413565b01602001516001600160f81b03191682614cab83604e615616565b81518110614cbb57614cbb615413565b60200101906001600160f81b03191690815f1a905350600101614c71565b505f5b6008811015614d4b57614cf08160076156d4565b614cfb90600861564b565b60608601516001600160401b0390811691161c60f81b82614d1d83607e615616565b81518110614d2d57614d2d615413565b60200101906001600160f81b03191690815f1a905350600101614cdc565b50600281604051614d5c9190615605565b602060405180830381855afa158015614d77573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d9a919061528a565b94909350915050565b6141196140d0565b614db36140d0565b80355f80516020615be683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614dff6080840160608501615a44565b60ff161115614e6c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e7d6080840160608501615a44565b60ff1611614ee55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614ef56080830160608401615a44565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f266060830160408401615173565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af86140d0565b508054614f61906156e7565b5f825580601f10614f70575050565b601f0160209004905f5260205f20908101906128549190614fc8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fdc575f8155600101614fc9565b5090565b8015158114612854575f80fd5b803563ffffffff8116811461215e575f80fd5b5f805f60608486031215615012575f80fd5b83359250602084013561502481614fe0565b915061503260408501614fed565b90509250925092565b5f6020828403121561504b575f80fd5b5035919050565b5f6101408284031215615063575f80fd5b50919050565b803561ffff8116811461215e575f80fd5b80356001600160401b038116811461215e575f80fd5b5f805f606084860312156150a2575f80fd5b83356001600160401b038111156150b7575f80fd5b8401606081870312156150c8575f80fd5b92506150d660208501615069565b91506150326040850161507a565b5f602082840312156150f4575f80fd5b610cb182614fed565b5f806040838503121561510e575f80fd5b61511783614fed565b946020939093013593505050565b5f8060408385031215615136575f80fd5b82356001600160401b0381111561514b575f80fd5b83016080818603121561515c575f80fd5b915061516a60208401614fed565b90509250929050565b5f60208284031215615183575f80fd5b610cb18261507a565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151c357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151fe60608401826001600160401b03169052565b50608083015161521960808401826001600160401b03169052565b5060a083015161523460a08401826001600160401b03169052565b5060c083015161524f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524f5761524f615256565b5f6020828403121561529a575f80fd5b5051919050565b5f5b838110156152bb5781810151838201526020016152a3565b50505f910152565b602081525f82518060208401526152e18160408501602087016152a1565b601f01601f19169190910160400192915050565b5f8261530f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612854575f80fd5b5f602082840312156153c3575f80fd5b8135610cb18161539f565b5f808335601e198436030181126153e3575f80fd5b8301803591506001600160401b038211156153fc575f80fd5b6020019150600581901b3603821315612617575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261543b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561547b5761547b615445565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a9576154a9615445565b604052919050565b5f6001600160401b038211156154c9576154c9615445565b50601f01601f191660200190565b5f606082360312156154e7575f80fd5b6154ef615459565b82358152602061550081850161507a565b8183015260408401356001600160401b0381111561551c575f80fd5b840136601f82011261552c575f80fd5b803561553f61553a826154b1565b615481565b8181523684838501011115615552575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c7818460208a016152a1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f78160288401602088016152a1565b016028019695505050505050565b5f825161543b8184602087016152a1565b80820180821115610c7e57610c7e615256565b5f63ffffffff80831681810361564157615641615256565b6001019392505050565b8082028115828204841417610c7e57610c7e615256565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524f5761524f615256565b81810381811115610c7e57610c7e615256565b600181811c908216806156fb57607f821691505b60208210810361506357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615772816156e7565b806020870152604060018084165f811461579357600181146157af576157dc565b60ff19851660408a0152604084151560051b8a010195506157dc565b895f5260205f205f5b858110156157d35781548b82018601529083019088016157b8565b8a016040019650505b509398975050505050505050565b805161215e81614fe0565b5f8060408385031215615806575f80fd5b82516001600160401b038082111561581c575f80fd5b908401906060828703121561582f575f80fd5b615837615459565b8251815260208084015161584a8161539f565b8282015260408401518381111561585f575f80fd5b80850194505087601f850112615873575f80fd5b8351925061588361553a846154b1565b8381528882858701011115615896575f80fd5b6158a5848383018488016152a1565b806040840152508195506158ba8188016157ea565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0857615a08615256565b505092915050565b5f6001600160401b0380831681810361564157615641615256565b5f60208284031215615a3b575f80fd5b610cb182615069565b5f60208284031215615a54575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a79575f80fd5b8301803591506001600160401b03821115615a92575f80fd5b602001915036819003821315612617575f80fd5b601f82111561212d57805f5260205f20601f840160051c81016020851015615acb5750805b601f840160051c820191505b81811015610d51575f8155600101615ad7565b81516001600160401b03811115615b0357615b03615445565b615b1781615b1184546156e7565b84615aa6565b602080601f831160018114615b4a575f8415615b335750858301515b5f19600386901b1c1916600185901b178555612eee565b5f85815260208120601f198616915b82811015615b7857888601518255948401946001909101908401615b59565b5085821015615b9557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 8a7026f58..ee6af6395 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -164,17 +164,17 @@ abstract contract PoSValidatorManager is Validator memory validator = _initializeEndValidation(validationID); - if (_isPoSValidator(validationID)) { - // PoS validations can only be ended by their owners. - require( - $._validatorRequirements[validationID].owner == _msgSender(), - "PoSValidatorManager: validator not owned by sender" - ); - } else { - // Non-PoS validations can be ended by anyone, and do not get rewards, so return here. + // Non-PoS validators are required to boostrap the network, but are not eligible for rewards. + if (!_isPoSValidator(validationID)) { return; } + // PoS validations can only be ended by their owners. + require( + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + // Check that minimum stake duration has passed. require( validator.endedAt From db44dab675b92580e83100ceed47ddccc76067ac Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 10:13:34 -0400 Subject: [PATCH 35/36] Emit rewards and fees on delegator exit --- .../ERC20TokenStakingManager.go | 18 +++++++++------- .../NativeTokenStakingManager.go | 18 +++++++++------- contracts/staking/PoSValidatorManager.sol | 5 +++-- .../interfaces/IPoSValidatorManager.sol | 6 +++++- .../tests/PoSValidatorManagerTests.t.sol | 21 +++++++++++++------ 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 7d787d8c7..cebf9195c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,8 +83,8 @@ 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160e13803806160e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152a5565b6103ec565b005b61019e6101ae3660046152e0565b610890565b6101f16101c13660046152e0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152e0565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461530b565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615349565b610b3e565b61019e610299366004615362565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461538a565b610db3565b6101f16102dc3660046153ee565b6113e7565b6102316102ef3660046152e0565b611400565b61019e6103023660046152a5565b611414565b61020c603081565b61019e61031d3660046152e0565b611657565b61019e610330366004615362565b61175d565b6101f1610343366004615407565b611a66565b61019e610356366004615349565b611a92565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152e0565b611c4a565b61019e6103a23660046152e0565b611ed0565b61020c601481565b6103c26103bd3660046152e0565b611fe4565b6040516101fb919061543b565b6102316202a30081565b6101f16103e7366004615502565b6120ac565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff16600481111561044d5761044d615427565b600481111561045e5761045e615427565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fe4565b90506002835160048111156104f9576104f9615427565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f088339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f088339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615427565b036106235786156105e4576105e183876120e1565b90505b5f846060015183608001516105f9919061557b565b9050610605848261237d565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b919061559b565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615427565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff1660058111156108dd576108dd615427565b60058111156108ee576108ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615427565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124d4565b6040518263ffffffff1660e01b8152600401610a0391906155d4565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a43919061559b565b50505050565b5f610a5964e8d4a5100083615606565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126fb565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee88339815191525f80610b5784612715565b91509150610b6482612a5f565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615427565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a9a565b505b610bd781610bd284604001516113e7565b612b10565b5050505050565b5f80516020615ee88339815191525f610bf684612b33565b90505f80610c078360400151612d0d565b50915091505f610c1683611fe4565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615625565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615667565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615427565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f288339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb7919061559b565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156b0565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156cb565b91505f9050843560208601356014610fc86060890160408a016156b0565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156cb565b8363ffffffff1681811061105e5761105e615710565b90506020028101906110709190615724565b611079906157d4565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b81526004016105429061586b565b84825f0151836020015184604001516040516020016110ce94939291906158b3565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c9190615902565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a919061559b565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615427565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611299911686615913565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615926565b905061102c565b50600584018190555f61130986612b33565b90505f6113198260400151612f48565b90508060028560405161132c9190615902565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a919061559b565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615948565b5f61140a82611fe4565b6080015192915050565b5f80516020615ee88339815191525f61142c856130ba565b905061143785612a5f565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061595f565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159b1565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120e1565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b919061559b565b5f8781526008850160205260408120805490919061164a908490615913565b9091555050505050505050565b5f80516020615ee88339815191525f61166f83611fe4565b905060048151600581111561168657611686615427565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061595f565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a9a565b611765613335565b5f80516020615ee88339815191525f61177d84612b33565b90505f8061178e8360400151612d0d565b50915091505f61179d83611fe4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615427565b60048111156117e8576117e8615427565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615625565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615667565b60038151600481111561191757611917615427565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f088339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615948565b6119b69190615606565b905080886008015f8881526020019081526020015f205f8282546119da9190615913565b909155505060208301516119f7906119f283856159d1565b612a9a565b611a0c8360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a6260015f80516020615f4883398151915255565b5050565b5f611a6f613335565b611a7a83338461337f565b9050610a5960015f80516020615f4883398151915255565b5f80516020615f288339815191525f611aaa83612b33565b90505f80611abb8360400151613739565b9150915080611b1d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b37906159e4565b9050118015611b69575060015f83815260088601602052604090205460ff166005811115611b6757611b67615427565b145b611b855760405162461bcd60e51b815260040161054290615a1c565b5f8281526007850160205260408120611b9d916151f5565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff166004811115611cab57611cab615427565b6004811115611cbc57611cbc615427565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d4357611d43615427565b1480611d615750600381516004811115611d5f57611d5f615427565b145b611db55760405162461bcd60e51b815260206004820152603260248201525f80516020615f08833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dc38260400151611fe4565b905080606001516001600160401b03165f03611e475760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e748460400151846060015185608001516124d4565b6040518263ffffffff1660e01b8152600401611e9091906155d4565b6020604051808303815f875af1158015611eac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd7919061559b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f28833981519152929190611f18906159e4565b9050118015611f4a575060015f83815260088301602052604090205460ff166005811115611f4857611f48615427565b145b611f665760405162461bcd60e51b815260040161054290615a1c565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f9f9190600401615a63565b6020604051808303815f875af1158015611fbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdf919061559b565b505050565b611fec61522c565b5f8281525f80516020615f68833981519152602052604090819020815160e0810190925280545f80516020615f28833981519152929190829060ff16600581111561203957612039615427565b600581111561204a5761204a615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120b5613335565b6120c1858585856138da565b90506120d960015f80516020615f4883398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561212c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121539190810190615af8565b91509150806121b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221d919061559b565b8251146122815760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123068460400151613b4f565b915091508187146123735760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f68833981519152602052604081206002015481905f80516020615f2883398151915290600160801b90046001600160401b03166123c58582613d27565b5f6123cf87613f35565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241f8a858b6124d4565b6040518263ffffffff1660e01b815260040161243b91906155d4565b6020604051808303815f875af1158015612457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247b919061559b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561254d5761250d8160016159d1565b612518906008615948565b5081515f9083908390811061252f5761252f615710565b60200101906001600160f81b03191690815f1a9053506001016124f9565b505f5b60048110156125b8576125648160036159d1565b61256f906008615948565b600263ffffffff16901c60f81b8282600261258a9190615913565b8151811061259a5761259a615710565b60200101906001600160f81b03191690815f1a905350600101612550565b505f5b602081101561261a576125cf81601f6159d1565b6125da906008615948565b86901c60f81b826125ec836006615913565b815181106125fc576125fc615710565b60200101906001600160f81b03191690815f1a9053506001016125bb565b505f5b6008811015612685576126318160076159d1565b61263c906008615948565b6001600160401b038616901c60f81b82612657836026615913565b8151811061266757612667615710565b60200101906001600160f81b03191690815f1a90535060010161261d565b505f5b60088110156126f05761269c8160076159d1565b6126a7906008615948565b6001600160401b038516901c60f81b826126c283602e615913565b815181106126d2576126d2615710565b60200101906001600160f81b03191690815f1a905350600101612688565b5090505b9392505050565b612703613fc5565b61270c82614010565b611a6281614087565b5f61271e61522c565b5f80516020615f288339815191525f61273685612b33565b90505f806127478360400151613739565b9150915080156127ac5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127dd576127dd615427565b60058111156127ee576127ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285f5761285f615427565b148061287d575060018251600581111561287b5761287b615427565b145b6128dc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128f1576128f1615427565b036128fe57506004612902565b5060055b6020808301515f9081526009880190915260408120558181600581111561292b5761292b615427565b9081600581111561293e5761293e615427565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561297257612972615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2657612a26615427565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612af5575f80fd5b505af1158015612b07573d5f803e3d5ffd5b50505050505050565b5f80516020615ec883398151915254611a62906001600160a01b03168383614128565b60408051606080820183525f8083526020830181905292820152905f80516020615f288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bcf9190810190615af8565b9150915080612c2f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c925760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d055760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d315760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612d8057612d488160016159d1565b612d53906008615948565b61ffff16868281518110612d6957612d69615710565b016020015160f81c901b9190911790600101612d34565b5061ffff811615612da35760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015612dfe57612dba8160036159d1565b612dc5906008615948565b63ffffffff1687612dd7836002615913565b81518110612de757612de7615710565b016020015160f81c901b9190911790600101612da6565b5063ffffffff8116600414612e255760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015612e7a57612e3c81601f6159d1565b612e47906008615948565b88612e53836006615913565b81518110612e6357612e63615710565b016020015160f81c901b9190911790600101612e28565b505f805b6008811015612ed957612e928160076159d1565b612e9d906008615948565b6001600160401b031689612eb2836026615913565b81518110612ec257612ec2615710565b016020015160f81c901b9190911790600101612e7e565b505f805b6008811015612f3857612ef18160076159d1565b612efc906008615948565b6001600160401b03168a612f1183602e615913565b81518110612f2157612f21615710565b016020015160f81c901b9190911790600101612edd565b5091989097509095509350505050565b5f8151602614612f6a5760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612fb957612f818160016159d1565b612f8c906008615948565b61ffff16848281518110612fa257612fa2615710565b016020015160f81c901b9190911790600101612f6d565b5061ffff811615612fdc5760405162461bcd60e51b815260040161054290615c13565b5f805b600481101561303757612ff38160036159d1565b612ffe906008615948565b63ffffffff1685613010836002615913565b8151811061302057613020615710565b016020015160f81c901b9190911790600101612fdf565b5063ffffffff81161561305c5760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156130b15761307381601f6159d1565b61307e906008615948565b8661308a836006615913565b8151811061309a5761309a615710565b016020015160f81c901b919091179060010161305f565b50949350505050565b6130c261522c565b5f8281525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff16600581111561310f5761310f615427565b600581111561312057613120615427565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561319257613192615427565b146131ee5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561323257613232615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132de858261237d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4883398151915280546001190161336657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4883398151915255565b5f5f80516020615ee88339815191528161339b61022c85614187565b90505f6133a787611fe4565b90506133b287612a5f565b61340f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561342457613424615427565b146134835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161349491906159b1565b600485015460408401519192506134b6916001600160401b0390911690615c9d565b6001600160401b0316816001600160401b031611156135355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f806135418a8461237d565b915091505f8a8360405160200161356f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360a5761360a615427565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461375c5760405162461bcd60e51b815260040161054290615bca565b5f805b60028110156137ab576137738160016159d1565b61377e906008615948565b61ffff1685828151811061379457613794615710565b016020015160f81c901b919091179060010161375f565b5061ffff8116156137ce5760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613829576137e58160036159d1565b6137f0906008615948565b63ffffffff1686613802836002615913565b8151811061381257613812615710565b016020015160f81c901b91909117906001016137d1565b5063ffffffff81166003146138505760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156138a55761386781601f6159d1565b613872906008615948565b8761387e836006615913565b8151811061388e5761388e615710565b016020015160f81c901b9190911790600101613853565b505f866026815181106138ba576138ba615710565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee88339815191529061ffff861610801590613926575061271061ffff861611155b6139425760405162461bcd60e51b815260040161054290615cc8565b60028101546001600160401b0390811690851610156139bb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a855760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8f84614187565b90505f613a9b82610a49565b90505f613aa889836141aa565b90506040518060600160405280613abc3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b725760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015613bc157613b898160016159d1565b613b94906008615948565b61ffff16858281518110613baa57613baa615710565b016020015160f81c901b9190911790600101613b75565b5061ffff811615613be45760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613c3f57613bfb8160036159d1565b613c06906008615948565b63ffffffff1686613c18836002615913565b81518110613c2857613c28615710565b016020015160f81c901b9190911790600101613be7565b5063ffffffff8116600514613c665760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015613cbb57613c7d81601f6159d1565b613c88906008615948565b87613c94836006615913565b81518110613ca457613ca4615710565b016020015160f81c901b9190911790600101613c69565b505f805b6008811015613d1a57613cd38160076159d1565b613cde906008615948565b6001600160401b031688613cf3836026615913565b81518110613d0357613d03615710565b016020015160f81c901b9190911790600101613cbf565b5090969095509350505050565b5f80516020615f288339815191525f6001600160401b038084169085161115613d5b57613d54838561557b565b9050613d68565b613d65848461557b565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dca575060028401548151613dc6916001600160401b031690615913565b8210155b15613df0576001600160401b038316606082015281815260408101516020820152613e0f565b8281606001818151613e0291906159b1565b6001600160401b03169052505b6060810151613e1f906064615c9d565b602082015160028601546001600160401b039290921691613e4a9190600160401b900460ff16615948565b1015613eae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec99190615913565b9052506040810180516001600160401b0387169190613ee99083906159d1565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f688339815191526020526040812060020180545f80516020615f2883398151915291600160401b9091046001600160401b0316906008613f7f83615d13565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400e57604051631afcd79f60e31b815260040160405180910390fd5b565b614018613fc5565b6140218161470f565b614029614728565b614084608082013560a083013561404660e0850160c086016153ee565b614057610100860160e08701615d2e565b61ffff1661406d61012087016101008801615d47565b61407f610140880161012089016156b0565b614738565b50565b61408f613fc5565b5f80516020615ec88339815191526001600160a01b0382166141085760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fdf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061497c565b5f610a59825f80516020615ec8833981519152546001600160a01b0316906149dd565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f288339815191524261425460408601602087016153ee565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d660408501602086016153ee565b6001600160401b03166142ec6202a30042615913565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b81526004016105429061586b565b60306143f56040860186615d67565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b614464835f613d27565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a991906153ee565b6001600160401b031681526020016144c460408a018a615d67565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b3f565b5f8281526007860160205260409020919350915061451c8282615ded565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016155d4565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614589919061559b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561460157614601615427565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e016153ee565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614717613fc5565b61471f614eee565b61408481614ef6565b614730613fc5565b61400e615098565b614740613fc5565b5f80516020615ee8833981519152836147ac5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147ce5760405162461bcd60e51b815260040161054290615cc8565b858711156148365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148a35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149155760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149906001600160a01b038416836150a0565b905080515f141580156149b45750808060200190518101906149b29190615eac565b155b15611fdf57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a47919061559b565b9050614a5e6001600160a01b0385163330866150ad565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac6919061559b565b9050818111614b2c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3682826159d1565b95945050505050565b5f6060826080015151603014614ba95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c2057614be08160016159d1565b614beb906008615948565b5081515f90839083908110614c0257614c02615710565b60200101906001600160f81b03191690815f1a905350600101614bcc565b505f5b6004811015614c8857614c378160036159d1565b614c42906008615948565b600160ff919091161c60f81b82614c5a836002615913565b81518110614c6a57614c6a615710565b60200101906001600160f81b03191690815f1a905350600101614c23565b505f5b6020811015614ce55784518160208110614ca757614ca7615710565b1a60f81b82614cb7836006615913565b81518110614cc757614cc7615710565b60200101906001600160f81b03191690815f1a905350600101614c8b565b505f5b6020811015614d455784602001518160208110614d0757614d07615710565b1a60f81b82614d17836026615913565b81518110614d2757614d27615710565b60200101906001600160f81b03191690815f1a905350600101614ce8565b505f5b6008811015614db957614d5c8160076159d1565b614d67906008615948565b60ff1685604001516001600160401b0316901c60f81b82826046614d8b9190615913565b81518110614d9b57614d9b615710565b60200101906001600160f81b03191690815f1a905350600101614d48565b505f5b6030811015614e245784608001518181518110614ddb57614ddb615710565b01602001516001600160f81b03191682614df683604e615913565b81518110614e0657614e06615710565b60200101906001600160f81b03191690815f1a905350600101614dbc565b505f5b6008811015614e9657614e3b8160076159d1565b614e46906008615948565b60608601516001600160401b0390811691161c60f81b82614e6883607e615913565b81518110614e7857614e78615710565b60200101906001600160f81b03191690815f1a905350600101614e27565b50600281604051614ea79190615902565b602060405180830381855afa158015614ec2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ee5919061559b565b94909350915050565b61400e613fc5565b614efe613fc5565b80355f80516020615f2883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f4a6080840160608501615d47565b60ff161115614fb75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc86080840160608501615d47565b60ff16116150305760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b6150406080830160608401615d47565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561507160608301604084016153ee565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61336c613fc5565b60606126f483835f6150e6565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614155565b60608147101561510b5760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b031684866040516151269190615902565b5f6040518083038185875af1925050503d805f8114615160576040519150601f19603f3d011682016040523d82523d5f602084013e615165565b606091505b509150915061237386838360608261518557615180826151cc565b6126f4565b815115801561519c57506001600160a01b0384163b155b156151c557604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126f4565b8051156151dc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615201906159e4565b5f825580601f10615210575050565b601f0160209004905f5260205f20908101906140849190615268565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561527c575f8155600101615269565b5090565b8015158114614084575f80fd5b803563ffffffff811681146152a0575f80fd5b919050565b5f805f606084860312156152b7575f80fd5b8335925060208401356152c981615280565b91506152d76040850161528d565b90509250925092565b5f602082840312156152f0575f80fd5b5035919050565b6001600160a01b0381168114614084575f80fd5b5f8082840361016081121561531e575f80fd5b6101408082121561532d575f80fd5b849350830135905061533e816152f7565b809150509250929050565b5f60208284031215615359575f80fd5b6126f48261528d565b5f8060408385031215615373575f80fd5b61537c8361528d565b946020939093013593505050565b5f806040838503121561539b575f80fd5b82356001600160401b038111156153b0575f80fd5b8301608081860312156153c1575f80fd5b91506153cf6020840161528d565b90509250929050565b80356001600160401b03811681146152a0575f80fd5b5f602082840312156153fe575f80fd5b6126f4826153d8565b5f8060408385031215615418575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549960608401826001600160401b03169052565b5060808301516154b460808401826001600160401b03169052565b5060a08301516154cf60a08401826001600160401b03169052565b5060c08301516154ea60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152a0575f80fd5b5f805f8060808587031215615515575f80fd5b84356001600160401b0381111561552a575f80fd5b85016060818803121561553b575f80fd5b9350615549602086016154f1565b9250615557604086016153d8565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154ea576154ea615567565b5f602082840312156155ab575f80fd5b5051919050565b5f5b838110156155cc5781810151838201526020016155b4565b50505f910152565b602081525f82518060208401526155f28160408501602087016155b2565b601f01601f19169190910160400192915050565b5f8261562057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156c0575f80fd5b81356126f4816152f7565b5f808335601e198436030181126156e0575f80fd5b8301803591506001600160401b038211156156f9575f80fd5b6020019150600581901b36038213156124cd575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615738575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561577857615778615742565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a6576157a6615742565b604052919050565b5f6001600160401b038211156157c6576157c6615742565b50601f01601f191660200190565b5f606082360312156157e4575f80fd5b6157ec615756565b8235815260206157fd8185016153d8565b8183015260408401356001600160401b03811115615819575f80fd5b840136601f820112615829575f80fd5b803561583c615837826157ae565b61577e565b818152368483850101111561584f575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158c4818460208a016155b2565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158f48160288401602088016155b2565b016028019695505050505050565b5f82516157388184602087016155b2565b80820180821115610a5957610a59615567565b5f63ffffffff80831681810361593e5761593e615567565b6001019392505050565b8082028115828204841417610a5957610a59615567565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154ea576154ea615567565b81810381811115610a5957610a59615567565b600181811c908216806159f857607f821691505b602082108103615a1657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a75816159e4565b806020870152604060018084165f8114615a965760018114615ab257615adf565b60ff19851660408a0152604084151560051b8a01019550615adf565b895f5260205f205f5b85811015615ad65781548b8201860152908301908801615abb565b8a016040019650505b509398975050505050505050565b80516152a081615280565b5f8060408385031215615b09575f80fd5b82516001600160401b0380821115615b1f575f80fd5b9084019060608287031215615b32575f80fd5b615b3a615756565b82518152602080840151615b4d816152f7565b82820152604084015183811115615b62575f80fd5b80850194505087601f850112615b76575f80fd5b83519250615b86615837846157ae565b8381528882858701011115615b99575f80fd5b615ba8848383018488016155b2565b80604084015250819550615bbd818801615aed565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cc057615cc0615567565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593e5761593e615567565b5f60208284031215615d3e575f80fd5b6126f4826154f1565b5f60208284031215615d57575f80fd5b813560ff811681146126f4575f80fd5b5f808335601e19843603018112615d7c575f80fd5b8301803591506001600160401b03821115615d95575f80fd5b6020019150368190038213156124cd575f80fd5b601f821115611fdf57805f5260205f20601f840160051c81016020851015615dce5750805b601f840160051c820191505b81811015610bd7575f8155600101615dda565b81516001600160401b03811115615e0657615e06615742565b615e1a81615e1484546159e4565b84615da9565b602080601f831160018114615e4d575f8415615e365750858301515b5f19600386901b1c1916600185901b178555615ea4565b5f85815260208120601f198616915b82811015615e7b57888601518255948401946001909101908401615e5c565b5085821015615e9857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ebc575f80fd5b81516126f48161528056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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_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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160fc3803806160fc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615faf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c0565b6103ec565b005b61019e6101ae3660046152fb565b610890565b6101f16101c13660046152fb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fb565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615326565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615364565b610b3e565b61019e61029936600461537d565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a5565b610db3565b6101f16102dc366004615409565b6113e7565b6102316102ef3660046152fb565b611400565b61019e6103023660046152c0565b611414565b61020c603081565b61019e61031d3660046152fb565b611657565b61019e61033036600461537d565b61175d565b6101f1610343366004615422565b611a81565b61019e610356366004615364565b611aad565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fb565b611c65565b61019e6103a23660046152fb565b611eeb565b61020c601481565b6103c26103bd3660046152fb565b611fff565b6040516101fb9190615456565b6102316202a30081565b6101f16103e736600461551d565b6120c7565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff16600481111561044d5761044d615442565b600481111561045e5761045e615442565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fff565b90506002835160048111156104f9576104f9615442565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f238339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f238339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615442565b036106235786156105e4576105e183876120fc565b90505b5f846060015183608001516105f99190615596565b90506106058482612398565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b91906155b6565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615442565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff1660058111156108dd576108dd615442565b60058111156108ee576108ee615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615442565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ef565b6040518263ffffffff1660e01b8152600401610a0391906155ef565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4391906155b6565b50505050565b5f610a5964e8d4a5100083615621565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af18484612716565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615f038339815191525f80610b5784612730565b91509150610b6482612a7a565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615442565b03610bc1575f83815260088501602052604081208054919055610bbf8282612ab5565b505b610bd781610bd284604001516113e7565b612b2b565b5050505050565b5f80516020615f038339815191525f610bf684612b4e565b90505f80610c078360400151612d28565b50915091505f610c1683611fff565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615640565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615682565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615442565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f438339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb791906155b6565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156cb565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156e6565b91505f9050843560208601356014610fc86060890160408a016156cb565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156e6565b8363ffffffff1681811061105e5761105e61572b565b9050602002810190611070919061573f565b611079906157ef565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615886565b84825f0151836020015184604001516040516020016110ce94939291906158ce565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c919061591d565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a91906155b6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615442565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661592e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615941565b905061102c565b50600584018190555f61130986612b4e565b90505f6113198260400151612f63565b90508060028560405161132c919061591d565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a91906155b6565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615963565b5f61140a82611fff565b6080015192915050565b5f80516020615f038339815191525f61142c856130d5565b905061143785612a7a565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061597a565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159cc565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120fc565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b91906155b6565b5f8781526008850160205260408120805490919061164a90849061592e565b9091555050505050505050565b5f80516020615f038339815191525f61166f83611fff565b905060048151600581111561168657611686615442565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061597a565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612ab5565b611765613350565b5f80516020615f038339815191525f61177d84612b4e565b90505f8061178e8360400151612d28565b50915091505f61179d83611fff565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615442565b60048111156117e8576117e8615442565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615640565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615682565b60038151600481111561191757611917615442565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f238339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615963565b6119b69190615621565b905080886008015f8881526020019081526020015f205f8282546119da919061592e565b909155505f90506119eb82846159ec565b90506119fb846020015182612ab5565b611a108460200151610bd286606001516113e7565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611a56929190918252602082015260400190565b60405180910390a4505050505050505050611a7d60015f80516020615f6383398151915255565b5050565b5f611a8a613350565b611a9583338461339a565b9050610a5960015f80516020615f6383398151915255565b5f80516020615f438339815191525f611ac583612b4e565b90505f80611ad68360400151613754565b9150915080611b385760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b52906159ff565b9050118015611b84575060015f83815260088601602052604090205460ff166005811115611b8257611b82615442565b145b611ba05760405162461bcd60e51b815260040161054290615a37565b5f8281526007850160205260408120611bb891615210565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff166004811115611cc657611cc6615442565b6004811115611cd757611cd7615442565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5e57611d5e615442565b1480611d7c5750600381516004811115611d7a57611d7a615442565b145b611dd05760405162461bcd60e51b815260206004820152603260248201525f80516020615f23833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dde8260400151611fff565b905080606001516001600160401b03165f03611e625760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e8f8460400151846060015185608001516124ef565b6040518263ffffffff1660e01b8152600401611eab91906155ef565b6020604051808303815f875af1158015611ec7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd791906155b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f43833981519152929190611f33906159ff565b9050118015611f65575060015f83815260088301602052604090205460ff166005811115611f6357611f63615442565b145b611f815760405162461bcd60e51b815260040161054290615a37565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fba9190600401615a7e565b6020604051808303815f875af1158015611fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffa91906155b6565b505050565b612007615247565b5f8281525f80516020615f83833981519152602052604090819020815160e0810190925280545f80516020615f43833981519152929190829060ff16600581111561205457612054615442565b600581111561206557612065615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d0613350565b6120dc858585856138f5565b90506120f460015f80516020615f6383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612147573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216e9190810190615b13565b91509150806121d15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612214573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223891906155b6565b82511461229c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156123125760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123218460400151613b6a565b9150915081871461238e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f83833981519152602052604081206002015481905f80516020615f4383398151915290600160801b90046001600160401b03166123e08582613d42565b5f6123ea87613f50565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243a8a858b6124ef565b6040518263ffffffff1660e01b815260040161245691906155ef565b6020604051808303815f875af1158015612472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249691906155b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612568576125288160016159ec565b612533906008615963565b5081515f9083908390811061254a5761254a61572b565b60200101906001600160f81b03191690815f1a905350600101612514565b505f5b60048110156125d35761257f8160036159ec565b61258a906008615963565b600263ffffffff16901c60f81b828260026125a5919061592e565b815181106125b5576125b561572b565b60200101906001600160f81b03191690815f1a90535060010161256b565b505f5b6020811015612635576125ea81601f6159ec565b6125f5906008615963565b86901c60f81b8261260783600661592e565b815181106126175761261761572b565b60200101906001600160f81b03191690815f1a9053506001016125d6565b505f5b60088110156126a05761264c8160076159ec565b612657906008615963565b6001600160401b038616901c60f81b8261267283602661592e565b815181106126825761268261572b565b60200101906001600160f81b03191690815f1a905350600101612638565b505f5b600881101561270b576126b78160076159ec565b6126c2906008615963565b6001600160401b038516901c60f81b826126dd83602e61592e565b815181106126ed576126ed61572b565b60200101906001600160f81b03191690815f1a9053506001016126a3565b5090505b9392505050565b61271e613fe0565b6127278261402b565b611a7d816140a2565b5f612739615247565b5f80516020615f438339815191525f61275185612b4e565b90505f806127628360400151613754565b9150915080156127c75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f8576127f8615442565b600581111561280957612809615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287a5761287a615442565b1480612898575060018251600581111561289657612896615442565b145b6128f75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b60038251600581111561290c5761290c615442565b036129195750600461291d565b5060055b6020808301515f9081526009880190915260408120558181600581111561294657612946615442565b9081600581111561295957612959615442565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298d5761298d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4157612a41615442565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ee383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b10575f80fd5b505af1158015612b22573d5f803e3d5ffd5b50505050505050565b5f80516020615ee383398151915254611a7d906001600160a01b03168383614143565b60408051606080820183525f8083526020830181905292820152905f80516020615f438339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bea9190810190615b13565b9150915080612c4a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612cad5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d4c5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612d9b57612d638160016159ec565b612d6e906008615963565b61ffff16868281518110612d8457612d8461572b565b016020015160f81c901b9190911790600101612d4f565b5061ffff811615612dbe5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015612e1957612dd58160036159ec565b612de0906008615963565b63ffffffff1687612df283600261592e565b81518110612e0257612e0261572b565b016020015160f81c901b9190911790600101612dc1565b5063ffffffff8116600414612e405760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015612e9557612e5781601f6159ec565b612e62906008615963565b88612e6e83600661592e565b81518110612e7e57612e7e61572b565b016020015160f81c901b9190911790600101612e43565b505f805b6008811015612ef457612ead8160076159ec565b612eb8906008615963565b6001600160401b031689612ecd83602661592e565b81518110612edd57612edd61572b565b016020015160f81c901b9190911790600101612e99565b505f805b6008811015612f5357612f0c8160076159ec565b612f17906008615963565b6001600160401b03168a612f2c83602e61592e565b81518110612f3c57612f3c61572b565b016020015160f81c901b9190911790600101612ef8565b5091989097509095509350505050565b5f8151602614612f855760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612fd457612f9c8160016159ec565b612fa7906008615963565b61ffff16848281518110612fbd57612fbd61572b565b016020015160f81c901b9190911790600101612f88565b5061ffff811615612ff75760405162461bcd60e51b815260040161054290615c2e565b5f805b60048110156130525761300e8160036159ec565b613019906008615963565b63ffffffff168561302b83600261592e565b8151811061303b5761303b61572b565b016020015160f81c901b9190911790600101612ffa565b5063ffffffff8116156130775760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156130cc5761308e81601f6159ec565b613099906008615963565b866130a583600661592e565b815181106130b5576130b561572b565b016020015160f81c901b919091179060010161307a565b50949350505050565b6130dd615247565b5f8281525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff16600581111561312a5761312a615442565b600581111561313b5761313b615442565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ad576131ad615442565b146132095760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324d5761324d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f98582612398565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f6383398151915280546001190161338157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f6383398151915255565b5f5f80516020615f03833981519152816133b661022c856141a2565b90505f6133c287611fff565b90506133cd87612a7a565b61342a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561343f5761343f615442565b1461349e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516134af91906159cc565b600485015460408401519192506134d1916001600160401b0390911690615cb8565b6001600160401b0316816001600160401b031611156135505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061355c8a84612398565b915091505f8a8360405160200161358a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362557613625615442565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137775760405162461bcd60e51b815260040161054290615be5565b5f805b60028110156137c65761378e8160016159ec565b613799906008615963565b61ffff168582815181106137af576137af61572b565b016020015160f81c901b919091179060010161377a565b5061ffff8116156137e95760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613844576138008160036159ec565b61380b906008615963565b63ffffffff168661381d83600261592e565b8151811061382d5761382d61572b565b016020015160f81c901b91909117906001016137ec565b5063ffffffff811660031461386b5760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156138c05761388281601f6159ec565b61388d906008615963565b8761389983600661592e565b815181106138a9576138a961572b565b016020015160f81c901b919091179060010161386e565b505f866026815181106138d5576138d561572b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f038339815191529061ffff861610801590613941575061271061ffff861611155b61395d5760405162461bcd60e51b815260040161054290615ce3565b60028101546001600160401b0390811690851610156139d65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613aa05760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613aaa846141a2565b90505f613ab682610a49565b90505f613ac389836141c5565b90506040518060600160405280613ad73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8d5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015613bdc57613ba48160016159ec565b613baf906008615963565b61ffff16858281518110613bc557613bc561572b565b016020015160f81c901b9190911790600101613b90565b5061ffff811615613bff5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613c5a57613c168160036159ec565b613c21906008615963565b63ffffffff1686613c3383600261592e565b81518110613c4357613c4361572b565b016020015160f81c901b9190911790600101613c02565b5063ffffffff8116600514613c815760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015613cd657613c9881601f6159ec565b613ca3906008615963565b87613caf83600661592e565b81518110613cbf57613cbf61572b565b016020015160f81c901b9190911790600101613c84565b505f805b6008811015613d3557613cee8160076159ec565b613cf9906008615963565b6001600160401b031688613d0e83602661592e565b81518110613d1e57613d1e61572b565b016020015160f81c901b9190911790600101613cda565b5090969095509350505050565b5f80516020615f438339815191525f6001600160401b038084169085161115613d7657613d6f8385615596565b9050613d83565b613d808484615596565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de5575060028401548151613de1916001600160401b03169061592e565b8210155b15613e0b576001600160401b038316606082015281815260408101516020820152613e2a565b8281606001818151613e1d91906159cc565b6001600160401b03169052505b6060810151613e3a906064615cb8565b602082015160028601546001600160401b039290921691613e659190600160401b900460ff16615963565b1015613ec95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ee4919061592e565b9052506040810180516001600160401b0387169190613f049083906159ec565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f838339815191526020526040812060020180545f80516020615f4383398151915291600160401b9091046001600160401b0316906008613f9a83615d2e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402957604051631afcd79f60e31b815260040160405180910390fd5b565b614033613fe0565b61403c8161472a565b614044614743565b61409f608082013560a083013561406160e0850160c08601615409565b614072610100860160e08701615d49565b61ffff1661408861012087016101008801615d62565b61409a610140880161012089016156cb565b614753565b50565b6140aa613fe0565b5f80516020615ee38339815191526001600160a01b0382166141235760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614997565b5f610a59825f80516020615ee3833981519152546001600160a01b0316906149f8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f438339815191524261426f6040860160208701615409565b6001600160401b0316116142e15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142f16040850160208601615409565b6001600160401b03166143076202a3004261592e565b1161437a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156144015760405162461bcd60e51b815260040161054290615886565b60306144106040860186615d82565b9050146144755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61447f835f613d42565b5f806145196040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c49190615409565b6001600160401b031681526020016144df60408a018a615d82565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5a565b5f828152600786016020526040902091935091506145378282615e08565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145649085906004016155ef565b6020604051808303815f875af1158015614580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a491906155b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461c5761461c615442565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fc918e01908e01615409565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614732613fe0565b61473a614f09565b61409f81614f11565b61474b613fe0565b6140296150b3565b61475b613fe0565b5f80516020615f03833981519152836147c75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147e95760405162461bcd60e51b815260040161054290615ce3565b858711156148515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148be5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149305760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ab6001600160a01b038416836150bb565b905080515f141580156149cf5750808060200190518101906149cd9190615ec7565b155b15611ffa57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6291906155b6565b9050614a796001600160a01b0385163330866150c8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae191906155b6565b9050818111614b475760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b5182826159ec565b95945050505050565b5f6060826080015151603014614bc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3b57614bfb8160016159ec565b614c06906008615963565b5081515f90839083908110614c1d57614c1d61572b565b60200101906001600160f81b03191690815f1a905350600101614be7565b505f5b6004811015614ca357614c528160036159ec565b614c5d906008615963565b600160ff919091161c60f81b82614c7583600261592e565b81518110614c8557614c8561572b565b60200101906001600160f81b03191690815f1a905350600101614c3e565b505f5b6020811015614d005784518160208110614cc257614cc261572b565b1a60f81b82614cd283600661592e565b81518110614ce257614ce261572b565b60200101906001600160f81b03191690815f1a905350600101614ca6565b505f5b6020811015614d605784602001518160208110614d2257614d2261572b565b1a60f81b82614d3283602661592e565b81518110614d4257614d4261572b565b60200101906001600160f81b03191690815f1a905350600101614d03565b505f5b6008811015614dd457614d778160076159ec565b614d82906008615963565b60ff1685604001516001600160401b0316901c60f81b82826046614da6919061592e565b81518110614db657614db661572b565b60200101906001600160f81b03191690815f1a905350600101614d63565b505f5b6030811015614e3f5784608001518181518110614df657614df661572b565b01602001516001600160f81b03191682614e1183604e61592e565b81518110614e2157614e2161572b565b60200101906001600160f81b03191690815f1a905350600101614dd7565b505f5b6008811015614eb157614e568160076159ec565b614e61906008615963565b60608601516001600160401b0390811691161c60f81b82614e8383607e61592e565b81518110614e9357614e9361572b565b60200101906001600160f81b03191690815f1a905350600101614e42565b50600281604051614ec2919061591d565b602060405180830381855afa158015614edd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0091906155b6565b94909350915050565b614029613fe0565b614f19613fe0565b80355f80516020615f4383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f656080840160608501615d62565b60ff161115614fd25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fe36080840160608501615d62565b60ff161161504b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61505b6080830160608401615d62565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508c6060830160408401615409565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613387613fe0565b606061270f83835f615101565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614170565b6060814710156151265760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b03168486604051615141919061591d565b5f6040518083038185875af1925050503d805f811461517b576040519150601f19603f3d011682016040523d82523d5f602084013e615180565b606091505b509150915061238e8683836060826151a05761519b826151e7565b61270f565b81511580156151b757506001600160a01b0384163b155b156151e057604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b508061270f565b8051156151f75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521c906159ff565b5f825580601f1061522b575050565b601f0160209004905f5260205f209081019061409f9190615283565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615297575f8155600101615284565b5090565b801515811461409f575f80fd5b803563ffffffff811681146152bb575f80fd5b919050565b5f805f606084860312156152d2575f80fd5b8335925060208401356152e48161529b565b91506152f2604085016152a8565b90509250925092565b5f6020828403121561530b575f80fd5b5035919050565b6001600160a01b038116811461409f575f80fd5b5f80828403610160811215615339575f80fd5b61014080821215615348575f80fd5b849350830135905061535981615312565b809150509250929050565b5f60208284031215615374575f80fd5b61270f826152a8565b5f806040838503121561538e575f80fd5b615397836152a8565b946020939093013593505050565b5f80604083850312156153b6575f80fd5b82356001600160401b038111156153cb575f80fd5b8301608081860312156153dc575f80fd5b91506153ea602084016152a8565b90509250929050565b80356001600160401b03811681146152bb575f80fd5b5f60208284031215615419575f80fd5b61270f826153f3565b5f8060408385031215615433575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b460608401826001600160401b03169052565b5060808301516154cf60808401826001600160401b03169052565b5060a08301516154ea60a08401826001600160401b03169052565b5060c083015161550560c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bb575f80fd5b5f805f8060808587031215615530575f80fd5b84356001600160401b03811115615545575f80fd5b850160608188031215615556575f80fd5b93506155646020860161550c565b9250615572604086016153f3565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550557615505615582565b5f602082840312156155c6575f80fd5b5051919050565b5f5b838110156155e75781810151838201526020016155cf565b50505f910152565b602081525f825180602084015261560d8160408501602087016155cd565b601f01601f19169190910160400192915050565b5f8261563b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156db575f80fd5b813561270f81615312565b5f808335601e198436030181126156fb575f80fd5b8301803591506001600160401b03821115615714575f80fd5b6020019150600581901b36038213156124e8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615753575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157935761579361575d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c1576157c161575d565b604052919050565b5f6001600160401b038211156157e1576157e161575d565b50601f01601f191660200190565b5f606082360312156157ff575f80fd5b615807615771565b8235815260206158188185016153f3565b8183015260408401356001600160401b03811115615834575f80fd5b840136601f820112615844575f80fd5b8035615857615852826157c9565b615799565b818152368483850101111561586a575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158df818460208a016155cd565b80830190508581526001600160401b0360c01b8560c01b166020820152835161590f8160288401602088016155cd565b016028019695505050505050565b5f82516157538184602087016155cd565b80820180821115610a5957610a59615582565b5f63ffffffff80831681810361595957615959615582565b6001019392505050565b8082028115828204841417610a5957610a59615582565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561550557615505615582565b81810381811115610a5957610a59615582565b600181811c90821680615a1357607f821691505b602082108103615a3157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a90816159ff565b806020870152604060018084165f8114615ab15760018114615acd57615afa565b60ff19851660408a0152604084151560051b8a01019550615afa565b895f5260205f205f5b85811015615af15781548b8201860152908301908801615ad6565b8a016040019650505b509398975050505050505050565b80516152bb8161529b565b5f8060408385031215615b24575f80fd5b82516001600160401b0380821115615b3a575f80fd5b9084019060608287031215615b4d575f80fd5b615b55615771565b82518152602080840151615b6881615312565b82820152604084015183811115615b7d575f80fd5b80850194505087601f850112615b91575f80fd5b83519250615ba1615852846157c9565b8381528882858701011115615bb4575f80fd5b615bc3848383018488016155cd565b80604084015250819550615bd8818801615b08565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cdb57615cdb615582565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595957615959615582565b5f60208284031215615d59575f80fd5b61270f8261550c565b5f60208284031215615d72575f80fd5b813560ff8116811461270f575f80fd5b5f808335601e19843603018112615d97575f80fd5b8301803591506001600160401b03821115615db0575f80fd5b6020019150368190038213156124e8575f80fd5b601f821115611ffa57805f5260205f20601f840160051c81016020851015615de95750805b601f840160051c820191505b81811015610bd7575f8155600101615df5565b81516001600160401b03811115615e2157615e2161575d565b615e3581615e2f84546159ff565b84615dc4565b602080601f831160018114615e68575f8415615e515750858301515b5f19600386901b1c1916600185901b178555615ebf565b5f85815260208120601f198616915b82811015615e9657888601518255948401946001909101908401615e77565b5085821015615eb357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ed7575f80fd5b815161270f8161529b56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -992,12 +992,14 @@ type ERC20TokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte Nonce uint64 + Rewards *big.Int + Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} @@ -1020,9 +1022,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1070,9 +1072,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index a21ad1acd..731fe5258 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,8 +83,8 @@ 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d9f380380615d9f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c528061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615000565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461503b565b6109d8565b3480156101e4575f80fd5b506102236101f336600461503b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615052565b610b91565b348015610286575f80fd5b5061029a61029536600461503b565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615090565b610c84565b34801561032a575f80fd5b506101b86103393660046150e4565b610cb8565b348015610349575f80fd5b506101b86103583660046150fd565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615125565b610f2d565b3480156103b0575f80fd5b506102236103bf366004615173565b611561565b3480156103cf575f80fd5b5061029a6103de36600461503b565b61157a565b3480156103ee575f80fd5b506101b86103fd366004615000565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461503b565b6117d1565b348015610440575f80fd5b506101b861044f3660046150fd565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150e4565b611be0565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461503b565b611d98565b3480156104b7575f80fd5b506101b86104c636600461503b565b61201e565b6102236104d936600461503b565b612132565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461503b565b612163565b60405161022d91906151a0565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff1660048111156105955761059561518c565b60048111156105a6576105a661518c565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a82612163565b90506002835160048111156106415761064161518c565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f9060029060058111156107145761071461518c565b0361076b57861561072c57610729838761222b565b90505b5f84606001518360800151610741919061526a565b905061074d84826124c7565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610873919061528a565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b261518c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff166005811115610a2557610a2561518c565b6005811115610a3657610a3661518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa561518c565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f61261e565b6040518263ffffffff1660e01b8152600401610b4b91906152c3565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b919061528a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2283612843565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152f5565b92915050565b5f610c8d612857565b610c998484843461288e565b9050610cb160015f80516020615c0683398151915255565b9392505050565b5f80516020615ba68339815191525f80610cd184612b0b565b91509150610cde82612e55565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d1661518c565b03610d3b575f83815260088501602052604081208054919055610d398282612e90565b505b610d5181610d4c8460400151611561565b612ef6565b5050505050565b5f80516020615ba68339815191525f610d7084612f09565b90505f80610d8183604001516130e3565b50915091505f610d9083612163565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a90615314565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615356565b60015f87815260068701602052604090205460ff166004811115610e3357610e3361518c565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be68339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611031919061528a565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153b3565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153ce565b91505f90508435602086013560146111426060890160408a016153b3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153ce565b8363ffffffff168181106111d8576111d8615413565b90506020028101906111ea9190615427565b6111f3906154d7565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a9061556e565b84825f01518360200151846040015160405160200161124894939291906155b6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615605565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d4919061528a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113605761136061518c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615616565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615629565b90506111a6565b50600584018190555f61148386612f09565b90505f611493826040015161331e565b9050806002856040516114a69190615605565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e4919061528a565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a5100061564b565b5f61158482612163565b6080015192915050565b5f80516020615ba68339815191525f6115a685613487565b90506115b185612e55565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a90615662565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156b4565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b4868561222b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a5919061528a565b5f878152600885016020526040812080549091906117c4908490615616565b9091555050505050505050565b5f80516020615ba68339815191525f6117e983612163565b90506004815160058111156118005761180061518c565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a90615662565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e90565b6118df612857565b5f80516020615ba68339815191525f6118f784612f09565b90505f8061190883604001516130e3565b50915091505f61191783612163565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119515761195161518c565b60048111156119625761196261518c565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a90615314565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615356565b600381516004811115611a9157611a9161518c565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615bc68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff168461564b565b611b3091906152f5565b905080886008015f8881526020019081526020015f205f828254611b549190615616565b90915550506020830151611b7190611b6c83856156d4565b612e90565b611b868360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bdc60015f80516020615c0683398151915255565b5050565b5f80516020615be68339815191525f611bf883612f09565b90505f80611c098360400151613702565b9150915080611c6b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c85906156e7565b9050118015611cb7575060015f83815260088601602052604090205460ff166005811115611cb557611cb561518c565b145b611cd35760405162461bcd60e51b815260040161068a90615719565b5f8281526007850160205260408120611ceb91614f55565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff166004811115611df957611df961518c565b6004811115611e0a57611e0a61518c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e9157611e9161518c565b1480611eaf5750600381516004811115611ead57611ead61518c565b145b611f035760405162461bcd60e51b815260206004820152603260248201525f80516020615bc6833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f118260400151612163565b905080606001516001600160401b03165f03611f955760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fc284604001518460600151856080015161261e565b6040518263ffffffff1660e01b8152600401611fde91906152c3565b6020604051808303815f875af1158015611ffa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d51919061528a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be6833981519152929190612066906156e7565b9050118015612098575060015f83815260088301602052604090205460ff1660058111156120965761209661518c565b145b6120b45760405162461bcd60e51b815260040161068a90615719565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120ed9190600401615760565b6020604051808303815f875af1158015612109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212d919061528a565b505050565b5f61213b612857565b6121468233346138a3565b905061215e60015f80516020615c0683398151915255565b919050565b61216b614f8c565b5f8281525f80516020615c26833981519152602052604090819020815160e0810190925280545f80516020615be6833981519152929190829060ff1660058111156121b8576121b861518c565b60058111156121c9576121c961518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229d91908101906157f5565b91509150806123005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612343573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612367919061528a565b8251146123cb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b0316156124415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f806124508460400151613c5a565b915091508187146124bd5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c26833981519152602052604081206002015481905f80516020615be683398151915290600160801b90046001600160401b031661250f8582613e32565b5f61251987614040565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125698a858b61261e565b6040518263ffffffff1660e01b815260040161258591906152c3565b6020604051808303815f875af11580156125a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c5919061528a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612697576126578160016156d4565b61266290600861564b565b5081515f9083908390811061267957612679615413565b60200101906001600160f81b03191690815f1a905350600101612643565b505f5b6004811015612702576126ae8160036156d4565b6126b990600861564b565b600263ffffffff16901c60f81b828260026126d49190615616565b815181106126e4576126e4615413565b60200101906001600160f81b03191690815f1a90535060010161269a565b505f5b60208110156127645761271981601f6156d4565b61272490600861564b565b86901c60f81b82612736836006615616565b8151811061274657612746615413565b60200101906001600160f81b03191690815f1a905350600101612705565b505f5b60088110156127cf5761277b8160076156d4565b61278690600861564b565b6001600160401b038616901c60f81b826127a1836026615616565b815181106127b1576127b1615413565b60200101906001600160f81b03191690815f1a905350600101612767565b505f5b600881101561283a576127e68160076156d4565b6127f190600861564b565b6001600160401b038516901c60f81b8261280c83602e615616565b8151811061281c5761281c615413565b60200101906001600160f81b03191690815f1a9053506001016127d2565b50949350505050565b61284b6140d0565b6128548161411b565b50565b5f80516020615c0683398151915280546001190161288857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba68339815191529061ffff8616108015906128da575061271061ffff861611155b6128f65760405162461bcd60e51b815260040161068a906158c7565b60028101546001600160401b03908116908516101561296f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a395760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a4482610c6e565b90505f612a51898361418f565b90506040518060600160405280612a653390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0683398151915255565b5f612b14614f8c565b5f80516020615be68339815191525f612b2c85612f09565b90505f80612b3d8360400151613702565b915091508015612ba25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bd357612bd361518c565b6005811115612be457612be461518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c5557612c5561518c565b1480612c735750600182516005811115612c7157612c7161518c565b145b612cd25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce757612ce761518c565b03612cf457506004612cf8565b5060055b6020808301515f90815260098801909152604081205581816005811115612d2157612d2161518c565b90816005811115612d3457612d3461518c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6857612d6861518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1c57612e1c61518c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612edc575f80fd5b505af1158015612eee573d5f803e3d5ffd5b505050505050565b611bdc6001600160a01b038316826146f4565b60408051606080820183525f8083526020830181905292820152905f80516020615be68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f7e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fa591908101906157f5565b91509150806130055760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131075760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156131565761311e8160016156d4565b61312990600861564b565b61ffff1686828151811061313f5761313f615413565b016020015160f81c901b919091179060010161310a565b5061ffff8116156131795760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156131d4576131908160036156d4565b61319b90600861564b565b63ffffffff16876131ad836002615616565b815181106131bd576131bd615413565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166004146131fb5760405162461bcd60e51b815260040161068a9061599e565b5f805b60208110156132505761321281601f6156d4565b61321d90600861564b565b88613229836006615616565b8151811061323957613239615413565b016020015160f81c901b91909117906001016131fe565b505f805b60088110156132af576132688160076156d4565b61327390600861564b565b6001600160401b031689613288836026615616565b8151811061329857613298615413565b016020015160f81c901b9190911790600101613254565b505f805b600881101561330e576132c78160076156d4565b6132d290600861564b565b6001600160401b03168a6132e783602e615616565b815181106132f7576132f7615413565b016020015160f81c901b91909117906001016132b3565b5091989097509095509350505050565b5f81516026146133405760405162461bcd60e51b815260040161068a90615912565b5f805b600281101561338f576133578160016156d4565b61336290600861564b565b61ffff1684828151811061337857613378615413565b016020015160f81c901b9190911790600101613343565b5061ffff8116156133b25760405162461bcd60e51b815260040161068a9061595b565b5f805b600481101561340d576133c98160036156d4565b6133d490600861564b565b63ffffffff16856133e6836002615616565b815181106133f6576133f6615413565b016020015160f81c901b91909117906001016133b5565b5063ffffffff8116156134325760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561283a5761344981601f6156d4565b61345490600861564b565b86613460836006615616565b8151811061347057613470615413565b016020015160f81c901b9190911790600101613435565b61348f614f8c565b5f8281525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff1660058111156134dc576134dc61518c565b60058111156134ed576134ed61518c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355f5761355f61518c565b146135bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135ff576135ff61518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136ab85826124c7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137255760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156137745761373c8160016156d4565b61374790600861564b565b61ffff1685828151811061375d5761375d615413565b016020015160f81c901b9190911790600101613728565b5061ffff8116156137975760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156137f2576137ae8160036156d4565b6137b990600861564b565b63ffffffff16866137cb836002615616565b815181106137db576137db615413565b016020015160f81c901b919091179060010161379a565b5063ffffffff81166003146138195760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561386e5761383081601f6156d4565b61383b90600861564b565b87613847836006615616565b8151811061385757613857615413565b016020015160f81c901b919091179060010161381c565b505f8660268151811061388357613883615413565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba6833981519152816138bc84610c6e565b90505f6138c887612163565b90506138d387612e55565b6139305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b6002815160058111156139455761394561518c565b146139a45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139b591906156b4565b600485015460408401519192506139d7916001600160401b03909116906159e5565b6001600160401b0316816001600160401b03161115613a565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a628a846124c7565b915091505f8a83604051602001613a9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2b57613b2b61518c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c7d5760405162461bcd60e51b815260040161068a90615912565b5f805b6002811015613ccc57613c948160016156d4565b613c9f90600861564b565b61ffff16858281518110613cb557613cb5615413565b016020015160f81c901b9190911790600101613c80565b5061ffff811615613cef5760405162461bcd60e51b815260040161068a9061595b565b5f805b6004811015613d4a57613d068160036156d4565b613d1190600861564b565b63ffffffff1686613d23836002615616565b81518110613d3357613d33615413565b016020015160f81c901b9190911790600101613cf2565b5063ffffffff8116600514613d715760405162461bcd60e51b815260040161068a9061599e565b5f805b6020811015613dc657613d8881601f6156d4565b613d9390600861564b565b87613d9f836006615616565b81518110613daf57613daf615413565b016020015160f81c901b9190911790600101613d74565b505f805b6008811015613e2557613dde8160076156d4565b613de990600861564b565b6001600160401b031688613dfe836026615616565b81518110613e0e57613e0e615413565b016020015160f81c901b9190911790600101613dca565b5090969095509350505050565b5f80516020615be68339815191525f6001600160401b038084169085161115613e6657613e5f838561526a565b9050613e73565b613e70848461526a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ed5575060028401548151613ed1916001600160401b031690615616565b8210155b15613efb576001600160401b038316606082015281815260408101516020820152613f1a565b8281606001818151613f0d91906156b4565b6001600160401b03169052505b6060810151613f2a9060646159e5565b602082015160028601546001600160401b039290921691613f559190600160401b900460ff1661564b565b1015613fb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fd49190615616565b9052506040810180516001600160401b0387169190613ff49083906156d4565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c268339815191526020526040812060020180545f80516020615be683398151915291600160401b9091046001600160401b031690600861408a83615a10565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411957604051631afcd79f60e31b815260040160405180910390fd5b565b6141236140d0565b61412c81614787565b6141346147a0565b612854608082013560a083013561415160e0850160c08601615173565b614162610100860160e08701615a2b565b61ffff1661417861012087016101008801615a44565b61418a610140880161012089016153b3565b6147b0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661421a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be6833981519152426142396040860160208701615173565b6001600160401b0316116142ab5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142bb6040850160208601615173565b6001600160401b03166142d16202a30042615616565b116143445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b833561439c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143cb5760405162461bcd60e51b815260040161068a9061556e565b60306143da6040860186615a64565b90501461443f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614449835f613e32565b5f806144e36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061448e9190615173565b6001600160401b031681526020016144a960408a018a615a64565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149f4565b5f828152600786016020526040902091935091506145018282615aea565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061452e9085906004016152c3565b6020604051808303815f875af115801561454a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456e919061528a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e6576145e661518c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c6918e01908e01615173565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147175760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614760576040519150601f19603f3d011682016040523d82523d5f602084013e614765565b606091505b505090508061212d57604051630a12f52160e11b815260040160405180910390fd5b61478f6140d0565b614797614da3565b61285481614dab565b6147a86140d0565b614119614f4d565b6147b86140d0565b5f80516020615ba6833981519152836148245760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148465760405162461bcd60e51b815260040161068a906158c7565b858711156148ae5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff161161491b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff8416111561498d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a5e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ad557614a958160016156d4565b614aa090600861564b565b5081515f90839083908110614ab757614ab7615413565b60200101906001600160f81b03191690815f1a905350600101614a81565b505f5b6004811015614b3d57614aec8160036156d4565b614af790600861564b565b600160ff919091161c60f81b82614b0f836002615616565b81518110614b1f57614b1f615413565b60200101906001600160f81b03191690815f1a905350600101614ad8565b505f5b6020811015614b9a5784518160208110614b5c57614b5c615413565b1a60f81b82614b6c836006615616565b81518110614b7c57614b7c615413565b60200101906001600160f81b03191690815f1a905350600101614b40565b505f5b6020811015614bfa5784602001518160208110614bbc57614bbc615413565b1a60f81b82614bcc836026615616565b81518110614bdc57614bdc615413565b60200101906001600160f81b03191690815f1a905350600101614b9d565b505f5b6008811015614c6e57614c118160076156d4565b614c1c90600861564b565b60ff1685604001516001600160401b0316901c60f81b82826046614c409190615616565b81518110614c5057614c50615413565b60200101906001600160f81b03191690815f1a905350600101614bfd565b505f5b6030811015614cd95784608001518181518110614c9057614c90615413565b01602001516001600160f81b03191682614cab83604e615616565b81518110614cbb57614cbb615413565b60200101906001600160f81b03191690815f1a905350600101614c71565b505f5b6008811015614d4b57614cf08160076156d4565b614cfb90600861564b565b60608601516001600160401b0390811691161c60f81b82614d1d83607e615616565b81518110614d2d57614d2d615413565b60200101906001600160f81b03191690815f1a905350600101614cdc565b50600281604051614d5c9190615605565b602060405180830381855afa158015614d77573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d9a919061528a565b94909350915050565b6141196140d0565b614db36140d0565b80355f80516020615be683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614dff6080840160608501615a44565b60ff161115614e6c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e7d6080840160608501615a44565b60ff1611614ee55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614ef56080830160608401615a44565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f266060830160408401615173565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af86140d0565b508054614f61906156e7565b5f825580601f10614f70575050565b601f0160209004905f5260205f20908101906128549190614fc8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fdc575f8155600101614fc9565b5090565b8015158114612854575f80fd5b803563ffffffff8116811461215e575f80fd5b5f805f60608486031215615012575f80fd5b83359250602084013561502481614fe0565b915061503260408501614fed565b90509250925092565b5f6020828403121561504b575f80fd5b5035919050565b5f6101408284031215615063575f80fd5b50919050565b803561ffff8116811461215e575f80fd5b80356001600160401b038116811461215e575f80fd5b5f805f606084860312156150a2575f80fd5b83356001600160401b038111156150b7575f80fd5b8401606081870312156150c8575f80fd5b92506150d660208501615069565b91506150326040850161507a565b5f602082840312156150f4575f80fd5b610cb182614fed565b5f806040838503121561510e575f80fd5b61511783614fed565b946020939093013593505050565b5f8060408385031215615136575f80fd5b82356001600160401b0381111561514b575f80fd5b83016080818603121561515c575f80fd5b915061516a60208401614fed565b90509250929050565b5f60208284031215615183575f80fd5b610cb18261507a565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151c357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151fe60608401826001600160401b03169052565b50608083015161521960808401826001600160401b03169052565b5060a083015161523460a08401826001600160401b03169052565b5060c083015161524f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524f5761524f615256565b5f6020828403121561529a575f80fd5b5051919050565b5f5b838110156152bb5781810151838201526020016152a3565b50505f910152565b602081525f82518060208401526152e18160408501602087016152a1565b601f01601f19169190910160400192915050565b5f8261530f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612854575f80fd5b5f602082840312156153c3575f80fd5b8135610cb18161539f565b5f808335601e198436030181126153e3575f80fd5b8301803591506001600160401b038211156153fc575f80fd5b6020019150600581901b3603821315612617575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261543b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561547b5761547b615445565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a9576154a9615445565b604052919050565b5f6001600160401b038211156154c9576154c9615445565b50601f01601f191660200190565b5f606082360312156154e7575f80fd5b6154ef615459565b82358152602061550081850161507a565b8183015260408401356001600160401b0381111561551c575f80fd5b840136601f82011261552c575f80fd5b803561553f61553a826154b1565b615481565b8181523684838501011115615552575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c7818460208a016152a1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f78160288401602088016152a1565b016028019695505050505050565b5f825161543b8184602087016152a1565b80820180821115610c7e57610c7e615256565b5f63ffffffff80831681810361564157615641615256565b6001019392505050565b8082028115828204841417610c7e57610c7e615256565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524f5761524f615256565b81810381811115610c7e57610c7e615256565b600181811c908216806156fb57607f821691505b60208210810361506357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615772816156e7565b806020870152604060018084165f811461579357600181146157af576157dc565b60ff19851660408a0152604084151560051b8a010195506157dc565b895f5260205f205f5b858110156157d35781548b82018601529083019088016157b8565b8a016040019650505b509398975050505050505050565b805161215e81614fe0565b5f8060408385031215615806575f80fd5b82516001600160401b038082111561581c575f80fd5b908401906060828703121561582f575f80fd5b615837615459565b8251815260208084015161584a8161539f565b8282015260408401518381111561585f575f80fd5b80850194505087601f850112615873575f80fd5b8351925061588361553a846154b1565b8381528882858701011115615896575f80fd5b6158a5848383018488016152a1565b806040840152508195506158ba8188016157ea565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0857615a08615256565b505092915050565b5f6001600160401b0380831681810361564157615641615256565b5f60208284031215615a3b575f80fd5b610cb182615069565b5f60208284031215615a54575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a79575f80fd5b8301803591506001600160401b03821115615a92575f80fd5b602001915036819003821315612617575f80fd5b601f82111561212d57805f5260205f20601f840160051c81016020851015615acb5750805b601f840160051c820191505b81811015610d51575f8155600101615ad7565b81516001600160401b03811115615b0357615b03615445565b615b1781615b1184546156e7565b84615aa6565b602080601f831160018114615b4a575f8415615b335750858301515b5f19600386901b1c1916600185901b178555612eee565b5f85815260208120601f198616915b82811015615b7857888601518255948401946001909101908401615b59565b5085821015615b9557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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_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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615dba380380615dba83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c6d8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501b565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615056565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615056565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506d565b610b91565b348015610286575f80fd5b5061029a610295366004615056565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ab565b610c84565b34801561032a575f80fd5b506101b86103393660046150ff565b610cb8565b348015610349575f80fd5b506101b8610358366004615118565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615140565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461518e565b611561565b3480156103cf575f80fd5b5061029a6103de366004615056565b61157a565b3480156103ee575f80fd5b506101b86103fd36600461501b565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615056565b6117d1565b348015610440575f80fd5b506101b861044f366004615118565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150ff565b611bfb565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615056565b611db3565b3480156104b7575f80fd5b506101b86104c6366004615056565b612039565b6102236104d9366004615056565b61214d565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615056565b61217e565b60405161022d91906151bb565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115610595576105956151a7565b60048111156105a6576105a66151a7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261217e565b9050600283516004811115610641576106416151a7565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615be18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615be18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f906002906005811115610714576107146151a7565b0361076b57861561072c576107298387612246565b90505b5f846060015183608001516107419190615285565b905061074d84826124e2565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087391906152a5565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b26151a7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff166005811115610a2557610a256151a7565b6005811115610a3657610a366151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa56151a7565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612639565b6040518263ffffffff1660e01b8152600401610b4b91906152de565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b91906152a5565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361285e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a5100083615310565b92915050565b5f610c8d612872565b610c99848484346128a9565b9050610cb160015f80516020615c2183398151915255565b9392505050565b5f80516020615bc18339815191525f80610cd184612b26565b91509150610cde82612e70565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d166151a7565b03610d3b575f83815260088501602052604081208054919055610d398282612eab565b505b610d5181610d4c8460400151611561565b612f11565b5050505050565b5f80516020615bc18339815191525f610d7084612f24565b90505f80610d8183604001516130fe565b50915091505f610d908361217e565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061532f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615371565b60015f87815260068701602052604090205460ff166004811115610e3357610e336151a7565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615c018339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103191906152a5565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ce565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153e9565b91505f90508435602086013560146111426060890160408a016153ce565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153e9565b8363ffffffff168181106111d8576111d861542e565b90506020028101906111ea9190615442565b6111f3906154f2565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615589565b84825f01518360200151846040015160405160200161124894939291906155d1565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615620565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d491906152a5565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611360576113606151a7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615631565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615644565b90506111a6565b50600584018190555f61148386612f24565b90505f6114938260400151613339565b9050806002856040516114a69190615620565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e491906152a5565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615666565b5f6115848261217e565b6080015192915050565b5f80516020615bc18339815191525f6115a6856134a2565b90506115b185612e70565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a9061567d565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156cf565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b48685612246565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a591906152a5565b5f878152600885016020526040812080549091906117c4908490615631565b9091555050505050505050565b5f80516020615bc18339815191525f6117e98361217e565b9050600481516005811115611800576118006151a7565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a9061567d565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612eab565b6118df612872565b5f80516020615bc18339815191525f6118f784612f24565b90505f8061190883604001516130fe565b50915091505f6119178361217e565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611951576119516151a7565b6004811115611962576119626151a7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a9061532f565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615371565b600381516004811115611a9157611a916151a7565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615be18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff1684615666565b611b309190615310565b905080886008015f8881526020019081526020015f205f828254611b549190615631565b909155505f9050611b6582846156ef565b9050611b75846020015182612eab565b611b8a8460200151610d4c8660600151611561565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bd0929190918252602082015260400190565b60405180910390a4505050505050505050611bf760015f80516020615c2183398151915255565b5050565b5f80516020615c018339815191525f611c1383612f24565b90505f80611c24836040015161371d565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611ca090615702565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd06151a7565b145b611cee5760405162461bcd60e51b815260040161068a90615734565b5f8281526007850160205260408120611d0691614f70565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115611e1457611e146151a7565b6004811115611e2557611e256151a7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac6151a7565b1480611eca5750600381516004811115611ec857611ec86151a7565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615be1833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f2c826040015161217e565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fdd846040015184606001518560800151612639565b6040518263ffffffff1660e01b8152600401611ff991906152de565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5191906152a5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615c0183398151915292919061208190615702565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b16151a7565b145b6120cf5760405162461bcd60e51b815260040161068a90615734565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612108919060040161577b565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214891906152a5565b505050565b5f612156612872565b6121618233346138be565b905061217960015f80516020615c2183398151915255565b919050565b612186614fa7565b5f8281525f80516020615c41833981519152602052604090819020815160e0810190925280545f80516020615c01833981519152929190829060ff1660058111156121d3576121d36151a7565b60058111156121e4576121e46151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612291573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b89190810190615810565b915091508061231b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238291906152a5565b8251146123e65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561245c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061246b8460400151613c75565b915091508187146124d85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c41833981519152602052604081206002015481905f80516020615c0183398151915290600160801b90046001600160401b031661252a8582613e4d565b5f6125348761405b565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125848a858b612639565b6040518263ffffffff1660e01b81526004016125a091906152de565b6020604051808303815f875af11580156125bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e091906152a5565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b2576126728160016156ef565b61267d906008615666565b5081515f908390839081106126945761269461542e565b60200101906001600160f81b03191690815f1a90535060010161265e565b505f5b600481101561271d576126c98160036156ef565b6126d4906008615666565b600263ffffffff16901c60f81b828260026126ef9190615631565b815181106126ff576126ff61542e565b60200101906001600160f81b03191690815f1a9053506001016126b5565b505f5b602081101561277f5761273481601f6156ef565b61273f906008615666565b86901c60f81b82612751836006615631565b815181106127615761276161542e565b60200101906001600160f81b03191690815f1a905350600101612720565b505f5b60088110156127ea576127968160076156ef565b6127a1906008615666565b6001600160401b038616901c60f81b826127bc836026615631565b815181106127cc576127cc61542e565b60200101906001600160f81b03191690815f1a905350600101612782565b505f5b6008811015612855576128018160076156ef565b61280c906008615666565b6001600160401b038516901c60f81b8261282783602e615631565b815181106128375761283761542e565b60200101906001600160f81b03191690815f1a9053506001016127ed565b50949350505050565b6128666140eb565b61286f81614136565b50565b5f80516020615c218339815191528054600119016128a357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bc18339815191529061ffff8616108015906128f5575061271061ffff861611155b6129115760405162461bcd60e51b815260040161068a906158e2565b60028101546001600160401b03908116908516101561298a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a545760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a5f82610c6e565b90505f612a6c89836141aa565b90506040518060600160405280612a803390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c2183398151915255565b5f612b2f614fa7565b5f80516020615c018339815191525f612b4785612f24565b90505f80612b58836040015161371d565b915091508015612bbd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bee57612bee6151a7565b6005811115612bff57612bff6151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7057612c706151a7565b1480612c8e5750600182516005811115612c8c57612c8c6151a7565b145b612ced5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612d0257612d026151a7565b03612d0f57506004612d13565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3c57612d3c6151a7565b90816005811115612d4f57612d4f6151a7565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8357612d836151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3757612e376151a7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef7575f80fd5b505af1158015612f09573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b0383168261470f565b60408051606080820183525f8083526020830181905292820152905f80516020615c018339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc09190810190615810565b91509150806130205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130f65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131225760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613171576131398160016156ef565b613144906008615666565b61ffff1686828151811061315a5761315a61542e565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b815260040161068a90615976565b5f805b60048110156131ef576131ab8160036156ef565b6131b6906008615666565b63ffffffff16876131c8836002615631565b815181106131d8576131d861542e565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b815260040161068a906159b9565b5f805b602081101561326b5761322d81601f6156ef565b613238906008615666565b88613244836006615631565b815181106132545761325461542e565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca576132838160076156ef565b61328e906008615666565b6001600160401b0316896132a3836026615631565b815181106132b3576132b361542e565b016020015160f81c901b919091179060010161326f565b505f805b6008811015613329576132e28160076156ef565b6132ed906008615666565b6001600160401b03168a61330283602e615631565b815181106133125761331261542e565b016020015160f81c901b91909117906001016132ce565b5091989097509095509350505050565b5f815160261461335b5760405162461bcd60e51b815260040161068a9061592d565b5f805b60028110156133aa576133728160016156ef565b61337d906008615666565b61ffff168482815181106133935761339361542e565b016020015160f81c901b919091179060010161335e565b5061ffff8116156133cd5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613428576133e48160036156ef565b6133ef906008615666565b63ffffffff1685613401836002615631565b815181106134115761341161542e565b016020015160f81c901b91909117906001016133d0565b5063ffffffff81161561344d5760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156128555761346481601f6156ef565b61346f906008615666565b8661347b836006615631565b8151811061348b5761348b61542e565b016020015160f81c901b9190911790600101613450565b6134aa614fa7565b5f8281525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff1660058111156134f7576134f76151a7565b6005811115613508576135086151a7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357a5761357a6151a7565b146135d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361a5761361a6151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c685826124e2565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137405760405162461bcd60e51b815260040161068a9061592d565b5f805b600281101561378f576137578160016156ef565b613762906008615666565b61ffff168582815181106137785761377861542e565b016020015160f81c901b9190911790600101613743565b5061ffff8116156137b25760405162461bcd60e51b815260040161068a90615976565b5f805b600481101561380d576137c98160036156ef565b6137d4906008615666565b63ffffffff16866137e6836002615631565b815181106137f6576137f661542e565b016020015160f81c901b91909117906001016137b5565b5063ffffffff81166003146138345760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156138895761384b81601f6156ef565b613856906008615666565b87613862836006615631565b815181106138725761387261542e565b016020015160f81c901b9190911790600101613837565b505f8660268151811061389e5761389e61542e565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615bc1833981519152816138d784610c6e565b90505f6138e38761217e565b90506138ee87612e70565b61394b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613960576139606151a7565b146139bf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139d091906156cf565b600485015460408401519192506139f2916001600160401b0390911690615a00565b6001600160401b0316816001600160401b03161115613a715760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a7d8a846124e2565b915091505f8a83604051602001613aab92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4657613b466151a7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c985760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613ce757613caf8160016156ef565b613cba906008615666565b61ffff16858281518110613cd057613cd061542e565b016020015160f81c901b9190911790600101613c9b565b5061ffff811615613d0a5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613d6557613d218160036156ef565b613d2c906008615666565b63ffffffff1686613d3e836002615631565b81518110613d4e57613d4e61542e565b016020015160f81c901b9190911790600101613d0d565b5063ffffffff8116600514613d8c5760405162461bcd60e51b815260040161068a906159b9565b5f805b6020811015613de157613da381601f6156ef565b613dae906008615666565b87613dba836006615631565b81518110613dca57613dca61542e565b016020015160f81c901b9190911790600101613d8f565b505f805b6008811015613e4057613df98160076156ef565b613e04906008615666565b6001600160401b031688613e19836026615631565b81518110613e2957613e2961542e565b016020015160f81c901b9190911790600101613de5565b5090969095509350505050565b5f80516020615c018339815191525f6001600160401b038084169085161115613e8157613e7a8385615285565b9050613e8e565b613e8b8484615285565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef0575060028401548151613eec916001600160401b031690615631565b8210155b15613f16576001600160401b038316606082015281815260408101516020820152613f35565b8281606001818151613f2891906156cf565b6001600160401b03169052505b6060810151613f45906064615a00565b602082015160028601546001600160401b039290921691613f709190600160401b900460ff16615666565b1015613fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fef9190615631565b9052506040810180516001600160401b038716919061400f9083906156ef565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c418339815191526020526040812060020180545f80516020615c0183398151915291600160401b9091046001600160401b03169060086140a583615a2b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413457604051631afcd79f60e31b815260040160405180910390fd5b565b61413e6140eb565b614147816147a2565b61414f6147bb565b61286f608082013560a083013561416c60e0850160c0860161518e565b61417d610100860160e08701615a46565b61ffff1661419361012087016101008801615a5f565b6141a5610140880161012089016153ce565b6147cb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615c0183398151915242614254604086016020870161518e565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142d6604085016020860161518e565b6001600160401b03166142ec6202a30042615631565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b815260040161068a90615589565b60306143f56040860186615a7f565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614464835f613e4d565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a9919061518e565b6001600160401b031681526020016144c460408a018a615a7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a0f565b5f8281526007860160205260409020919350915061451c8282615b05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016152de565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458991906152a5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614601576146016151a7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e0161518e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147325760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477b576040519150601f19603f3d011682016040523d82523d5f602084013e614780565b606091505b505090508061214857604051630a12f52160e11b815260040160405180910390fd5b6147aa6140eb565b6147b2614dbe565b61286f81614dc6565b6147c36140eb565b614134614f68565b6147d36140eb565b5f80516020615bc18339815191528361483f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148615760405162461bcd60e51b815260040161068a906158e2565b858711156148c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a795760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af057614ab08160016156ef565b614abb906008615666565b5081515f90839083908110614ad257614ad261542e565b60200101906001600160f81b03191690815f1a905350600101614a9c565b505f5b6004811015614b5857614b078160036156ef565b614b12906008615666565b600160ff919091161c60f81b82614b2a836002615631565b81518110614b3a57614b3a61542e565b60200101906001600160f81b03191690815f1a905350600101614af3565b505f5b6020811015614bb55784518160208110614b7757614b7761542e565b1a60f81b82614b87836006615631565b81518110614b9757614b9761542e565b60200101906001600160f81b03191690815f1a905350600101614b5b565b505f5b6020811015614c155784602001518160208110614bd757614bd761542e565b1a60f81b82614be7836026615631565b81518110614bf757614bf761542e565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c8957614c2c8160076156ef565b614c37906008615666565b60ff1685604001516001600160401b0316901c60f81b82826046614c5b9190615631565b81518110614c6b57614c6b61542e565b60200101906001600160f81b03191690815f1a905350600101614c18565b505f5b6030811015614cf45784608001518181518110614cab57614cab61542e565b01602001516001600160f81b03191682614cc683604e615631565b81518110614cd657614cd661542e565b60200101906001600160f81b03191690815f1a905350600101614c8c565b505f5b6008811015614d6657614d0b8160076156ef565b614d16906008615666565b60608601516001600160401b0390811691161c60f81b82614d3883607e615631565b81518110614d4857614d4861542e565b60200101906001600160f81b03191690815f1a905350600101614cf7565b50600281604051614d779190615620565b602060405180830381855afa158015614d92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db591906152a5565b94909350915050565b6141346140eb565b614dce6140eb565b80355f80516020615c0183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1a6080840160608501615a5f565b60ff161115614e875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e986080840160608501615a5f565b60ff1611614f005760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614f106080830160608401615a5f565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f41606083016040840161518e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b136140eb565b508054614f7c90615702565b5f825580601f10614f8b575050565b601f0160209004905f5260205f209081019061286f9190614fe3565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff7575f8155600101614fe4565b5090565b801515811461286f575f80fd5b803563ffffffff81168114612179575f80fd5b5f805f6060848603121561502d575f80fd5b83359250602084013561503f81614ffb565b915061504d60408501615008565b90509250925092565b5f60208284031215615066575f80fd5b5035919050565b5f610140828403121561507e575f80fd5b50919050565b803561ffff81168114612179575f80fd5b80356001600160401b0381168114612179575f80fd5b5f805f606084860312156150bd575f80fd5b83356001600160401b038111156150d2575f80fd5b8401606081870312156150e3575f80fd5b92506150f160208501615084565b915061504d60408501615095565b5f6020828403121561510f575f80fd5b610cb182615008565b5f8060408385031215615129575f80fd5b61513283615008565b946020939093013593505050565b5f8060408385031215615151575f80fd5b82356001600160401b03811115615166575f80fd5b830160808186031215615177575f80fd5b915061518560208401615008565b90509250929050565b5f6020828403121561519e575f80fd5b610cb182615095565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151de57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521960608401826001600160401b03169052565b50608083015161523460808401826001600160401b03169052565b5060a083015161524f60a08401826001600160401b03169052565b5060c083015161526a60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526a5761526a615271565b5f602082840312156152b5575f80fd5b5051919050565b5f5b838110156152d65781810151838201526020016152be565b50505f910152565b602081525f82518060208401526152fc8160408501602087016152bc565b601f01601f19169190910160400192915050565b5f8261532a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461286f575f80fd5b5f602082840312156153de575f80fd5b8135610cb1816153ba565b5f808335601e198436030181126153fe575f80fd5b8301803591506001600160401b03821115615417575f80fd5b6020019150600581901b3603821315612632575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615456575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549657615496615460565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c4576154c4615460565b604052919050565b5f6001600160401b038211156154e4576154e4615460565b50601f01601f191660200190565b5f60608236031215615502575f80fd5b61550a615474565b82358152602061551b818501615095565b8183015260408401356001600160401b03811115615537575f80fd5b840136601f820112615547575f80fd5b803561555a615555826154cc565b61549c565b818152368483850101111561556d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e2818460208a016152bc565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156128160288401602088016152bc565b016028019695505050505050565b5f82516154568184602087016152bc565b80820180821115610c7e57610c7e615271565b5f63ffffffff80831681810361565c5761565c615271565b6001019392505050565b8082028115828204841417610c7e57610c7e615271565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561526a5761526a615271565b81810381811115610c7e57610c7e615271565b600181811c9082168061571657607f821691505b60208210810361507e57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461578d81615702565b806020870152604060018084165f81146157ae57600181146157ca576157f7565b60ff19851660408a0152604084151560051b8a010195506157f7565b895f5260205f205f5b858110156157ee5781548b82018601529083019088016157d3565b8a016040019650505b509398975050505050505050565b805161217981614ffb565b5f8060408385031215615821575f80fd5b82516001600160401b0380821115615837575f80fd5b908401906060828703121561584a575f80fd5b615852615474565b82518152602080840151615865816153ba565b8282015260408401518381111561587a575f80fd5b80850194505087601f85011261588e575f80fd5b8351925061589e615555846154cc565b83815288828587010111156158b1575f80fd5b6158c0848383018488016152bc565b806040840152508195506158d5818801615805565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a2357615a23615271565b505092915050565b5f6001600160401b0380831681810361565c5761565c615271565b5f60208284031215615a56575f80fd5b610cb182615084565b5f60208284031215615a6f575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a94575f80fd5b8301803591506001600160401b03821115615aad575f80fd5b602001915036819003821315612632575f80fd5b601f82111561214857805f5260205f20601f840160051c81016020851015615ae65750805b601f840160051c820191505b81811015610d51575f8155600101615af2565b81516001600160401b03811115615b1e57615b1e615460565b615b3281615b2c8454615702565b84615ac1565b602080601f831160018114615b65575f8415615b4e5750858301515b5f19600386901b1c1916600185901b178555612f09565b5f85815260208120601f198616915b82811015615b9357888601518255948401946001909101908401615b74565b5085821015615bb057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1023,12 +1023,14 @@ type NativeTokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte Nonce uint64 + Rewards *big.Int + Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} @@ -1051,9 +1053,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1101,9 +1103,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index ee6af6395..f661d7c2c 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -528,12 +528,13 @@ abstract contract PoSValidatorManager is $._redeemableValidatorRewards[validationID] += validatorFees; // Reward the remaining tokens to the delegator. - _reward(delegator.owner, rewards - validatorFees); + uint256 delegatorRewards = rewards - validatorFees; + _reward(delegator.owner, delegatorRewards); // Unlock the delegator's stake. _unlock(delegator.owner, weightToValue(delegator.weight)); - emit DelegationEnded(delegationID, validationID, nonce); + emit DelegationEnded(delegationID, validationID, nonce, delegatorRewards, validatorFees); } function _reward(address account, uint256 amount) internal virtual; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index b29225c0a..b4d8cefff 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -95,7 +95,11 @@ interface IPoSValidatorManager is IValidatorManager { * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce + bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, + uint256 rewards, + uint256 fees ); /** diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 7b8ee3778..0a6bd5d5a 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -71,7 +71,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegationEnded( - bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce + bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, + uint256 rewards, + uint256 fees ); function testDelegationFeeBipsTooLow() public { @@ -548,8 +552,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; - uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; _setUpCompleteEndDelegation({ validationID: validationID, @@ -557,6 +561,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, expectedReward: expectedDelegatorReward, + expectedFees: expectedValidatorFees, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -713,8 +718,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; - uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) _setUpCompleteEndDelegation({ @@ -723,6 +728,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, expectedReward: expectedDelegatorReward, + expectedFees: expectedValidatorFees, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -939,6 +945,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator, uint64 delegatorWeight, uint256 expectedReward, + uint256 expectedFees, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -949,7 +956,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(delegationID, validationID, expectedNonce); + emit DelegationEnded( + delegationID, validationID, expectedNonce, expectedReward, expectedFees + ); uint256 balanceBefore = _getStakeAssetBalance(delegator); _expectStakeUnlock(delegator, _weightToValue(delegatorWeight)); From 099bf13ea26ff8b7c335fff84718418ce9cf7bd1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 11:19:49 -0400 Subject: [PATCH 36/36] add test --- .../staking/tests/PoSValidatorManagerTests.t.sol | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 0a6bd5d5a..001260350 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -40,8 +40,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); - event GeoffEvent(uint256 num); - event DelegatorAdded( bytes32 indexed delegationID, bytes32 indexed validationID, @@ -415,6 +413,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); } + function testInitializeEndValidationNotOwner() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + vm.prank(address(1)); + vm.expectRevert("PoSValidatorManager: validator not owned by sender"); + posValidatorManager.initializeEndValidation(validationID, false, 0); + } + function testInitializeEndDelegation() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID,