From 42072cdfe182a6033d64bde4dede21d1b4b113a0 Mon Sep 17 00:00:00 2001 From: Steve Ellis Date: Wed, 20 May 2020 20:42:37 -0400 Subject: [PATCH] test gas usage against worst case scenario --- .../flux_aggregator_wrapper.go | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 2 +- evm-contracts/src/v0.6/dev/FluxAggregator.sol | 2 +- .../test/v0.6/FluxAggregator.test.ts | 45 +++++++++++++------ 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/core/internal/gethwrappers/generated/flux_aggregator_wrapper/flux_aggregator_wrapper.go b/core/internal/gethwrappers/generated/flux_aggregator_wrapper/flux_aggregator_wrapper.go index b891f070031..ea419b22f0f 100644 --- a/core/internal/gethwrappers/generated/flux_aggregator_wrapper/flux_aggregator_wrapper.go +++ b/core/internal/gethwrappers/generated/flux_aggregator_wrapper/flux_aggregator_wrapper.go @@ -31,7 +31,7 @@ var ( const FluxAggregatorABI = "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_link\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"_paymentAmount\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"_timeout\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"_description\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"current\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"AnswerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"AvailableFundsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"startedBy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"}],\"name\":\"NewRound\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"OracleAdminUpdateRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"OracleAdminUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"whitelisted\",\"type\":\"bool\"}],\"name\":\"OraclePermissionsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"requester\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"authorized\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"delay\",\"type\":\"uint32\"}],\"name\":\"RequesterPermissionsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint128\",\"name\":\"paymentAmount\",\"type\":\"uint128\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"minSubmissionCount\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"maxSubmissionCount\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"restartDelay\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"timeout\",\"type\":\"uint32\"}],\"name\":\"RoundDetailsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"submission\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"round\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oracle\",\"type\":\"address\"}],\"name\":\"SubmissionReceived\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"}],\"name\":\"acceptAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_oracles\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_admins\",\"type\":\"address[]\"},{\"internalType\":\"uint32\",\"name\":\"_minSubmissions\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_maxSubmissions\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_restartDelay\",\"type\":\"uint32\"}],\"name\":\"addOracles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allocatedFunds\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"availableFunds\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"}],\"name\":\"getAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"}],\"name\":\"getAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOracles\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"}],\"name\":\"getRoundData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"answeredInRound\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRoundData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"answeredInRound\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"}],\"name\":\"latestSubmission\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkToken\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSubmissionCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minSubmissionCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracleCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"}],\"name\":\"oracleRoundState\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_eligibleToSubmit\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"_roundId\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"_latestSubmission\",\"type\":\"int256\"},{\"internalType\":\"uint64\",\"name\":\"_startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"_timeout\",\"type\":\"uint64\"},{\"internalType\":\"uint128\",\"name\":\"_availableFunds\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"_oracleCount\",\"type\":\"uint32\"},{\"internalType\":\"uint128\",\"name\":\"_paymentAmount\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paymentAmount\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_oracles\",\"type\":\"address[]\"},{\"internalType\":\"uint32\",\"name\":\"_minSubmissions\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_maxSubmissions\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_restartDelay\",\"type\":\"uint32\"}],\"name\":\"removeOracles\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reportingRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestNewRound\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"restartDelay\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_requester\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_authorized\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"_delay\",\"type\":\"uint32\"}],\"name\":\"setRequesterPermissions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"},{\"internalType\":\"int256\",\"name\":\"_submission\",\"type\":\"int256\"}],\"name\":\"submit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timeout\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newAdmin\",\"type\":\"address\"}],\"name\":\"transferAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"updateAvailableFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"_paymentAmount\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"_minSubmissions\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_maxSubmissions\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_restartDelay\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"_timeout\",\"type\":\"uint32\"}],\"name\":\"updateFutureRounds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdrawPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_oracle\",\"type\":\"address\"}],\"name\":\"withdrawablePayment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]" // FluxAggregatorBin is the compiled bytecode used for deploying new contracts. -var FluxAggregatorBin = "0x60806040523480156200001157600080fd5b5060405162004f7638038062004f76833981810160405260a08110156200003757600080fd5b5080516020808301516040840151606085015160809095015160008054336001600160a01b031991821617909155600280549091166001600160a01b038716179055600480546001600160801b0319166001600160801b038516176001600160e01b0316600160e01b63ffffffff8516908102919091179091556005805460ff191660ff891617905560068290559495929491939091620000e49142919062000148811b6200322817901c565b6000805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c80546001600160401b03929092166801000000000000000002600160401b600160801b031990921691909117905550620001a69350505050565b600082821115620001a0576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b614dc080620001b66000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c806379ba50971161017b578063c1075329116100d8578063e9ee6eeb1161008c578063f2fde38b11610071578063f2fde38b146109be578063feaf968c146109f1578063ffa1ad74146109f9576102c8565b8063e9ee6eeb146108fb578063ebf8571c14610936576102c8565b8063c9374500116100bd578063c9374500146108b8578063d4cc54e4146108c0578063e2e40317146108c8576102c8565b8063c107532914610877578063c35905c6146108b0576102c8565b8063ab175a4d1161012f578063b633620c11610114578063b633620c14610734578063bb07bacd14610751578063bbf0b7e91461079d576102c8565b8063ab175a4d14610676578063b5ab58dc14610717576102c8565b80638da5cb5b116101605780638da5cb5b146105d457806398e5b12a146105dc578063a4c0ed36146105e4576102c8565b806379ba5097146105c45780638205bf6a146105cc576102c8565b806350d25bcd1161022957806364efb22b116101dd5780636fb4bb4e116101c25780636fb4bb4e146105ac57806370dea79a146105b45780637284e416146105bc576102c8565b806364efb22b14610571578063668a0f02146105a4576102c8565b806358609e441161020e57806358609e441461052e578063613d8fcc14610536578063628806ef1461053e576102c8565b806350d25bcd146104e357806357970e93146104fd576102c8565b806338aa4c721161028057806340884c521161026557806340884c521461045657806346fcff4c146104ae5780634f8fc3b5146104db576102c8565b806338aa4c72146103c05780633d3d771414610413576102c8565b806320ed0275116102b157806320ed02751461033a578063313ce56714610381578063357ebb021461039f576102c8565b80630720da52146102cd578063202ee0ed14610315575b600080fd5b6102ea600480360360208110156102e357600080fd5b5035610a01565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103386004803603604081101561032b57600080fd5b5080359060200135610a24565b005b6103386004803603606081101561035057600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff169060208101351515906040013563ffffffff16610b0f565b610389610cfe565b6040805160ff9092168252519081900360200190f35b6103a7610d07565b6040805163ffffffff9092168252519081900360200190f35b610338600480360360a08110156103d657600080fd5b506fffffffffffffffffffffffffffffffff8135169063ffffffff6020820135811691604081013582169160608201358116916080013516610d2f565b6103386004803603606081101561042957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356111d7565b61045e6114a6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561049a578181015183820152602001610482565b505050509050019250505060405180910390f35b6104b6611516565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610338611542565b6104eb61168e565b60408051918252519081900360200190f35b61050561169d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103a76116b9565b6103a76116d9565b6103386004803603602081101561055457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166116df565b6105056004803603602081101561058757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611827565b6104eb61185e565b6104eb611872565b6103a761187e565b6104eb6118aa565b6103386118b0565b6104eb6119b2565b6105056119bc565b6103386119d8565b610338600480360360608110156105fa57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561063757600080fd5b82018360208201111561064957600080fd5b8035906020019184600183028401116401000000008311171561066b57600080fd5b509092509050611b23565b6106a96004803603602081101561068c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b9e565b60408051981515895263ffffffff97881660208a01528881019690965267ffffffffffffffff94851660608901529290931660808701526fffffffffffffffffffffffffffffffff90811660a08701529190931660c08501529190911660e083015251908190036101000190f35b6104eb6004803603602081101561072d57600080fd5b5035611e09565b6104eb6004803603602081101561074a57600080fd5b5035611e1a565b6107846004803603602081101561076757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e25565b6040805192835260208301919091528051918290030190f35b610338600480360360a08110156107b357600080fd5b8101906020810181356401000000008111156107ce57600080fd5b8201836020820111156107e057600080fd5b8035906020019184602083028401116401000000008311171561080257600080fd5b91939092909160208101903564010000000081111561082057600080fd5b82018360208201111561083257600080fd5b8035906020019184602083028401116401000000008311171561085457600080fd5b919350915063ffffffff8135811691602081013582169160409091013516611e78565b6103386004803603604081101561088d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356120be565b6104b661231f565b6103a7612337565b6104b661235b565b6104eb600480360360208110156108de57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612373565b6103386004803603604081101561091157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166123ad565b6103386004803603608081101561094c57600080fd5b81019060208101813564010000000081111561096757600080fd5b82018360208201111561097957600080fd5b8035906020019184602083028401116401000000008311171561099b57600080fd5b919350915063ffffffff81358116916020810135821691604090910135166124e3565b610338600480360360208110156109d457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125fa565b6102ea6126f6565b6104eb612717565b6000806000806000610a128661271c565b939a9299509097509550909350915050565b6060610a303384612899565b905080516000148190610adb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610aa0578181015183820152602001610a88565b50505050905090810190601f168015610acd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610ae583612ba7565b610aef8284612c98565b610af883612dbb565b610b0183612f62565b610b0a836130dc565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b9557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff1615158215151415610bce57610b0a565b8115610c565773ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515177fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff841602179055610ca2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001690555b60408051831515815263ffffffff83166020820152815173ffffffffffffffffffffffffffffffffffffffff8616927fc3df5a754e002718f2e10804b99e6605e7c701d95cec9552c7680ca2b6f2820a928290030190a2505050565b60055460ff1681565b6004547801000000000000000000000000000000000000000000000000900463ffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610db557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6000610dbf6116d9565b90508463ffffffff168463ffffffff161015610e3c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff161015610eb757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff81161580610ed557508263ffffffff168163ffffffff16115b610f4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b610f5b866fffffffffffffffffffffffffffffffff1661315a565b60035470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610ff157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b6000610ffb6116d9565b63ffffffff16111561107c5760008563ffffffff161161107c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526008602052604090206002015462010000900416331461127557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792063616c6c61626c652062792061646d696e00000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205481906fffffffffffffffffffffffffffffffff90811690821681101561132257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e73756666696369656e7420776974686472617761626c652066756e647300604482015290519081900360640190fd5b6113446fffffffffffffffffffffffffffffffff82168363ffffffff61318d16565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260086020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9283161790556003546113b291168361318d565b600380547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff928316179055600254604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015293861660248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561146d57600080fd5b505af1158015611481573d6000803e3d6000fd5b505050506040513d602081101561149757600080fd5b505161149f57fe5b5050505050565b6060600b80548060200260200160405190810160405280929190818152602001828054801561150b57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116114e0575b505050505090505b90565b60035470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b600354600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516fffffffffffffffffffffffffffffffff700100000000000000000000000000000000850481169460009461162194929091169273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b1580156115e957600080fd5b505afa1580156115fd573d6000803e3d6000fd5b505050506040513d602081101561161357600080fd5b50519063ffffffff61322816565b600380546fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000084831602179091559091508216811461168a5760405181907ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f90600090a25b5050565b6000611698613299565b905090565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b600454700100000000000000000000000000000000900463ffffffff1681565b600b5490565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526008602052604090206003015416331461177757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6f6e6c792063616c6c61626c652062792070656e64696e672061646d696e0000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152600860205260408082206003810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560020180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16336201000081029190911790915590519092917f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90491a350565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260086020526040902060020154620100009004165b919050565b600754640100000000900463ffffffff1690565b60075463ffffffff1690565b6004547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1681565b60065481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461193657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006116986132bc565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b336000908152600a602052604090205460ff16611a5657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6e6f7420617574686f72697a6564207265717565737465720000000000000000604482015290519081900360640190fd5b60075463ffffffff1660008181526009602052604090206001015468010000000000000000900467ffffffffffffffff16151580611a985750611a98816132f8565b611b0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7072657620726f756e64206d75737420626520737570657273656461626c6500604482015290519081900360640190fd5b611b20611b1b63ffffffff8084169060019061338316565b613407565b50565b8015611b9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f7472616e7366657220646f65736e2774206163636570742063616c6c64617461604482015290519081900360640190fd5b611b98611542565b50505050565b600080808080808080333214611c1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f66662d636861696e2072656164696e67206f6e6c7900000000000000000000604482015290519081900360640190fd5b60075473ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020526040812054909163ffffffff9081167801000000000000000000000000000000000000000000000000909204161480611c815750600754611c7f9063ffffffff1661350f565b155b600754909150611c969063ffffffff1661352f565b8015611c9f5750805b15611ce857600754611cbd9063ffffffff9081169060019061338316565b6004549098506fffffffffffffffffffffffffffffffff169150611ce18a8961356f565b9850611d36565b60075463ffffffff166000818152600960205260409020600301549098506c0100000000000000000000000090046fffffffffffffffffffffffffffffffff169150611d338861350f565b98505b611d408a89612899565b5115611d4b57600098505b73ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020908152604080832060019081015463ffffffff8d811686526009909452919093209283015460039384015493548d948d9467ffffffffffffffff9093169268010000000000000000909104169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16611de66116d9565b959e50939c50919a50985063ffffffff1696509450925050919395975091939597565b6000611e14826135f4565b92915050565b6000611e148261360c565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020600181015490549091780100000000000000000000000000000000000000000000000090910463ffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611efe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b858414611f6c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6e6565642073616d65206f7261636c6520616e642061646d696e20636f756e74604482015290519081900360640190fd5b602a611f8e87611f7a6116d9565b63ffffffff1661363d90919063ffffffff16565b1115611ffb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d6178206f7261636c657320616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60005b868110156120685761206088888381811061201557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1687878481811061203e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166136b1565b600101611ffe565b506004546120b5906fffffffffffffffffffffffffffffffff8116908590859085907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16610d2f565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461214457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600454819061219790612168906fffffffffffffffffffffffffffffffff1661315a565b60035470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690613228565b101561220457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e73756666696369656e7420726573657276652066756e6473000000000000604482015290519081900360640190fd5b600254604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561228057600080fd5b505af1158015612294573d6000803e3d6000fd5b505050506040513d60208110156122aa57600080fd5b505161231757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6b656e207472616e73666572206661696c65640000000000000000000000604482015290519081900360640190fd5b61168a611542565b6004546fffffffffffffffffffffffffffffffff1681565b60045474010000000000000000000000000000000000000000900463ffffffff1681565b6003546fffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020546fffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526008602052604090206002015462010000900416331461244b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792063616c6c61626c652062792061646d696e00000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82811660008181526008602090815260409182902060030180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055815133815290810193909352805191927fb79bf2e89c2d70dde91d2991fb1ea69b7e478061ad7c04ed5b02b96bc52b8104929081900390910190a25050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461256957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60005b848110156125ad576125a586868381811061258357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613a85565b60010161256c565b5060045461149f906fffffffffffffffffffffffffffffffff8116908590859085907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16610d2f565b60005473ffffffffffffffffffffffffffffffffffffffff16331461268057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000806000612706613d40565b945094509450945094509091929394565b600281565b600080600080600061272c614c90565b63ffffffff808816600090815260096020908152604091829020825160a0808201855282548252600183015467ffffffffffffffff80821684870152680100000000000000008204168387015270010000000000000000000000000000000090049095166060820152835160028301805460c0958102830186019096529581018581529195929460808701949193928492909184918401828280156127f057602002820191906000526020600020905b8154815260200190600101908083116127dc575b50505091835250506001919091015463ffffffff8082166020808501919091526401000000008304821660408086019190915268010000000000000000840483166060808701919091526c010000000000000000000000009094046fffffffffffffffffffffffffffffffff1660809095019490945293909452855192860151918601519501519b9c919b67ffffffffffffffff9182169b509416985092169550909350505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460075460609163ffffffff7001000000000000000000000000000000009091048116911681612927576040518060400160405280601281526020017f6e6f7420656e61626c6564206f7261636c65000000000000000000000000000081525092505050611e14565b8363ffffffff168263ffffffff16111561297a576040518060400160405280601681526020017f6e6f742079657420656e61626c6564206f7261636c650000000000000000000081525092505050611e14565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604090205463ffffffff80861674010000000000000000000000000000000000000000909204161015612a07576040518060400160405280601881526020017f6e6f206c6f6e67657220616c6c6f776564206f7261636c65000000000000000081525092505050611e14565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604090205463ffffffff80861678010000000000000000000000000000000000000000000000009092041610612a97576040518060400160405280602081526020017f63616e6e6f74207265706f7274206f6e2070726576696f757320726f756e647381525092505050611e14565b8063ffffffff168463ffffffff1614158015612ad35750612ac363ffffffff8083169060019061338316565b63ffffffff168463ffffffff1614155b8015612ae65750612ae48482613d69565b155b15612b2a576040518060400160405280601781526020017f696e76616c696420726f756e6420746f207265706f727400000000000000000081525092505050611e14565b8363ffffffff16600114158015612b5b5750612b59612b5463ffffffff80871690600190613dcf16565b61352f565b155b15612b9f576040518060400160405280601f81526020017f70726576696f757320726f756e64206e6f7420737570657273656461626c650081525092505050611e14565b505092915050565b612bb081613e4c565b612bb957611b20565b3360009081526008602052604090205460045463ffffffff7c010000000000000000000000000000000000000000000000000000000090920482169178010000000000000000000000000000000000000000000000009091048116820190831611801590612c2657508015155b15612c315750611b20565b612c3a82613e7d565b50336000908152600860205260409020805463ffffffff83167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911617905550565b612ca18161350f565b612d0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f726f756e64206e6f7420616363657074696e67207375626d697373696f6e7300604482015290519081900360640190fd5b63ffffffff811660008181526009602090815260408083206002018054600180820183559185528385200187905533808552600890935281842080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000008702178155018690555190929185917f92e98423f8adac6e64d0608e519fd1cefb861498385c6dee70d58fc926ddc68c9190a45050565b63ffffffff808216600090815260096020526040902060038101546002909101546401000000009091049091161115612df357611b20565b63ffffffff811660009081526009602090815260408083206002018054825181850281018501909352808352612e5c93830182828015612e5257602002820191906000526020600020905b815481526020019060010190808311612e3e575b505050505061407a565b63ffffffff831660008181526009602090815260409182902084815560010180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff811691909102919091177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000860217909155600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff16640100000000860217905582519081529151939450919284927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f928290030190a35050565b63ffffffff808216600090815260096020526040812060039081015490546fffffffffffffffffffffffffffffffff6c01000000000000000000000000909204821693612fca9270010000000000000000000000000000000090920490911690849061318d16565b600380546fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000084831602179182905591925061300b911683614144565b600380547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92831617905533600090815260086020526040902054613063911683614144565b3360009081526008602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff94851617905551918316917ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f9190a2505050565b63ffffffff808216600090815260096020526040902060038101546002909101549116111561310a57611b20565b63ffffffff811660009081526009602052604081206002019061312d8282614cde565b5060010180547fffffffff0000000000000000000000000000000000000000000000000000000016905550565b6000611e14600261318161316c6116d9565b63ffffffff16856141cd90919063ffffffff16565b9063ffffffff6141cd16565b6000826fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16111561322257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282111561322257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754640100000000900463ffffffff1660009081526009602052604090205490565b600754640100000000900463ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1690565b63ffffffff80821660009081526009602052604081206001810154600390910154919267ffffffffffffffff9091169168010000000000000000900416811580159061334a575060008163ffffffff16115b801561337b57504261336f67ffffffffffffffff841663ffffffff8085169061424016565b67ffffffffffffffff16105b949350505050565b600082820163ffffffff808516908216101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b61341081613e4c565b61341957611b20565b336000908152600a602052604090205463ffffffff6501000000000082048116916101009004811682019083161180613450575080155b6134bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d7573742064656c617920726571756573747300000000000000000000000000604482015290519081900360640190fd5b6134c482613e7d565b50336000908152600a60205260409020805463ffffffff831665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff90911617905550565b63ffffffff90811660009081526009602052604090206003015416151590565b63ffffffff811660009081526009602052604081206001015468010000000000000000900467ffffffffffffffff16151580611e145750611e14826132f8565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205460045463ffffffff7c0100000000000000000000000000000000000000000000000000000000909204821691780100000000000000000000000000000000000000000000000090910481168201908416118061337b5750159392505050565b63ffffffff1660009081526009602052604090205490565b63ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1690565b60008282018381101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6136ba826142c1565b1561372657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c6520616c726561647920656e61626c656400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166137a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f63616e6e6f74207365742061646d696e20746f20300000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff828116600090815260086020526040902060020154620100009004161580613817575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600860205260409020600201546201000090048116908216145b61388257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f776e65722063616e6e6f74206f76657277726974652061646d696e00000000604482015290519081900360640190fd5b61388b8261430a565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526008602052604080822080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff63ffffffff97909716700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff909116179590951677ffffffff0000000000000000000000000000000000000000178555600b80546002909601805461ffff9097167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909716969096178655805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff00000000000000000000000000000000000000001685179055838352855494871662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909516949094179094559251919290917f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e9190a38073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90460405160405180910390a35050565b613a8e816142c1565b613af957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6f7261636c65206e6f7420656e61626c65640000000000000000000000000000604482015290519081900360640190fd5b600754613b129063ffffffff9081169060019061338316565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600860205260408120805463ffffffff9390931674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff90931692909217909155600b613ba76001613b936116d9565b63ffffffff16613dcf90919063ffffffff16565b63ffffffff1681548110613bb757fe5b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff85811680855260089093526040808520600290810180549390941680875291862001805461ffff9093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009384168117909155939094528154169055600b8054929350909183919083908110613c4d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b805480613ca057fe5b60008281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590910190915560405173ffffffffffffffffffffffffffffffffffffffff8516907f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e908390a3505050565b6000806000806000612706600760049054906101000a900463ffffffff1663ffffffff1661271c565b60008163ffffffff16613d8c60018563ffffffff1661338390919063ffffffff16565b63ffffffff1614801561340057505063ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1615919050565b60008263ffffffff168263ffffffff16111561322257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754600090613e689063ffffffff9081169060019061338316565b63ffffffff168263ffffffff16149050919050565b613e9a613e9563ffffffff80841690600190613dcf16565b61438b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090811663ffffffff848116918217909355600480546000838152600960209081526040918290206003810180547001000000000000000000000000000000009095048916949097169390931780875584547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909116740100000000000000000000000000000000000000009091048816640100000000021780875584547fffffffff00000000000000000000000000000000ffffffffffffffffffffffff9091166fffffffffffffffffffffffffffffffff9091166c01000000000000000000000000021780875593547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff9094167c010000000000000000000000000000000000000000000000000000000090940490961668010000000000000000029290921790935560019290920180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff90811691909117918290558351911681529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a350565b600081516000106140ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6c697374206d757374206e6f7420626520656d70747900000000000000000000604482015290519081900360640190fd5b8151600281046001821661412b576000806141118660006001870360018703876144a0565b9092509050614120828261457e565b945050505050611859565b61413b84600060018503846145ec565b92505050611859565b60008282016fffffffffffffffffffffffffffffffff808516908216101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826141dc57506000611e14565b828202828482816141e957fe5b0414613400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d6a6021913960400191505060405180910390fd5b600082820167ffffffffffffffff808516908216101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205463ffffffff7401000000000000000000000000000000000000000090910481161490565b60075460009063ffffffff16801580159061436a575073ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205463ffffffff8281167401000000000000000000000000000000000000000090920416145b15614376579050611859565b61340063ffffffff8083169060019061338316565b614394816132f8565b61439d57611b20565b60006143b463ffffffff80841690600190613dcf16565b63ffffffff8181166000908152600960205260408082208054878516845291832091825560019081015490820180547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000092839004909516909102939093177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217909255919250600201906144728282614cde565b5060010180547fffffffff000000000000000000000000000000000000000000000000000000001690555050565b6000808284106144af57600080fd5b8386111580156144bf5750848411155b6144c857600080fd5b8286111580156144d85750848311155b6144e157600080fd5b60078686031015614502576144f9878787878761467d565b91509150614574565b600061450f888888614b34565b90508084116145205780955061456e565b848110156145335780600101965061456e565b80851115801561454257508381105b61454857fe5b614554888883886145ec565b9250614565888260010188876145ec565b91506145749050565b506144e1565b9550959350505050565b6000808312801561458f5750600082135b806145a557506000831380156145a55750600082125b156145c55760026145b68484614c11565b816145bd57fe5b059050611e14565b600060028085078185070105905061337b6145e66002860560028605614c11565b82614c11565b6000818411156145fb57600080fd5b8282111561460857600080fd5b8284101561465f576007848403101561463457600061462a868686868761467d565b50915061337b9050565b6000614641868686614b34565b905080831161465257809350614659565b8060010194505b50614608565b84848151811061466b57fe5b60200260200101519050949350505050565b60008060008686600101039050600088886000018151811061469b57fe5b602002602001015190506000826001106146d5577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6146ed565b8989600101815181106146e457fe5b60200260200101515b905060008360021061471f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614737565b8a8a6002018151811061472e57fe5b60200260200101515b9050600084600310614769577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614781565b8b8b6003018151811061477857fe5b60200260200101515b90506000856004106147b3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6147cb565b8c8c600401815181106147c257fe5b60200260200101515b90506000866005106147fd577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614815565b8d8d6005018151811061480c57fe5b60200260200101515b9050600087600610614847577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61485f565b8e8e6006018151811061485657fe5b60200260200101515b90508587131561486d579495945b83851315614879579293925b81831315614885579091905b84871315614891579395935b8386131561489d579294925b808313156148a757915b848613156148b3579394935b808213156148bd57905b828713156148c9579195915b818613156148d5579094905b808513156148df57935b828613156148eb579194915b808413156148f557925b82851315614901579193915b8184131561490d579092905b82841315614919579192915b8d8c038061492957879a506149f6565b806001141561493a57869a506149f6565b806002141561494b57859a506149f6565b806003141561495c57849a506149f6565b806004141561496d57839a506149f6565b806005141561497e57829a506149f6565b806006141561498f57819a506149f6565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6b31206f7574206f6620626f756e647300000000000000000000000000000000604482015290519081900360640190fd5b8e8c038d8d1415614a1457508a995061457498505050505050505050565b80614a2b5750969850614574975050505050505050565b8060011415614a465750959850614574975050505050505050565b8060021415614a615750949850614574975050505050505050565b8060031415614a7c5750939850614574975050505050505050565b8060041415614a975750929850614574975050505050505050565b8060051415614ab25750919850614574975050505050505050565b8060061415614acd5750909850614574975050505050505050565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6b32206f7574206f6620626f756e647300000000000000000000000000000000604482015290519081900360640190fd5b6000808460028585010481518110614b4857fe5b602002602001015190506001840393506001830192505b60018401935080858581518110614b7257fe5b602002602001015112614b5f575b60018303925080858481518110614b9357fe5b602002602001015113614b805782841015614c0357848381518110614bb457fe5b6020026020010151858581518110614bc857fe5b6020026020010151868681518110614bdc57fe5b60200260200101878681518110614bef57fe5b602090810291909101019190915252614c0c565b82915050613400565b614b5f565b6000828201818312801590614c265750838112155b80614c3b5750600083128015614c3b57508381125b613400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d496021913960400191505060405180910390fd5b6040518060a0016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001614cd9614cfc565b905290565b5080546000825590600052602060002090810190611b209190614d2a565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915290565b61151391905b80821115614d445760008155600101614d30565b509056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358220000000000000000000000000000000000000000000000000000000000000000000064736f6c63430000000033" +var FluxAggregatorBin = "0x60806040523480156200001157600080fd5b5060405162004f7638038062004f76833981810160405260a08110156200003757600080fd5b5080516020808301516040840151606085015160809095015160008054336001600160a01b031991821617909155600280549091166001600160a01b038716179055600480546001600160801b0319166001600160801b038516176001600160e01b0316600160e01b63ffffffff8516908102919091179091556005805460ff191660ff891617905560068290559495929491939091620000e49142919062000148811b6200322817901c565b6000805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6c80546001600160401b03929092166801000000000000000002600160401b600160801b031990921691909117905550620001a69350505050565b600082821115620001a0576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b614dc080620001b66000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c806379ba50971161017b578063c1075329116100d8578063e9ee6eeb1161008c578063f2fde38b11610071578063f2fde38b146109be578063feaf968c146109f1578063ffa1ad74146109f9576102c8565b8063e9ee6eeb146108fb578063ebf8571c14610936576102c8565b8063c9374500116100bd578063c9374500146108b8578063d4cc54e4146108c0578063e2e40317146108c8576102c8565b8063c107532914610877578063c35905c6146108b0576102c8565b8063ab175a4d1161012f578063b633620c11610114578063b633620c14610734578063bb07bacd14610751578063bbf0b7e91461079d576102c8565b8063ab175a4d14610676578063b5ab58dc14610717576102c8565b80638da5cb5b116101605780638da5cb5b146105d457806398e5b12a146105dc578063a4c0ed36146105e4576102c8565b806379ba5097146105c45780638205bf6a146105cc576102c8565b806350d25bcd1161022957806364efb22b116101dd5780636fb4bb4e116101c25780636fb4bb4e146105ac57806370dea79a146105b45780637284e416146105bc576102c8565b806364efb22b14610571578063668a0f02146105a4576102c8565b806358609e441161020e57806358609e441461052e578063613d8fcc14610536578063628806ef1461053e576102c8565b806350d25bcd146104e357806357970e93146104fd576102c8565b806338aa4c721161028057806340884c521161026557806340884c521461045657806346fcff4c146104ae5780634f8fc3b5146104db576102c8565b806338aa4c72146103c05780633d3d771414610413576102c8565b806320ed0275116102b157806320ed02751461033a578063313ce56714610381578063357ebb021461039f576102c8565b80630720da52146102cd578063202ee0ed14610315575b600080fd5b6102ea600480360360208110156102e357600080fd5b5035610a01565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103386004803603604081101561032b57600080fd5b5080359060200135610a24565b005b6103386004803603606081101561035057600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff169060208101351515906040013563ffffffff16610b0f565b610389610cfe565b6040805160ff9092168252519081900360200190f35b6103a7610d07565b6040805163ffffffff9092168252519081900360200190f35b610338600480360360a08110156103d657600080fd5b506fffffffffffffffffffffffffffffffff8135169063ffffffff6020820135811691604081013582169160608201358116916080013516610d2f565b6103386004803603606081101561042957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356111d7565b61045e6114a6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561049a578181015183820152602001610482565b505050509050019250505060405180910390f35b6104b6611516565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610338611542565b6104eb61168e565b60408051918252519081900360200190f35b61050561169d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103a76116b9565b6103a76116d9565b6103386004803603602081101561055457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166116df565b6105056004803603602081101561058757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611827565b6104eb61185e565b6104eb611872565b6103a761187e565b6104eb6118aa565b6103386118b0565b6104eb6119b2565b6105056119bc565b6103386119d8565b610338600480360360608110156105fa57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561063757600080fd5b82018360208201111561064957600080fd5b8035906020019184600183028401116401000000008311171561066b57600080fd5b509092509050611b23565b6106a96004803603602081101561068c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b9e565b60408051981515895263ffffffff97881660208a01528881019690965267ffffffffffffffff94851660608901529290931660808701526fffffffffffffffffffffffffffffffff90811660a08701529190931660c08501529190911660e083015251908190036101000190f35b6104eb6004803603602081101561072d57600080fd5b5035611e09565b6104eb6004803603602081101561074a57600080fd5b5035611e1a565b6107846004803603602081101561076757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e25565b6040805192835260208301919091528051918290030190f35b610338600480360360a08110156107b357600080fd5b8101906020810181356401000000008111156107ce57600080fd5b8201836020820111156107e057600080fd5b8035906020019184602083028401116401000000008311171561080257600080fd5b91939092909160208101903564010000000081111561082057600080fd5b82018360208201111561083257600080fd5b8035906020019184602083028401116401000000008311171561085457600080fd5b919350915063ffffffff8135811691602081013582169160409091013516611e78565b6103386004803603604081101561088d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356120be565b6104b661231f565b6103a7612337565b6104b661235b565b6104eb600480360360208110156108de57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612373565b6103386004803603604081101561091157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166123ad565b6103386004803603608081101561094c57600080fd5b81019060208101813564010000000081111561096757600080fd5b82018360208201111561097957600080fd5b8035906020019184602083028401116401000000008311171561099b57600080fd5b919350915063ffffffff81358116916020810135821691604090910135166124e3565b610338600480360360208110156109d457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166125fa565b6102ea6126f6565b6104eb612717565b6000806000806000610a128661271c565b939a9299509097509550909350915050565b6060610a303384612899565b905080516000148190610adb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610aa0578181015183820152602001610a88565b50505050905090810190601f168015610acd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610ae583612ba7565b610aef8284612c98565b610af883612dbb565b610b0183612f62565b610b0a836130dc565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b9557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff1615158215151415610bce57610b0a565b8115610c565773ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831515177fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff841602179055610ca2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001690555b60408051831515815263ffffffff83166020820152815173ffffffffffffffffffffffffffffffffffffffff8616927fc3df5a754e002718f2e10804b99e6605e7c701d95cec9552c7680ca2b6f2820a928290030190a2505050565b60055460ff1681565b6004547801000000000000000000000000000000000000000000000000900463ffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610db557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b6000610dbf6116d9565b90508463ffffffff168463ffffffff161015610e3c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6d6178206d75737420657175616c2f657863656564206d696e00000000000000604482015290519081900360640190fd5b8363ffffffff168163ffffffff161015610eb757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d61782063616e6e6f742065786365656420746f74616c000000000000000000604482015290519081900360640190fd5b63ffffffff81161580610ed557508263ffffffff168163ffffffff16115b610f4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f64656c61792063616e6e6f742065786365656420746f74616c00000000000000604482015290519081900360640190fd5b610f5b866fffffffffffffffffffffffffffffffff1661315a565b60035470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610ff157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e73756666696369656e742066756e647320666f72207061796d656e740000604482015290519081900360640190fd5b6000610ffb6116d9565b63ffffffff16111561107c5760008563ffffffff161161107c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d696e206d7573742062652067726561746572207468616e2030000000000000604482015290519081900360640190fd5b85600460006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555084600460146101000a81548163ffffffff021916908363ffffffff16021790555083600460106101000a81548163ffffffff021916908363ffffffff16021790555082600460186101000a81548163ffffffff021916908363ffffffff160217905550816004601c6101000a81548163ffffffff021916908363ffffffff1602179055508363ffffffff168563ffffffff16600460009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff167f56800c9d1ed723511246614d15e58cfcde15b6a33c245b5c961b689c1890fd8f8686604051808363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019250505060405180910390a4505050505050565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526008602052604090206002015462010000900416331461127557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792063616c6c61626c652062792061646d696e00000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205481906fffffffffffffffffffffffffffffffff90811690821681101561132257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e73756666696369656e7420776974686472617761626c652066756e647300604482015290519081900360640190fd5b6113446fffffffffffffffffffffffffffffffff82168363ffffffff61318d16565b73ffffffffffffffffffffffffffffffffffffffff8616600090815260086020526040902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9283161790556003546113b291168361318d565b600380547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff928316179055600254604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015293861660248201529051929091169163a9059cbb916044808201926020929091908290030181600087803b15801561146d57600080fd5b505af1158015611481573d6000803e3d6000fd5b505050506040513d602081101561149757600080fd5b505161149f57fe5b5050505050565b6060600b80548060200260200160405190810160405280929190818152602001828054801561150b57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116114e0575b505050505090505b90565b60035470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1681565b600354600254604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516fffffffffffffffffffffffffffffffff700100000000000000000000000000000000850481169460009461162194929091169273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b1580156115e957600080fd5b505afa1580156115fd573d6000803e3d6000fd5b505050506040513d602081101561161357600080fd5b50519063ffffffff61322816565b600380546fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000084831602179091559091508216811461168a5760405181907ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f90600090a25b5050565b6000611698613299565b905090565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b600454700100000000000000000000000000000000900463ffffffff1681565b600b5490565b73ffffffffffffffffffffffffffffffffffffffff81811660009081526008602052604090206003015416331461177757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6f6e6c792063616c6c61626c652062792070656e64696e672061646d696e0000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166000818152600860205260408082206003810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560020180547fffffffffffffffffffff0000000000000000000000000000000000000000ffff16336201000081029190911790915590519092917f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90491a350565b73ffffffffffffffffffffffffffffffffffffffff808216600090815260086020526040902060020154620100009004165b919050565b600754640100000000900463ffffffff1690565b60075463ffffffff1690565b6004547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1681565b60065481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461193657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006116986132bc565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b336000908152600a602052604090205460ff16611a5657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6e6f7420617574686f72697a6564207265717565737465720000000000000000604482015290519081900360640190fd5b60075463ffffffff1660008181526009602052604090206001015468010000000000000000900467ffffffffffffffff16151580611a985750611a98816132f8565b611b0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7072657620726f756e64206d75737420626520737570657273656461626c6500604482015290519081900360640190fd5b611b20611b1b63ffffffff8084169060019061338316565b613407565b50565b8015611b9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f7472616e7366657220646f65736e2774206163636570742063616c6c64617461604482015290519081900360640190fd5b611b98611542565b50505050565b600080808080808080333214611c1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f66662d636861696e2072656164696e67206f6e6c7900000000000000000000604482015290519081900360640190fd5b60075473ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020526040812054909163ffffffff9081167801000000000000000000000000000000000000000000000000909204161480611c815750600754611c7f9063ffffffff1661350f565b155b600754909150611c969063ffffffff1661352f565b8015611c9f5750805b15611ce857600754611cbd9063ffffffff9081169060019061338316565b6004549098506fffffffffffffffffffffffffffffffff169150611ce18a8961356f565b9850611d36565b60075463ffffffff166000818152600960205260409020600301549098506c0100000000000000000000000090046fffffffffffffffffffffffffffffffff169150611d338861350f565b98505b611d408a89612899565b5115611d4b57600098505b73ffffffffffffffffffffffffffffffffffffffff8a16600090815260086020908152604080832060019081015463ffffffff8d811686526009909452919093209283015460039384015493548d948d9467ffffffffffffffff9093169268010000000000000000909104169070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16611de66116d9565b959e50939c50919a50985063ffffffff1696509450925050919395975091939597565b6000611e14826135f4565b92915050565b6000611e148261360c565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020600181015490549091780100000000000000000000000000000000000000000000000090910463ffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611efe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b858414611f6c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6e6565642073616d65206f7261636c6520616e642061646d696e20636f756e74604482015290519081900360640190fd5b604d611f8e87611f7a6116d9565b63ffffffff1661363d90919063ffffffff16565b1115611ffb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d6178206f7261636c657320616c6c6f77656400000000000000000000000000604482015290519081900360640190fd5b60005b868110156120685761206088888381811061201557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1687878481811061203e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166136b1565b600101611ffe565b506004546120b5906fffffffffffffffffffffffffffffffff8116908590859085907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16610d2f565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461214457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600454819061219790612168906fffffffffffffffffffffffffffffffff1661315a565b60035470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690613228565b101561220457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f696e73756666696369656e7420726573657276652066756e6473000000000000604482015290519081900360640190fd5b600254604080517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561228057600080fd5b505af1158015612294573d6000803e3d6000fd5b505050506040513d60208110156122aa57600080fd5b505161231757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6b656e207472616e73666572206661696c65640000000000000000000000604482015290519081900360640190fd5b61168a611542565b6004546fffffffffffffffffffffffffffffffff1681565b60045474010000000000000000000000000000000000000000900463ffffffff1681565b6003546fffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff166000908152600860205260409020546fffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff82811660009081526008602052604090206002015462010000900416331461244b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792063616c6c61626c652062792061646d696e00000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82811660008181526008602090815260409182902060030180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055815133815290810193909352805191927fb79bf2e89c2d70dde91d2991fb1ea69b7e478061ad7c04ed5b02b96bc52b8104929081900390910190a25050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461256957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60005b848110156125ad576125a586868381811061258357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613a85565b60010161256c565b5060045461149f906fffffffffffffffffffffffffffffffff8116908590859085907c0100000000000000000000000000000000000000000000000000000000900463ffffffff16610d2f565b60005473ffffffffffffffffffffffffffffffffffffffff16331461268057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000806000806000612706613d40565b945094509450945094509091929394565b600281565b600080600080600061272c614c90565b63ffffffff808816600090815260096020908152604091829020825160a0808201855282548252600183015467ffffffffffffffff80821684870152680100000000000000008204168387015270010000000000000000000000000000000090049095166060820152835160028301805460c0958102830186019096529581018581529195929460808701949193928492909184918401828280156127f057602002820191906000526020600020905b8154815260200190600101908083116127dc575b50505091835250506001919091015463ffffffff8082166020808501919091526401000000008304821660408086019190915268010000000000000000840483166060808701919091526c010000000000000000000000009094046fffffffffffffffffffffffffffffffff1660809095019490945293909452855192860151918601519501519b9c919b67ffffffffffffffff9182169b509416985092169550909350505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460075460609163ffffffff7001000000000000000000000000000000009091048116911681612927576040518060400160405280601281526020017f6e6f7420656e61626c6564206f7261636c65000000000000000000000000000081525092505050611e14565b8363ffffffff168263ffffffff16111561297a576040518060400160405280601681526020017f6e6f742079657420656e61626c6564206f7261636c650000000000000000000081525092505050611e14565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604090205463ffffffff80861674010000000000000000000000000000000000000000909204161015612a07576040518060400160405280601881526020017f6e6f206c6f6e67657220616c6c6f776564206f7261636c65000000000000000081525092505050611e14565b73ffffffffffffffffffffffffffffffffffffffff851660009081526008602052604090205463ffffffff80861678010000000000000000000000000000000000000000000000009092041610612a97576040518060400160405280602081526020017f63616e6e6f74207265706f7274206f6e2070726576696f757320726f756e647381525092505050611e14565b8063ffffffff168463ffffffff1614158015612ad35750612ac363ffffffff8083169060019061338316565b63ffffffff168463ffffffff1614155b8015612ae65750612ae48482613d69565b155b15612b2a576040518060400160405280601781526020017f696e76616c696420726f756e6420746f207265706f727400000000000000000081525092505050611e14565b8363ffffffff16600114158015612b5b5750612b59612b5463ffffffff80871690600190613dcf16565b61352f565b155b15612b9f576040518060400160405280601f81526020017f70726576696f757320726f756e64206e6f7420737570657273656461626c650081525092505050611e14565b505092915050565b612bb081613e4c565b612bb957611b20565b3360009081526008602052604090205460045463ffffffff7c010000000000000000000000000000000000000000000000000000000090920482169178010000000000000000000000000000000000000000000000009091048116820190831611801590612c2657508015155b15612c315750611b20565b612c3a82613e7d565b50336000908152600860205260409020805463ffffffff83167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911617905550565b612ca18161350f565b612d0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f726f756e64206e6f7420616363657074696e67207375626d697373696f6e7300604482015290519081900360640190fd5b63ffffffff811660008181526009602090815260408083206002018054600180820183559185528385200187905533808552600890935281842080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000008702178155018690555190929185917f92e98423f8adac6e64d0608e519fd1cefb861498385c6dee70d58fc926ddc68c9190a45050565b63ffffffff808216600090815260096020526040902060038101546002909101546401000000009091049091161115612df357611b20565b63ffffffff811660009081526009602090815260408083206002018054825181850281018501909352808352612e5c93830182828015612e5257602002820191906000526020600020905b815481526020019060010190808311612e3e575b505050505061407a565b63ffffffff831660008181526009602090815260409182902084815560010180547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff811691909102919091177fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16700100000000000000000000000000000000860217909155600780547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff16640100000000860217905582519081529151939450919284927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f928290030190a35050565b63ffffffff808216600090815260096020526040812060039081015490546fffffffffffffffffffffffffffffffff6c01000000000000000000000000909204821693612fca9270010000000000000000000000000000000090920490911690849061318d16565b600380546fffffffffffffffffffffffffffffffff90811670010000000000000000000000000000000084831602179182905591925061300b911683614144565b600380547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff92831617905533600090815260086020526040902054613063911683614144565b3360009081526008602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff94851617905551918316917ffe25c73e3b9089fac37d55c4c7efcba6f04af04cebd2fc4d6d7dbb07e1e5234f9190a2505050565b63ffffffff808216600090815260096020526040902060038101546002909101549116111561310a57611b20565b63ffffffff811660009081526009602052604081206002019061312d8282614cde565b5060010180547fffffffff0000000000000000000000000000000000000000000000000000000016905550565b6000611e14600261318161316c6116d9565b63ffffffff16856141cd90919063ffffffff16565b9063ffffffff6141cd16565b6000826fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16111561322257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282111561322257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754640100000000900463ffffffff1660009081526009602052604090205490565b600754640100000000900463ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1690565b63ffffffff80821660009081526009602052604081206001810154600390910154919267ffffffffffffffff9091169168010000000000000000900416811580159061334a575060008163ffffffff16115b801561337b57504261336f67ffffffffffffffff841663ffffffff8085169061424016565b67ffffffffffffffff16105b949350505050565b600082820163ffffffff808516908216101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b61341081613e4c565b61341957611b20565b336000908152600a602052604090205463ffffffff6501000000000082048116916101009004811682019083161180613450575080155b6134bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d7573742064656c617920726571756573747300000000000000000000000000604482015290519081900360640190fd5b6134c482613e7d565b50336000908152600a60205260409020805463ffffffff831665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff90911617905550565b63ffffffff90811660009081526009602052604090206003015416151590565b63ffffffff811660009081526009602052604081206001015468010000000000000000900467ffffffffffffffff16151580611e145750611e14826132f8565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604081205460045463ffffffff7c0100000000000000000000000000000000000000000000000000000000909204821691780100000000000000000000000000000000000000000000000090910481168201908416118061337b5750159392505050565b63ffffffff1660009081526009602052604090205490565b63ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1690565b60008282018381101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6136ba826142c1565b1561372657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f7261636c6520616c726561647920656e61626c656400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166137a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f63616e6e6f74207365742061646d696e20746f20300000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff828116600090815260086020526040902060020154620100009004161580613817575073ffffffffffffffffffffffffffffffffffffffff8281166000908152600860205260409020600201546201000090048116908216145b61388257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f776e65722063616e6e6f74206f76657277726974652061646d696e00000000604482015290519081900360640190fd5b61388b8261430a565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526008602052604080822080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff63ffffffff97909716700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff909116179590951677ffffffff0000000000000000000000000000000000000000178555600b80546002909601805461ffff9097167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909716969096178655805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180547fffffffffffffffffffffffff00000000000000000000000000000000000000001685179055838352855494871662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909516949094179094559251919290917f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e9190a38073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f0c5055390645c15a4be9a21b3f8d019153dcb4a0c125685da6eb84048e2fe90460405160405180910390a35050565b613a8e816142c1565b613af957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6f7261636c65206e6f7420656e61626c65640000000000000000000000000000604482015290519081900360640190fd5b600754613b129063ffffffff9081169060019061338316565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600860205260408120805463ffffffff9390931674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff90931692909217909155600b613ba76001613b936116d9565b63ffffffff16613dcf90919063ffffffff16565b63ffffffff1681548110613bb757fe5b60009182526020808320919091015473ffffffffffffffffffffffffffffffffffffffff85811680855260089093526040808520600290810180549390941680875291862001805461ffff9093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009384168117909155939094528154169055600b8054929350909183919083908110613c4d57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b805480613ca057fe5b60008281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905590910190915560405173ffffffffffffffffffffffffffffffffffffffff8516907f18dd09695e4fbdae8d1a5edb11221eb04564269c29a089b9753a6535c54ba92e908390a3505050565b6000806000806000612706600760049054906101000a900463ffffffff1663ffffffff1661271c565b60008163ffffffff16613d8c60018563ffffffff1661338390919063ffffffff16565b63ffffffff1614801561340057505063ffffffff1660009081526009602052604090206001015468010000000000000000900467ffffffffffffffff1615919050565b60008263ffffffff168263ffffffff16111561322257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b600754600090613e689063ffffffff9081169060019061338316565b63ffffffff168263ffffffff16149050919050565b613e9a613e9563ffffffff80841690600190613dcf16565b61438b565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000090811663ffffffff848116918217909355600480546000838152600960209081526040918290206003810180547001000000000000000000000000000000009095048916949097169390931780875584547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909116740100000000000000000000000000000000000000009091048816640100000000021780875584547fffffffff00000000000000000000000000000000ffffffffffffffffffffffff9091166fffffffffffffffffffffffffffffffff9091166c01000000000000000000000000021780875593547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff9094167c010000000000000000000000000000000000000000000000000000000090940490961668010000000000000000029290921790935560019290920180547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000164267ffffffffffffffff90811691909117918290558351911681529151339391927f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac6027192908290030190a350565b600081516000106140ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6c697374206d757374206e6f7420626520656d70747900000000000000000000604482015290519081900360640190fd5b8151600281046001821661412b576000806141118660006001870360018703876144a0565b9092509050614120828261457e565b945050505050611859565b61413b84600060018503846145ec565b92505050611859565b60008282016fffffffffffffffffffffffffffffffff808516908216101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000826141dc57506000611e14565b828202828482816141e957fe5b0414613400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d6a6021913960400191505060405180910390fd5b600082820167ffffffffffffffff808516908216101561340057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff1660009081526008602052604090205463ffffffff7401000000000000000000000000000000000000000090910481161490565b60075460009063ffffffff16801580159061436a575073ffffffffffffffffffffffffffffffffffffffff831660009081526008602052604090205463ffffffff8281167401000000000000000000000000000000000000000090920416145b15614376579050611859565b61340063ffffffff8083169060019061338316565b614394816132f8565b61439d57611b20565b60006143b463ffffffff80841690600190613dcf16565b63ffffffff8181166000908152600960205260408082208054878516845291832091825560019081015490820180547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff1670010000000000000000000000000000000092839004909516909102939093177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff16680100000000000000004267ffffffffffffffff160217909255919250600201906144728282614cde565b5060010180547fffffffff000000000000000000000000000000000000000000000000000000001690555050565b6000808284106144af57600080fd5b8386111580156144bf5750848411155b6144c857600080fd5b8286111580156144d85750848311155b6144e157600080fd5b60078686031015614502576144f9878787878761467d565b91509150614574565b600061450f888888614b34565b90508084116145205780955061456e565b848110156145335780600101965061456e565b80851115801561454257508381105b61454857fe5b614554888883886145ec565b9250614565888260010188876145ec565b91506145749050565b506144e1565b9550959350505050565b6000808312801561458f5750600082135b806145a557506000831380156145a55750600082125b156145c55760026145b68484614c11565b816145bd57fe5b059050611e14565b600060028085078185070105905061337b6145e66002860560028605614c11565b82614c11565b6000818411156145fb57600080fd5b8282111561460857600080fd5b8284101561465f576007848403101561463457600061462a868686868761467d565b50915061337b9050565b6000614641868686614b34565b905080831161465257809350614659565b8060010194505b50614608565b84848151811061466b57fe5b60200260200101519050949350505050565b60008060008686600101039050600088886000018151811061469b57fe5b602002602001015190506000826001106146d5577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6146ed565b8989600101815181106146e457fe5b60200260200101515b905060008360021061471f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614737565b8a8a6002018151811061472e57fe5b60200260200101515b9050600084600310614769577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614781565b8b8b6003018151811061477857fe5b60200260200101515b90506000856004106147b3577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6147cb565b8c8c600401815181106147c257fe5b60200260200101515b90506000866005106147fd577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff614815565b8d8d6005018151811061480c57fe5b60200260200101515b9050600087600610614847577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61485f565b8e8e6006018151811061485657fe5b60200260200101515b90508587131561486d579495945b83851315614879579293925b81831315614885579091905b84871315614891579395935b8386131561489d579294925b808313156148a757915b848613156148b3579394935b808213156148bd57905b828713156148c9579195915b818613156148d5579094905b808513156148df57935b828613156148eb579194915b808413156148f557925b82851315614901579193915b8184131561490d579092905b82841315614919579192915b8d8c038061492957879a506149f6565b806001141561493a57869a506149f6565b806002141561494b57859a506149f6565b806003141561495c57849a506149f6565b806004141561496d57839a506149f6565b806005141561497e57829a506149f6565b806006141561498f57819a506149f6565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6b31206f7574206f6620626f756e647300000000000000000000000000000000604482015290519081900360640190fd5b8e8c038d8d1415614a1457508a995061457498505050505050505050565b80614a2b5750969850614574975050505050505050565b8060011415614a465750959850614574975050505050505050565b8060021415614a615750949850614574975050505050505050565b8060031415614a7c5750939850614574975050505050505050565b8060041415614a975750929850614574975050505050505050565b8060051415614ab25750919850614574975050505050505050565b8060061415614acd5750909850614574975050505050505050565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6b32206f7574206f6620626f756e647300000000000000000000000000000000604482015290519081900360640190fd5b6000808460028585010481518110614b4857fe5b602002602001015190506001840393506001830192505b60018401935080858581518110614b7257fe5b602002602001015112614b5f575b60018303925080858481518110614b9357fe5b602002602001015113614b805782841015614c0357848381518110614bb457fe5b6020026020010151858581518110614bc857fe5b6020026020010151868681518110614bdc57fe5b60200260200101878681518110614bef57fe5b602090810291909101019190915252614c0c565b82915050613400565b614b5f565b6000828201818312801590614c265750838112155b80614c3b5750600083128015614c3b57508381125b613400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614d496021913960400191505060405180910390fd5b6040518060a0016040528060008152602001600067ffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff168152602001614cd9614cfc565b905290565b5080546000825590600052602060002090810190611b209190614d2a565b6040805160a08101825260608082526000602083018190529282018390528101829052608081019190915290565b61151391905b80821115614d445760008155600101614d30565b509056fe5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358220000000000000000000000000000000000000000000000000000000000000000000064736f6c63430000000033" // DeployFluxAggregator deploys a new Ethereum contract, binding an instance of FluxAggregator to it. func DeployFluxAggregator(auth *bind.TransactOpts, backend bind.ContractBackend, _link common.Address, _paymentAmount *big.Int, _timeout uint32, _decimals uint8, _description [32]byte) (common.Address, *types.Transaction, *FluxAggregator, error) { diff --git a/core/internal/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/internal/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 72655360bf2..9fcaffd4958 100644 --- a/core/internal/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/internal/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,5 +1,5 @@ GETH_VERSION: 1.9.12 -flux_aggregator_wrapper: ../../../evm-contracts/abi/v0.6/FluxAggregator.json f1e5411a1c2c97a2f14a986f158a752bb3a13cb410ffdd674a8dba1afb53cf67 +flux_aggregator_wrapper: ../../../evm-contracts/abi/v0.6/FluxAggregator.json 20e1368b958a1f79f1159b7fd6344bc5b2d6954f181ad39c6b67461357fe76f8 link_token_interface: ./generation/../../../../evm-test-helpers/src/LinkToken.json a16bfa4690d25769959dd59034f03d101a46ecbf7e774a57ca6874f8352c8568 solidity_request_id: ../../../evm-contracts/abi/v0.6/VRFRequestIDBaseTestHelper.json f0216e71d1bfeb6f85efe231e3ba9e751fb23b04b2a0d233b5edbd010d9488ec solidity_verifier_wrapper: ../../../evm-contracts/abi/v0.6/VRFTestHelper.json 1b1736395f3b4c1fb90eab2fcadd0529a0f093ccb279fda1d0759a7164ef5674 diff --git a/evm-contracts/src/v0.6/dev/FluxAggregator.sol b/evm-contracts/src/v0.6/dev/FluxAggregator.sol index 98e3ad3e981..42baa01ee96 100644 --- a/evm-contracts/src/v0.6/dev/FluxAggregator.sol +++ b/evm-contracts/src/v0.6/dev/FluxAggregator.sol @@ -81,7 +81,7 @@ contract FluxAggregator is AggregatorInterface, Owned { * funds without the owner's intervention.) */ uint256 constant private RESERVE_ROUNDS = 2; - uint256 constant private MAX_ORACLE_COUNT = 100; + uint256 constant private MAX_ORACLE_COUNT = 77; uint32 private reportingRoundId; uint32 internal latestRoundId; diff --git a/evm-contracts/test/v0.6/FluxAggregator.test.ts b/evm-contracts/test/v0.6/FluxAggregator.test.ts index 714ab3fd3a8..60f345e0f11 100644 --- a/evm-contracts/test/v0.6/FluxAggregator.test.ts +++ b/evm-contracts/test/v0.6/FluxAggregator.test.ts @@ -1052,7 +1052,7 @@ describe('FluxAggregator', () => { }) }) - const limit = 100 + const limit = 77 describe(`when adding more than ${limit} oracles`, () => { let oracles: ethers.Wallet[] @@ -1081,28 +1081,45 @@ describe('FluxAggregator', () => { addresses = oracles.slice(50, 100).map(o => o.address) await aggregator .connect(personas.Carol) - .addOracles(addresses, addresses, 1, 100, rrDelay) + .addOracles(addresses, addresses, 1, oracles.length, rrDelay) }) it('not use too much gas', async () => { let tx: any - let receipt: any - let i: any - - let txs = [] - for (i = 0; i < limit; i++) { - tx = await aggregator - .connect(oracles[i]) - .submit(nextRound, Math.floor(Math.random() * 10000)) - txs.push(tx) + assert.deepEqual( + // test adveserial quickselect algo + [2, 4, 6, 8, 10, 12, 14, 16, 1, 9, 5, 11, 3, 13, 7, 15], + adverserialQuickselectList(16), + ) + const inputs = adverserialQuickselectList(limit) + for (let i = 0; i < limit; i++) { + tx = await aggregator.connect(oracles[i]).submit(nextRound, inputs[i]) } assert(!!tx) - if (!!tx) { - receipt = await tx.wait() - assert.isAbove(500_000, receipt.gasUsed.toNumber()) + if (tx) { + const receipt = await tx.wait() + assert.isAbove(400_000, receipt.gasUsed.toNumber()) } }) + function adverserialQuickselectList(len: number): number[] { + const xs: number[] = [] + const pi: number[] = [] + for (let i = 0; i < len; i++) { + pi[i] = i + xs[i] = 0 + } + + for (let l = len; l > 0; l--) { + const pivot = Math.floor((l - 1) / 2) + xs[pi[pivot]] = l + const temp = pi[l - 1] + pi[l - 1] = pi[pivot] + pi[pivot] = temp + } + return xs + } + it('reverts when another oracle is added', async () => { await matchers.evmRevert( aggregator