diff --git a/.gitignore b/.gitignore index 6066aed5..5a0dadf6 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,6 @@ contracts/src/flattened/ *.temp-checkpoint.json # intellij -*.idea/ \ No newline at end of file +*.idea/ + +./snapshots \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 1b4d7324..2c9651c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,7 +43,8 @@ itertools = "0.14.0" rayon = "1.11.0" async-stream = "0.3.6" serde = "1.0" - +chrono = { version = "0.4", features = ["serde"] } +serde_json = "1.0" [dev-dependencies] rand = "0.9.2" diff --git a/examples/hooks.rs b/examples/hooks.rs new file mode 100644 index 00000000..928882b0 --- /dev/null +++ b/examples/hooks.rs @@ -0,0 +1,70 @@ +use alloy::{ + primitives::{address, Address}, + providers::ProviderBuilder, + rpc::client::ClientBuilder, + transports::layers::{RetryBackoffLayer, ThrottleLayer}, +}; +use alloy_provider::WsConnect; +use amms::{ + amms::{uniswap_v2::UniswapV2Pool, uniswap_v3::UniswapV3Pool}, + state_space::{hooks::StateHook, StateSpaceBuilder}, +}; +use futures::StreamExt; +use std::sync::Arc; +use tracing::Level; + +#[tokio::main] +async fn main() -> eyre::Result<()> { + tracing_subscriber::fmt().with_max_level(Level::INFO).init(); + let rpc_endpoint = std::env::var("ETHEREUM_PROVIDER_WS")?; + + let client = ClientBuilder::default() + .layer(ThrottleLayer::new(500)) + .layer(RetryBackoffLayer::new(5, 200, 330)) + .ws(WsConnect::new(rpc_endpoint)) + .await?; + + let sync_provider = Arc::new(ProviderBuilder::new().connect_client(client)); + + let amms = vec![ + UniswapV2Pool::new(address!("B4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc"), 300).into(), + UniswapV3Pool::new(address!("88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640")).into(), + ]; + + let state_space_manager = StateSpaceBuilder::new(sync_provider.clone()) + .with_amms(amms) + // Enables background snapshotting + // See: [`hooks::SnapshotConfig`] for configuration options + .with_snapshot_enabled(None) + // start syncing from a snapshotted state + // .with_snapshot_path("./snapshots/") --- IGNORE --- + // Registers hooks to be called after every block is processed + .with_hooks(vec![simple_counter()]) + .sync() + .await?; + + let mut stream = state_space_manager.subscribe().await?; + let _res = stream.next().await.iter().take(20); + + std::fs::remove_dir_all("./snapshots")?; + + Ok(()) +} + +pub fn simple_counter() -> StateHook> { + let count = Arc::new(std::sync::atomic::AtomicU64::new(0)); + + let hook = move |updated_pools: &Vec
| { + let total = count.fetch_add( + updated_pools.len() as u64, + std::sync::atomic::Ordering::Relaxed, + ); + + println!( + "total AMMs updated so far: {}", + total + updated_pools.len() as u64 + ); + }; + + Arc::new(hook) +} diff --git a/src/amms/abi/WethValueInPools.json b/src/amms/abi/WethValueInPools.json index d1966473..5869699d 100644 --- a/src/amms/abi/WethValueInPools.json +++ b/src/amms/abi/WethValueInPools.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"_uniswapV2Factory","type":"address","internalType":"address"},{"name":"_uniswapV3Factory","type":"address","internalType":"address"},{"name":"_weth","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"getWethValueInPools","inputs":[{"name":"pools","type":"tuple[]","internalType":"struct WethValueInPools.PoolInfo[]","components":[{"name":"poolType","type":"uint8","internalType":"enum WethValueInPools.PoolType"},{"name":"poolAddress","type":"address","internalType":"address"}]}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct WethValueInPools.PoolInfoReturn[]","components":[{"name":"poolType","type":"uint8","internalType":"enum WethValueInPools.PoolType"},{"name":"poolAddress","type":"address","internalType":"address"},{"name":"wethValue","type":"uint256","internalType":"uint256"}]}],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x608060405234801561000f575f5ffd5b5060405161269338038061269383398181016040528101906100319190610156565b825f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506101a6565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610125826100fc565b9050919050565b6101358161011b565b811461013f575f5ffd5b50565b5f815190506101508161012c565b92915050565b5f5f5f6060848603121561016d5761016c6100f8565b5b5f61017a86828701610142565b935050602061018b86828701610142565b925050604061019c86828701610142565b9150509250925092565b6124e0806101b35f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063339173fd1461002d575b5f5ffd5b61004760048036038101906100429190611a7a565b61005d565b6040516100549190611c43565b60405180910390f35b60605f825167ffffffffffffffff81111561007b5761007a611870565b5b6040519080825280602002602001820160405280156100b457816020015b6100a1611805565b8152602001906001900390816100995790505b5090505f5f90505b83518110156102f4575f8482815181106100d9576100d8611c63565b5b602002602001015190505f60028111156100f6576100f5611aea565b5b815f0151600281111561010c5761010b611aea565b5b0361018f575f61011f82602001516102fe565b90506040518060600160405280835f0151600281111561014257610141611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061017e5761017d611c63565b5b6020026020010181905250506102e6565b600160028111156101a3576101a2611aea565b5b815f015160028111156101b9576101b8611aea565b5b0361023c575f6101cc8260200151610587565b90506040518060600160405280835f015160028111156101ef576101ee611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061022b5761022a611c63565b5b6020026020010181905250506102e5565b60028081111561024f5761024e611aea565b5b815f0151600281111561026557610264611aea565b5b036102e4575f6102788260200151610825565b90506040518060600160405280835f0151600281111561029b5761029a611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001828152508484815181106102d7576102d6611c63565b5b6020026020010181905250505b5b5b5080806001019150506100bc565b5080915050919050565b5f60608273ffffffffffffffffffffffffffffffffffffffff1663cc77828d6040518163ffffffff1660e01b81526004015f604051808303815f875af192505050801561036d57506040513d5f823e3d601f19601f8201168201806040525081019061036a9190611d64565b60015b61037a575f915050610582565b809150505f5f90505b81518110156104ba5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168282815181106103d7576103d6611c63565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036104ad578373ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f83838151811061042957610428611c63565b5b60200260200101516040518263ffffffff1660e01b815260040161044d9190611dba565b6020604051808303815f875af192505050801561048857506040513d601f19601f820116820180604052508101906104859190611dfd565b60015b610496575f92505050610582565b8251816104a39190611e55565b9350505050610582565b8080600101915050610383565b505f815f815181106104cf576104ce611c63565b5b602002602001015190505f8473ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f836040518263ffffffff1660e01b81526004016105139190611dba565b6020604051808303815f875af192505050801561054e57506040513d601f19601f8201168201806040525081019061054b9190611dfd565b60015b61055d575f9350505050610582565b809150505f61056c8383610b9a565b905083518161057b9190611e55565b9450505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156105f157506040513d601f19601f820116820180604052508101906105ee9190611e96565b60015b6105fe575f915050610820565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561066b57506040513d601f19601f820116820180604052508101906106689190611e96565b60015b610679575f92505050610820565b809150508373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa9250505080156106e557506040513d601f19601f820116820180604052508101906106e29190611f3d565b60015b6106f3575f92505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610770576002836107549190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107ed576002826107d19190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b5f61080886856dffffffffffffffffffffffffffff16610b9a565b90506002816108179190611e55565b96505050505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561088f57506040513d601f19601f8201168201806040525081019061088c9190611e96565b60015b61089c575f915050610b95565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561090957506040513d601f19601f820116820180604052508101906109069190611e96565b60015b610917575f92505050610b95565b8091505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a07578173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016109a89190611dba565b602060405180830381865afa9250505080156109e257506040513d601f19601f820116820180604052508101906109df9190611dfd565b60015b6109f0575f92505050610b95565b6002816109fd9190611e55565b9350505050610b95565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610af3578073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610a949190611dba565b602060405180830381865afa925050508015610ace57506040513d601f19601f82011682018060405250810190610acb9190611dfd565b60015b610adc575f92505050610b95565b600281610ae99190611e55565b9350505050610b95565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610b2c9190611dba565b602060405180830381865afa925050508015610b6657506040513d601f19601f82011682018060405250810190610b639190611dfd565b60015b610b74575f92505050610b95565b5f610b7f8483610b9a565b9050600281610b8e9190611e55565b9450505050505b919050565b5f5f610ba584610bf0565b90505f816fffffffffffffffffffffffffffffffff161115610bd357610bcb8184610c35565b915050610bea565b806fffffffffffffffffffffffffffffffff169150505b92915050565b5f5f610bfb83610d1f565b90505f816fffffffffffffffffffffffffffffffff161115610c205780915050610c30565b610c2983611070565b9050809150505b919050565b5f5f821480610c5557505f836fffffffffffffffffffffffffffffffff16145b15610c62575f9050610d19565b5f60406fffffffffffffffffffffffffffffffff8416856fffffffffffffffffffffffffffffffff1602901c90505f608084901c856fffffffffffffffffffffffffffffffff1602905077ffffffffffffffffffffffffffffffffffffffffffffffff811115610cd6575f92505050610d19565b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03811115610d11575f92505050610d19565b818101925050505b92915050565b5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439058460025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610d9d929190611fc9565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e1a575f91505061106b565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa925050508015610e8457506040513d601f19601f82011682018060405250810190610e819190611f3d565b60015b610e93575f935050505061106b565b8294508193505050505f826dffffffffffffffffffffffffffff161480610ec957505f816dffffffffffffffffffffffffffff16145b15610ed9575f935050505061106b565b5f5f610ee48761133d565b9150915080610efa575f9550505050505061106b565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1610610f555784610f57565b835b90505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1610610fb45784610fb6565b855b9050601260ff168460ff16111561100057601284610fd49190611ffc565b600a610fe0919061215f565b816dffffffffffffffffffffffffffff16610ffb91906121d6565b611035565b83601261100d9190611ffc565b600a611019919061215f565b816dffffffffffffffffffffffffffff166110349190611e55565b5b9050611061826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff166114a1565b9750505050505050505b919050565b5f5f60405180606001604052806101f461ffff168152602001610bb861ffff16815260200161271061ffff1681525090505f5f5f90505b60038110156111d0575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631698ee828760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687866003811061112457611123611c63565b5b60200201516040518463ffffffff1660e01b81526004016111479392919061225a565b602060405180830381865afa158015611162573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111869190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146111c457809250506111d0565b508060010190506110a7565b505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361120e575f92505050611338565b5f8173ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa92505050801561127757506040513d601f19601f820116820180604052508101906112749190612378565b60015b611286575f9350505050611338565b869750505050505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161090505f5f6112ee8861133d565b9150915080611305575f9650505050505050611338565b604061132d85858661131857601261131a565b855b876113255786611328565b60125b611683565b901c96505050505050505b919050565b5f5f5f5f8473ffffffffffffffffffffffffffffffffffffffff16614e206040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516113eb9190612467565b5f604051808303815f8787f1925050503d805f8114611425576040519150601f19603f3d011682016040523d82523d5f602084013e61142a565b606091505b50915091508115611493575f602082510361148557818060200190518101906114539190611dfd565b90505f811480611463575060ff81115b15611476575f5f9450945050505061149c565b8060019450945050505061149c565b5f5f9450945050505061149c565b5f5f9350935050505b915091565b5f5f82036114b1575f905061167d565b5f77ffffffffffffffffffffffffffffffffffffffffffffffff84116114ed5782604085901b816114e5576114e46121a9565b5b049050611657565b5f60c090505f60c086901c9050640100000000811061151457602081901c90506020820191505b62010000811061152c57601081901c90506010820191505b610100811061154357600881901c90506008820191505b6010811061155957600481901c90506004820191505b6004811061156f57600281901c90506002820191505b6002811061157e576001820191505b600160bf830360018703901c018260ff0387901b816115a05761159f6121a9565b5b0492506fffffffffffffffffffffffffffffffff8311156115c6575f935050505061167d565b5f608086901c840290505f6fffffffffffffffffffffffffffffffff8716850290505f60c089901c90505f60408a901b905082811015611607576001820391505b8281039050608084901b925082811015611622576001820391505b8281039050608084901c821461163b5761163a61247d565b5b88818161164b5761164a6121a9565b5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115611678575f91505061167d565b809150505b92915050565b5f5f82840390505f5f825f0b126116bb578160ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a026116ee565b815f0360ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a816116ec576116eb6121a9565b5b045b9050806c01000000000000000000000000111561170f575f925050506117fd565b5f86611767576c010000000000000000000000008281611732576117316121a9565b5b046fffffffffffffffffffffffffffffffff6c010000000000000000000000000281611761576117606121a9565b5b04611786565b6c010000000000000000000000008281611784576117836121a9565b5b045b90508661179357806117c4565b6c010000000000000000000000006fffffffffffffffffffffffffffffffff8202816117c2576117c16121a9565b5b045b93507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156117f9575f93505050506117fd565b5050505b949350505050565b60405180606001604052805f600281111561182357611822611aea565b5b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6118a682611860565b810181811067ffffffffffffffff821117156118c5576118c4611870565b5b80604052505050565b5f6118d761184b565b90506118e3828261189d565b919050565b5f67ffffffffffffffff82111561190257611901611870565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b60038110611927575f5ffd5b50565b5f813590506119388161191b565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119678261193e565b9050919050565b6119778161195d565b8114611981575f5ffd5b50565b5f813590506119928161196e565b92915050565b5f604082840312156119ad576119ac611917565b5b6119b760406118ce565b90505f6119c68482850161192a565b5f8301525060206119d984828501611984565b60208301525092915050565b5f6119f76119f2846118e8565b6118ce565b90508083825260208201905060408402830185811115611a1a57611a19611913565b5b835b81811015611a435780611a2f8882611998565b845260208401935050604081019050611a1c565b5050509392505050565b5f82601f830112611a6157611a6061185c565b5b8135611a718482602086016119e5565b91505092915050565b5f60208284031215611a8f57611a8e611854565b5b5f82013567ffffffffffffffff811115611aac57611aab611858565b5b611ab884828501611a4d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110611b2857611b27611aea565b5b50565b5f819050611b3882611b17565b919050565b5f611b4782611b2b565b9050919050565b611b5781611b3d565b82525050565b611b668161195d565b82525050565b5f819050919050565b611b7e81611b6c565b82525050565b606082015f820151611b985f850182611b4e565b506020820151611bab6020850182611b5d565b506040820151611bbe6040850182611b75565b50505050565b5f611bcf8383611b84565b60608301905092915050565b5f602082019050919050565b5f611bf182611ac1565b611bfb8185611acb565b9350611c0683611adb565b805f5b83811015611c36578151611c1d8882611bc4565b9750611c2883611bdb565b925050600181019050611c09565b5085935050505092915050565b5f6020820190508181035f830152611c5b8184611be7565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f67ffffffffffffffff821115611caa57611ca9611870565b5b602082029050602081019050919050565b5f81519050611cc98161196e565b92915050565b5f611ce1611cdc84611c90565b6118ce565b90508083825260208201905060208402830185811115611d0457611d03611913565b5b835b81811015611d2d5780611d198882611cbb565b845260208401935050602081019050611d06565b5050509392505050565b5f82601f830112611d4b57611d4a61185c565b5b8151611d5b848260208601611ccf565b91505092915050565b5f60208284031215611d7957611d78611854565b5b5f82015167ffffffffffffffff811115611d9657611d95611858565b5b611da284828501611d37565b91505092915050565b611db48161195d565b82525050565b5f602082019050611dcd5f830184611dab565b92915050565b611ddc81611b6c565b8114611de6575f5ffd5b50565b5f81519050611df781611dd3565b92915050565b5f60208284031215611e1257611e11611854565b5b5f611e1f84828501611de9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e5f82611b6c565b9150611e6a83611b6c565b9250828202611e7881611b6c565b91508282048414831517611e8f57611e8e611e28565b5b5092915050565b5f60208284031215611eab57611eaa611854565b5b5f611eb884828501611cbb565b91505092915050565b5f6dffffffffffffffffffffffffffff82169050919050565b611ee381611ec1565b8114611eed575f5ffd5b50565b5f81519050611efe81611eda565b92915050565b5f63ffffffff82169050919050565b611f1c81611f04565b8114611f26575f5ffd5b50565b5f81519050611f3781611f13565b92915050565b5f5f5f60608486031215611f5457611f53611854565b5b5f611f6186828701611ef0565b9350506020611f7286828701611ef0565b9250506040611f8386828701611f29565b9150509250925092565b5f611f9782611ec1565b9150611fa283611ec1565b9250828202611fb081611ec1565b9150808214611fc257611fc1611e28565b5b5092915050565b5f604082019050611fdc5f830185611dab565b611fe96020830184611dab565b9392505050565b5f60ff82169050919050565b5f61200682611ff0565b915061201183611ff0565b9250828203905060ff81111561202a57612029611e28565b5b92915050565b5f8160011c9050919050565b5f5f8291508390505b60018511156120855780860481111561206157612060611e28565b5b60018516156120705780820291505b808102905061207e85612030565b9450612045565b94509492505050565b5f8261209d5760019050612158565b816120aa575f9050612158565b81600181146120c057600281146120ca576120f9565b6001915050612158565b60ff8411156120dc576120db611e28565b5b8360020a9150848211156120f3576120f2611e28565b5b50612158565b5060208310610133831016604e8410600b841016171561212e5782820a90508381111561212957612128611e28565b5b612158565b61213b848484600161203c565b9250905081840481111561215257612151611e28565b5b81810290505b9392505050565b5f61216982611b6c565b915061217483611ff0565b92506121a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461208e565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6121e082611b6c565b91506121eb83611b6c565b9250826121fb576121fa6121a9565b5b828204905092915050565b5f61ffff82169050919050565b5f62ffffff82169050919050565b5f819050919050565b5f61224461223f61223a84612206565b612221565b612213565b9050919050565b6122548161222a565b82525050565b5f60608201905061226d5f830186611dab565b61227a6020830185611dab565b612287604083018461224b565b949350505050565b6122988161193e565b81146122a2575f5ffd5b50565b5f815190506122b38161228f565b92915050565b5f8160020b9050919050565b6122ce816122b9565b81146122d8575f5ffd5b50565b5f815190506122e9816122c5565b92915050565b6122f881612206565b8114612302575f5ffd5b50565b5f81519050612313816122ef565b92915050565b61232281611ff0565b811461232c575f5ffd5b50565b5f8151905061233d81612319565b92915050565b5f8115159050919050565b61235781612343565b8114612361575f5ffd5b50565b5f815190506123728161234e565b92915050565b5f5f5f5f5f5f5f60e0888a03121561239357612392611854565b5b5f6123a08a828b016122a5565b97505060206123b18a828b016122db565b96505060406123c28a828b01612305565b95505060606123d38a828b01612305565b94505060806123e48a828b01612305565b93505060a06123f58a828b0161232f565b92505060c06124068a828b01612364565b91505092959891949750929550565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61244182612415565b61244b818561241f565b935061245b818560208601612429565b80840191505092915050565b5f6124728284612437565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220fbecc7363fddc240183f228cc94d576c055fde0c1de0f8e7ea8b7ba822558b2264736f6c634300081e0033","sourceMap":"468:10235:37:-:0;;;1079:206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1191:17;1170:18;;:38;;;;;;;;;;;;;;;;;;1239:17;1218:18;;:38;;;;;;;;;;;;;;;;;;1273:5;1266:4;;:12;;;;;;;;;;;;;;;;;;1079:206;;;468:10235;;88:117:46;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:663::-;933:6;941;949;998:2;986:9;977:7;973:23;969:32;966:119;;;1004:79;;:::i;:::-;966:119;1124:1;1149:64;1205:7;1196:6;1185:9;1181:22;1149:64;:::i;:::-;1139:74;;1095:128;1262:2;1288:64;1344:7;1335:6;1324:9;1320:22;1288:64;:::i;:::-;1278:74;;1233:129;1401:2;1427:64;1483:7;1474:6;1463:9;1459:22;1427:64;:::i;:::-;1417:74;;1372:129;845:663;;;;;:::o;468:10235:37:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063339173fd1461002d575b5f5ffd5b61004760048036038101906100429190611a7a565b61005d565b6040516100549190611c43565b60405180910390f35b60605f825167ffffffffffffffff81111561007b5761007a611870565b5b6040519080825280602002602001820160405280156100b457816020015b6100a1611805565b8152602001906001900390816100995790505b5090505f5f90505b83518110156102f4575f8482815181106100d9576100d8611c63565b5b602002602001015190505f60028111156100f6576100f5611aea565b5b815f0151600281111561010c5761010b611aea565b5b0361018f575f61011f82602001516102fe565b90506040518060600160405280835f0151600281111561014257610141611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061017e5761017d611c63565b5b6020026020010181905250506102e6565b600160028111156101a3576101a2611aea565b5b815f015160028111156101b9576101b8611aea565b5b0361023c575f6101cc8260200151610587565b90506040518060600160405280835f015160028111156101ef576101ee611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061022b5761022a611c63565b5b6020026020010181905250506102e5565b60028081111561024f5761024e611aea565b5b815f0151600281111561026557610264611aea565b5b036102e4575f6102788260200151610825565b90506040518060600160405280835f0151600281111561029b5761029a611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001828152508484815181106102d7576102d6611c63565b5b6020026020010181905250505b5b5b5080806001019150506100bc565b5080915050919050565b5f60608273ffffffffffffffffffffffffffffffffffffffff1663cc77828d6040518163ffffffff1660e01b81526004015f604051808303815f875af192505050801561036d57506040513d5f823e3d601f19601f8201168201806040525081019061036a9190611d64565b60015b61037a575f915050610582565b809150505f5f90505b81518110156104ba5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168282815181106103d7576103d6611c63565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036104ad578373ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f83838151811061042957610428611c63565b5b60200260200101516040518263ffffffff1660e01b815260040161044d9190611dba565b6020604051808303815f875af192505050801561048857506040513d601f19601f820116820180604052508101906104859190611dfd565b60015b610496575f92505050610582565b8251816104a39190611e55565b9350505050610582565b8080600101915050610383565b505f815f815181106104cf576104ce611c63565b5b602002602001015190505f8473ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f836040518263ffffffff1660e01b81526004016105139190611dba565b6020604051808303815f875af192505050801561054e57506040513d601f19601f8201168201806040525081019061054b9190611dfd565b60015b61055d575f9350505050610582565b809150505f61056c8383610b9a565b905083518161057b9190611e55565b9450505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156105f157506040513d601f19601f820116820180604052508101906105ee9190611e96565b60015b6105fe575f915050610820565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561066b57506040513d601f19601f820116820180604052508101906106689190611e96565b60015b610679575f92505050610820565b809150508373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa9250505080156106e557506040513d601f19601f820116820180604052508101906106e29190611f3d565b60015b6106f3575f92505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610770576002836107549190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107ed576002826107d19190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b5f61080886856dffffffffffffffffffffffffffff16610b9a565b90506002816108179190611e55565b96505050505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561088f57506040513d601f19601f8201168201806040525081019061088c9190611e96565b60015b61089c575f915050610b95565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561090957506040513d601f19601f820116820180604052508101906109069190611e96565b60015b610917575f92505050610b95565b8091505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a07578173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016109a89190611dba565b602060405180830381865afa9250505080156109e257506040513d601f19601f820116820180604052508101906109df9190611dfd565b60015b6109f0575f92505050610b95565b6002816109fd9190611e55565b9350505050610b95565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610af3578073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610a949190611dba565b602060405180830381865afa925050508015610ace57506040513d601f19601f82011682018060405250810190610acb9190611dfd565b60015b610adc575f92505050610b95565b600281610ae99190611e55565b9350505050610b95565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610b2c9190611dba565b602060405180830381865afa925050508015610b6657506040513d601f19601f82011682018060405250810190610b639190611dfd565b60015b610b74575f92505050610b95565b5f610b7f8483610b9a565b9050600281610b8e9190611e55565b9450505050505b919050565b5f5f610ba584610bf0565b90505f816fffffffffffffffffffffffffffffffff161115610bd357610bcb8184610c35565b915050610bea565b806fffffffffffffffffffffffffffffffff169150505b92915050565b5f5f610bfb83610d1f565b90505f816fffffffffffffffffffffffffffffffff161115610c205780915050610c30565b610c2983611070565b9050809150505b919050565b5f5f821480610c5557505f836fffffffffffffffffffffffffffffffff16145b15610c62575f9050610d19565b5f60406fffffffffffffffffffffffffffffffff8416856fffffffffffffffffffffffffffffffff1602901c90505f608084901c856fffffffffffffffffffffffffffffffff1602905077ffffffffffffffffffffffffffffffffffffffffffffffff811115610cd6575f92505050610d19565b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03811115610d11575f92505050610d19565b818101925050505b92915050565b5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439058460025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610d9d929190611fc9565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e1a575f91505061106b565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa925050508015610e8457506040513d601f19601f82011682018060405250810190610e819190611f3d565b60015b610e93575f935050505061106b565b8294508193505050505f826dffffffffffffffffffffffffffff161480610ec957505f816dffffffffffffffffffffffffffff16145b15610ed9575f935050505061106b565b5f5f610ee48761133d565b9150915080610efa575f9550505050505061106b565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1610610f555784610f57565b835b90505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1610610fb45784610fb6565b855b9050601260ff168460ff16111561100057601284610fd49190611ffc565b600a610fe0919061215f565b816dffffffffffffffffffffffffffff16610ffb91906121d6565b611035565b83601261100d9190611ffc565b600a611019919061215f565b816dffffffffffffffffffffffffffff166110349190611e55565b5b9050611061826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff166114a1565b9750505050505050505b919050565b5f5f60405180606001604052806101f461ffff168152602001610bb861ffff16815260200161271061ffff1681525090505f5f5f90505b60038110156111d0575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631698ee828760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687866003811061112457611123611c63565b5b60200201516040518463ffffffff1660e01b81526004016111479392919061225a565b602060405180830381865afa158015611162573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111869190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146111c457809250506111d0565b508060010190506110a7565b505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361120e575f92505050611338565b5f8173ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa92505050801561127757506040513d601f19601f820116820180604052508101906112749190612378565b60015b611286575f9350505050611338565b869750505050505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161090505f5f6112ee8861133d565b9150915080611305575f9650505050505050611338565b604061132d85858661131857601261131a565b855b876113255786611328565b60125b611683565b901c96505050505050505b919050565b5f5f5f5f8473ffffffffffffffffffffffffffffffffffffffff16614e206040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516113eb9190612467565b5f604051808303815f8787f1925050503d805f8114611425576040519150601f19603f3d011682016040523d82523d5f602084013e61142a565b606091505b50915091508115611493575f602082510361148557818060200190518101906114539190611dfd565b90505f811480611463575060ff81115b15611476575f5f9450945050505061149c565b8060019450945050505061149c565b5f5f9450945050505061149c565b5f5f9350935050505b915091565b5f5f82036114b1575f905061167d565b5f77ffffffffffffffffffffffffffffffffffffffffffffffff84116114ed5782604085901b816114e5576114e46121a9565b5b049050611657565b5f60c090505f60c086901c9050640100000000811061151457602081901c90506020820191505b62010000811061152c57601081901c90506010820191505b610100811061154357600881901c90506008820191505b6010811061155957600481901c90506004820191505b6004811061156f57600281901c90506002820191505b6002811061157e576001820191505b600160bf830360018703901c018260ff0387901b816115a05761159f6121a9565b5b0492506fffffffffffffffffffffffffffffffff8311156115c6575f935050505061167d565b5f608086901c840290505f6fffffffffffffffffffffffffffffffff8716850290505f60c089901c90505f60408a901b905082811015611607576001820391505b8281039050608084901b925082811015611622576001820391505b8281039050608084901c821461163b5761163a61247d565b5b88818161164b5761164a6121a9565b5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115611678575f91505061167d565b809150505b92915050565b5f5f82840390505f5f825f0b126116bb578160ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a026116ee565b815f0360ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a816116ec576116eb6121a9565b5b045b9050806c01000000000000000000000000111561170f575f925050506117fd565b5f86611767576c010000000000000000000000008281611732576117316121a9565b5b046fffffffffffffffffffffffffffffffff6c010000000000000000000000000281611761576117606121a9565b5b04611786565b6c010000000000000000000000008281611784576117836121a9565b5b045b90508661179357806117c4565b6c010000000000000000000000006fffffffffffffffffffffffffffffffff8202816117c2576117c16121a9565b5b045b93507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156117f9575f93505050506117fd565b5050505b949350505050565b60405180606001604052805f600281111561182357611822611aea565b5b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6118a682611860565b810181811067ffffffffffffffff821117156118c5576118c4611870565b5b80604052505050565b5f6118d761184b565b90506118e3828261189d565b919050565b5f67ffffffffffffffff82111561190257611901611870565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b60038110611927575f5ffd5b50565b5f813590506119388161191b565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119678261193e565b9050919050565b6119778161195d565b8114611981575f5ffd5b50565b5f813590506119928161196e565b92915050565b5f604082840312156119ad576119ac611917565b5b6119b760406118ce565b90505f6119c68482850161192a565b5f8301525060206119d984828501611984565b60208301525092915050565b5f6119f76119f2846118e8565b6118ce565b90508083825260208201905060408402830185811115611a1a57611a19611913565b5b835b81811015611a435780611a2f8882611998565b845260208401935050604081019050611a1c565b5050509392505050565b5f82601f830112611a6157611a6061185c565b5b8135611a718482602086016119e5565b91505092915050565b5f60208284031215611a8f57611a8e611854565b5b5f82013567ffffffffffffffff811115611aac57611aab611858565b5b611ab884828501611a4d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110611b2857611b27611aea565b5b50565b5f819050611b3882611b17565b919050565b5f611b4782611b2b565b9050919050565b611b5781611b3d565b82525050565b611b668161195d565b82525050565b5f819050919050565b611b7e81611b6c565b82525050565b606082015f820151611b985f850182611b4e565b506020820151611bab6020850182611b5d565b506040820151611bbe6040850182611b75565b50505050565b5f611bcf8383611b84565b60608301905092915050565b5f602082019050919050565b5f611bf182611ac1565b611bfb8185611acb565b9350611c0683611adb565b805f5b83811015611c36578151611c1d8882611bc4565b9750611c2883611bdb565b925050600181019050611c09565b5085935050505092915050565b5f6020820190508181035f830152611c5b8184611be7565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f67ffffffffffffffff821115611caa57611ca9611870565b5b602082029050602081019050919050565b5f81519050611cc98161196e565b92915050565b5f611ce1611cdc84611c90565b6118ce565b90508083825260208201905060208402830185811115611d0457611d03611913565b5b835b81811015611d2d5780611d198882611cbb565b845260208401935050602081019050611d06565b5050509392505050565b5f82601f830112611d4b57611d4a61185c565b5b8151611d5b848260208601611ccf565b91505092915050565b5f60208284031215611d7957611d78611854565b5b5f82015167ffffffffffffffff811115611d9657611d95611858565b5b611da284828501611d37565b91505092915050565b611db48161195d565b82525050565b5f602082019050611dcd5f830184611dab565b92915050565b611ddc81611b6c565b8114611de6575f5ffd5b50565b5f81519050611df781611dd3565b92915050565b5f60208284031215611e1257611e11611854565b5b5f611e1f84828501611de9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e5f82611b6c565b9150611e6a83611b6c565b9250828202611e7881611b6c565b91508282048414831517611e8f57611e8e611e28565b5b5092915050565b5f60208284031215611eab57611eaa611854565b5b5f611eb884828501611cbb565b91505092915050565b5f6dffffffffffffffffffffffffffff82169050919050565b611ee381611ec1565b8114611eed575f5ffd5b50565b5f81519050611efe81611eda565b92915050565b5f63ffffffff82169050919050565b611f1c81611f04565b8114611f26575f5ffd5b50565b5f81519050611f3781611f13565b92915050565b5f5f5f60608486031215611f5457611f53611854565b5b5f611f6186828701611ef0565b9350506020611f7286828701611ef0565b9250506040611f8386828701611f29565b9150509250925092565b5f611f9782611ec1565b9150611fa283611ec1565b9250828202611fb081611ec1565b9150808214611fc257611fc1611e28565b5b5092915050565b5f604082019050611fdc5f830185611dab565b611fe96020830184611dab565b9392505050565b5f60ff82169050919050565b5f61200682611ff0565b915061201183611ff0565b9250828203905060ff81111561202a57612029611e28565b5b92915050565b5f8160011c9050919050565b5f5f8291508390505b60018511156120855780860481111561206157612060611e28565b5b60018516156120705780820291505b808102905061207e85612030565b9450612045565b94509492505050565b5f8261209d5760019050612158565b816120aa575f9050612158565b81600181146120c057600281146120ca576120f9565b6001915050612158565b60ff8411156120dc576120db611e28565b5b8360020a9150848211156120f3576120f2611e28565b5b50612158565b5060208310610133831016604e8410600b841016171561212e5782820a90508381111561212957612128611e28565b5b612158565b61213b848484600161203c565b9250905081840481111561215257612151611e28565b5b81810290505b9392505050565b5f61216982611b6c565b915061217483611ff0565b92506121a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461208e565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6121e082611b6c565b91506121eb83611b6c565b9250826121fb576121fa6121a9565b5b828204905092915050565b5f61ffff82169050919050565b5f62ffffff82169050919050565b5f819050919050565b5f61224461223f61223a84612206565b612221565b612213565b9050919050565b6122548161222a565b82525050565b5f60608201905061226d5f830186611dab565b61227a6020830185611dab565b612287604083018461224b565b949350505050565b6122988161193e565b81146122a2575f5ffd5b50565b5f815190506122b38161228f565b92915050565b5f8160020b9050919050565b6122ce816122b9565b81146122d8575f5ffd5b50565b5f815190506122e9816122c5565b92915050565b6122f881612206565b8114612302575f5ffd5b50565b5f81519050612313816122ef565b92915050565b61232281611ff0565b811461232c575f5ffd5b50565b5f8151905061233d81612319565b92915050565b5f8115159050919050565b61235781612343565b8114612361575f5ffd5b50565b5f815190506123728161234e565b92915050565b5f5f5f5f5f5f5f60e0888a03121561239357612392611854565b5b5f6123a08a828b016122a5565b97505060206123b18a828b016122db565b96505060406123c28a828b01612305565b95505060606123d38a828b01612305565b94505060806123e48a828b01612305565b93505060a06123f58a828b0161232f565b92505060c06124068a828b01612364565b91505092959891949750929550565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61244182612415565b61244b818561241f565b935061245b818560208601612429565b80840191505092915050565b5f6124728284612437565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea2646970667358221220fbecc7363fddc240183f228cc94d576c055fde0c1de0f8e7ea8b7ba822558b2264736f6c634300081e0033","sourceMap":"468:10235:37:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1908:1035;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;1978:23;2013:39;2076:5;:12;2055:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2013:76;;2104:9;2116:1;2104:13;;2099:806;2123:5;:12;2119:1;:16;2099:806;;;2156:20;2179:5;2185:1;2179:8;;;;;;;;:::i;:::-;;;;;;;;2156:31;;2222:17;2205:34;;;;;;;;:::i;:::-;;:4;:13;;;:34;;;;;;;;:::i;:::-;;;2201:694;;2259:17;2279:36;2298:4;:16;;;2279:18;:36::i;:::-;2259:56;;2354:58;;;;;;;;2369:4;:13;;;2354:58;;;;;;;;:::i;:::-;;;;;;2384:4;:16;;;2354:58;;;;;;2402:9;2354:58;;;2333:15;2349:1;2333:18;;;;;;;;:::i;:::-;;;;;;;:79;;;;2241:186;2201:694;;;2454:18;2437:35;;;;;;;;:::i;:::-;;:4;:13;;;:35;;;;;;;;:::i;:::-;;;2433:462;;2492:17;2512:37;2532:4;:16;;;2512:19;:37::i;:::-;2492:57;;2588:58;;;;;;;;2603:4;:13;;;2588:58;;;;;;;;:::i;:::-;;;;;;2618:4;:16;;;2588:58;;;;;;2636:9;2588:58;;;2567:15;2583:1;2567:18;;;;;;;;:::i;:::-;;;;;;;:79;;;;2474:187;2433:462;;;2688:18;2671:35;;;;;;;;:::i;:::-;;:4;:13;;;:35;;;;;;;;:::i;:::-;;;2667:228;;2726:17;2746:37;2766:4;:16;;;2746:19;:37::i;:::-;2726:57;;2822:58;;;;;;;;2837:4;:13;;;2822:58;;;;;;;;:::i;:::-;;;;;;2852:4;:16;;;2822:58;;;;;;2870:9;2822:58;;;2801:15;2817:1;2801:18;;;;;;;;:::i;:::-;;;;;;;:79;;;;2708:187;2667:228;2433:462;2201:694;2142:763;2137:3;;;;;;;2099:806;;;;2921:15;2914:22;;;1908:1035;;;:::o;2949:1221::-;3009:7;3055:23;3099:4;3092:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3088:152;;3228:1;3221:8;;;;;3088:152;3182:7;3173:16;;3124:76;3359:9;3371:1;3359:13;;3354:473;3378:6;:13;3374:1;:17;3354:473;;;3429:4;;;;;;;;;;;3416:17;;:6;3423:1;3416:9;;;;;;;;:::i;:::-;;;;;;;;:17;;;3412:405;;3464:4;3457:23;;;3481:6;3488:1;3481:9;;;;;;;;:::i;:::-;;;;;;;;3457:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3453:350;;3783:1;3776:8;;;;;;3453:350;3715:6;:13;3704:8;:24;;;;:::i;:::-;3697:31;;;;;;;3412:405;3393:3;;;;;;;3354:473;;;;3837:17;3857:6;3864:1;3857:9;;;;;;;;:::i;:::-;;;;;;;;3837:29;;3876:15;3912:4;3905:23;;;3929:9;3905:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3901:149;;4038:1;4031:8;;;;;;;3901:149;3991:8;3981:18;;3940:70;4060:17;4080:41;4102:9;4113:7;4080:21;:41::i;:::-;4060:61;;4150:6;:13;4138:9;:25;;;;:::i;:::-;4131:32;;;;;;2949:1221;;;;:::o;4176:896::-;4237:7;4256:14;4299:4;4284:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4280:141;;4409:1;4402:8;;;;;4280:141;4363:7;4354:16;;4314:67;4430:14;4473:4;4458:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4454:141;;4583:1;4576:8;;;;;;4454:141;4537:7;4528:16;;4488:67;4623:4;4608:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4604:462;;5054:1;5047:8;;;;;;4604:462;4724:4;;;;;;;;;;;4714:14;;:6;:14;;;4710:150;;4766:1;4755:8;:12;;;;:::i;:::-;4748:19;;;;;;;;;;;4710:150;4802:4;;;;;;;;;;;4792:14;;:6;:14;;;4788:72;;4844:1;4833:8;:12;;;;:::i;:::-;4826:19;;;;;;;;;;;4788:72;4922:17;4942:39;4964:6;4972:8;4942:39;;:21;:39::i;:::-;4922:59;;5014:1;5002:9;:13;;;;:::i;:::-;4995:20;;;;;;;;4176:896;;;;:::o;5078:1167::-;5139:7;5158:14;5209:4;5186:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5182:150;;5320:1;5313:8;;;;;5182:150;5274:7;5265:16;;5225:67;5341:14;5392:4;5369:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5365:150;;5503:1;5496:8;;;;;;5365:150;5457:7;5448:16;;5408:67;5539:4;;;;;;;;;;;5529:14;;:6;:14;;;5525:432;;5570:6;5563:24;;;5596:4;5563:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5559:169;;5712:1;5705:8;;;;;;5559:169;5664:1;5654:7;:11;;;;:::i;:::-;5647:18;;;;;;;5525:432;5758:4;;;;;;;;;;;5748:14;;:6;:14;;;5744:213;;5789:6;5782:24;;;5815:4;5782:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5778:169;;5931:1;5924:8;;;;;;5778:169;5883:1;5873:7;:11;;;;:::i;:::-;5866:18;;;;;;;5744:213;6023:6;6016:24;;;6049:4;6016:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6012:227;;6227:1;6220:8;;;;;;6012:227;6096:17;6116:38;6138:6;6146:7;6116:21;:38::i;:::-;6096:58;;6187:1;6175:9;:13;;;;:::i;:::-;6168:20;;;;;;5078:1167;;;;:::o;6323:301::-;6403:7;6449:13;6465:17;6476:5;6465:10;:17::i;:::-;6449:33;;6504:1;6496:5;:9;;;6492:126;;;6528:36;6550:5;6557:6;6528:21;:36::i;:::-;6521:43;;;;;6492:126;6602:5;6595:12;;;;;6323:301;;;;;:::o;6691:351::-;6744:7;6797:13;6855:26;6875:5;6855:19;:26::i;:::-;6847:34;;6903:1;6895:5;:9;;;6891:52;;;6927:5;6920:12;;;;;6891:52;6987:26;7007:5;6987:19;:26::i;:::-;6979:34;;7030:5;7023:12;;;6691:351;;;;:::o;369:626:28:-;430:7;482:1;477;:6;:16;;;;492:1;487;:6;;;477:16;473:63;;;520:1;513:8;;;;473:63;550:10;622:2;582:34;578:1;:38;572:1;564:10;;:53;563:61;;550:74;;638:10;670:3;665:1;:8;;659:1;651:10;;:23;638:36;;698:50;693:2;:55;689:102;;;775:1;768:8;;;;;;689:102;811:2;804:9;;;;;906:2;837:66;:71;832:2;:76;828:123;;;935:1;928:8;;;;;;828:123;976:2;971;:7;964:14;;;;369:626;;;;;:::o;7048:1376:37:-;7110:13;7159:19;7214:18;;;;;;;;;;;7196:45;;;7242:5;7249:4;;;;;;;;;;;7196:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7159:96;;1022:1;7269:29;;7277:4;7269:29;;;7265:68;;7321:1;7314:8;;;;;7265:68;7443:16;7469;7499:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7495:197;;7680:1;7673:8;;;;;;;7495:197;7598:9;7587:20;;7632:9;7621:20;;7518:134;;;7717:1;7705:8;:13;;;:30;;;;7734:1;7722:8;:13;;;7705:30;7701:69;;;7758:1;7751:8;;;;;;;7701:69;7819:19;7840:25;7869:29;7892:5;7869:22;:29::i;:::-;7818:80;;;;7913:20;7908:60;;7956:1;7949:8;;;;;;;;;7908:60;8021:19;8051:4;;;;;;;;;;;8043:12;;:5;:12;;;:34;;8069:8;8043:34;;;8058:8;8043:34;8021:56;;8087:20;8118:4;;;;;;;;;;;8110:12;;:5;:12;;;:34;;8136:8;8110:34;;;8125:8;8110:34;8087:57;;1070:2;8170:30;;:13;:30;;;;:182;;1070:2;8321:13;:29;;;;:::i;:::-;8314:2;:37;;;;:::i;:::-;8299:12;:52;;;;;;:::i;:::-;8170:182;;;8261:13;1070:2;8245:29;;;;:::i;:::-;8238:2;:37;;;;:::i;:::-;8223:12;:52;;;;;;:::i;:::-;8170:182;8155:197;;8370:47;8391:11;8370:47;;8404:12;8370:47;;:20;:47::i;:::-;8362:55;;7125:1299;;;;;;;7048:1376;;;;:::o;8430:1395::-;8492:7;8511:25;:46;;;;;;;;8540:3;8511:46;;;;;;8545:4;8511:46;;;;;;8551:5;8511:46;;;;;;;8567:19;8601:9;8613:1;8601:13;;8596:339;8620:15;8616:1;:19;8596:339;;;8684:19;8755:18;;;;;;;;;;;8737:45;;;8783:5;8790:4;;;;;;;;;;;8796:8;8805:1;8796:11;;;;;;;:::i;:::-;;;;;;8737:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8684:125;;1022:1;8827:29;;8835:4;8827:29;;;8823:102;;8883:4;8876:11;;8905:5;;;8823:102;8642:293;8637:3;;;;;8596:339;;;;1022:1;8949:29;;8957:4;8949:29;;;8945:68;;9001:1;8994:8;;;;;;8945:68;9058:20;9092:4;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;9088:186;;9262:1;9255:8;;;;;;;9088:186;9210:13;9195:28;;9105:129;;;;;;;9284:21;9316:4;;;;;;;;;;;9308:12;;:5;:12;;;9284:36;;9331:19;9352:26;9382:29;9405:5;9382:22;:29::i;:::-;9330:81;;;;9426:21;9421:61;;9470:1;9463:8;;;;;;;;;;9421:61;9806:2;9542:260;9586:12;9616:16;9650;:60;;1070:2;9650:60;;;9674:13;9650:60;9728:16;:60;;9774:13;9728:60;;;1070:2;9728:60;9542:26;:260::i;:::-;:266;;9514:304;;;;;;;;8430:1395;;;;:::o;9939:762::-;10004:5;10011:4;10028:25;10055:30;10101:5;:10;;10117:5;10124:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10101:61;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10027:135;;;;10177:20;10173:522;;;10213:21;10281:2;10253:17;:24;:30;10249:388;;10332:17;10321:40;;;;;;;;;;;;:::i;:::-;10303:58;;10401:1;10384:13;:18;:41;;;;10422:3;10406:13;:19;10384:41;10380:187;;;10457:1;10460:5;10449:17;;;;;;;;;10380:187;10527:13;10543:4;10513:35;;;;;;;;;10249:388;10613:1;10616:5;10605:17;;;;;;;;;10173:522;10675:1;10678:5;10667:17;;;;;;9939:762;;;;:::o;1190:2514:28:-;1250:7;1302:1;1297;:6;1293:20;;1312:1;1305:8;;;;1293:20;1328:14;1366:50;1361:1;:55;1357:1967;;1457:1;1451:2;1446:1;:7;;1445:13;;;;;:::i;:::-;;;1436:22;;1357:1967;;;1497:11;1511:3;1497:17;;1532:10;1550:3;1545:1;:8;;1532:21;;1581:11;1575:2;:17;1571:104;;1623:2;1616:9;;;;;1654:2;1647:9;;;;1571:104;1702:7;1696:2;:13;1692:100;;1740:2;1733:9;;;;;1771:2;1764:9;;;;1692:100;1819:5;1813:2;:11;1809:96;;1855:1;1848:8;;;;;1885:1;1878:8;;;;1809:96;1932:4;1926:2;:10;1922:95;;1967:1;1960:8;;;;;1997:1;1990:8;;;;1922:95;2044:3;2038:2;:9;2034:94;;2078:1;2071:8;;;;;2108:1;2101:8;;;;2034:94;2155:3;2149:2;:9;2145:23;;2167:1;2160:8;;;;2145:23;2276:1;2268:3;2262;:9;2255:1;2251;:5;2250:22;;2249:28;2240:3;2234;:9;2228:1;:16;;2227:51;;;;;:::i;:::-;;;2218:60;;2704:34;2695:6;:43;2691:98;;;2769:1;2762:8;;;;;;;2691:98;2807:10;2835:3;2830:1;:8;;2820:6;:19;2807:32;;2857:10;2884:34;2880:1;:38;2870:6;:49;2857:62;;2938:10;2956:3;2951:1;:8;;2938:21;;2977:10;2995:2;2990:1;:7;;2977:20;;3025:2;3020;:7;3016:20;;;3035:1;3029:7;;;;3016:20;3060:2;3054:8;;;;3128:3;3122:2;:9;;3117:14;;3158:2;3153;:7;3149:20;;;3168:1;3162:7;;;;3149:20;3193:2;3187:8;;;;3270:3;3264:2;:9;;3258:2;:15;3251:23;;;;:::i;:::-;;3308:1;3303:2;:6;;;;;:::i;:::-;;;3293:16;;;;1479:1845;;;;;;1357:1967;3574:34;3565:6;:43;3561:90;;;3635:1;3628:8;;;;;3561:90;3680:6;3665:22;;;1190:2514;;;;;:::o;3710:1606::-;3865:17;4094;4131:14;4114;:31;4094:51;;4256:23;4297:1;4282:12;:16;;;:174;;4443:12;4431:25;;:2;:25;4427:1;4410:12;4402:21;;:26;:54;4282:174;;;4369:12;4368:13;;4346:37;;4354:2;4346:37;4342:1;4325:12;4317:21;;:26;:66;;;;;:::i;:::-;;;4282:174;4256:200;;4480:15;117:27;4474:21;4470:68;;;4522:1;4515:8;;;;;;4470:68;4686:28;4717:16;:143;;117:27;4838:15;:21;;;;;:::i;:::-;;;4799:34;117:27;4793:40;4792:68;;;;;:::i;:::-;;;4717:143;;;117:27;4752:15;:21;;;;;:::i;:::-;;;4717:143;4686:174;;5017:16;:148;;5145:20;5017:148;;;117:27;5085:34;5061:20;5053:66;5052:74;;;;;:::i;:::-;;;5017:148;5005:160;;5196:17;5184:9;:29;5180:120;;;5284:1;5277:8;;;;;;;5180:120;3898:1412;;;3710:1606;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;7:75:46:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:102;498:6;549:2;545:7;540:2;533:5;529:14;525:28;515:38;;457:102;;;:::o;565:180::-;613:77;610:1;603:88;710:4;707:1;700:15;734:4;731:1;724:15;751:281;834:27;856:4;834:27;:::i;:::-;826:6;822:40;964:6;952:10;949:22;928:18;916:10;913:34;910:62;907:88;;;975:18;;:::i;:::-;907:88;1015:10;1011:2;1004:22;794:238;751:281;;:::o;1038:129::-;1072:6;1099:20;;:::i;:::-;1089:30;;1128:33;1156:4;1148:6;1128:33;:::i;:::-;1038:129;;;:::o;1173:338::-;1277:4;1367:18;1359:6;1356:30;1353:56;;;1389:18;;:::i;:::-;1353:56;1439:4;1431:6;1427:17;1419:25;;1499:4;1493;1489:15;1481:23;;1173:338;;;:::o;1517:117::-;1626:1;1623;1616:12;1640:117;1749:1;1746;1739:12;1886:113;1973:1;1966:5;1963:12;1953:40;;1989:1;1986;1979:12;1953:40;1886:113;:::o;2005:167::-;2065:5;2103:6;2090:20;2081:29;;2119:47;2160:5;2119:47;:::i;:::-;2005:167;;;;:::o;2178:126::-;2215:7;2255:42;2248:5;2244:54;2233:65;;2178:126;;;:::o;2310:96::-;2347:7;2376:24;2394:5;2376:24;:::i;:::-;2365:35;;2310:96;;;:::o;2412:122::-;2485:24;2503:5;2485:24;:::i;:::-;2478:5;2475:35;2465:63;;2524:1;2521;2514:12;2465:63;2412:122;:::o;2540:139::-;2586:5;2624:6;2611:20;2602:29;;2640:33;2667:5;2640:33;:::i;:::-;2540:139;;;;:::o;2725:601::-;2801:5;2845:4;2833:9;2828:3;2824:19;2820:30;2817:117;;;2853:79;;:::i;:::-;2817:117;2952:21;2968:4;2952:21;:::i;:::-;2943:30;;3036:1;3076:63;3135:3;3126:6;3115:9;3111:22;3076:63;:::i;:::-;3069:4;3062:5;3058:16;3051:89;2983:168;3217:2;3258:49;3303:3;3294:6;3283:9;3279:22;3258:49;:::i;:::-;3251:4;3244:5;3240:16;3233:75;3161:158;2725:601;;;;:::o;3374:791::-;3497:5;3522:108;3538:91;3622:6;3538:91;:::i;:::-;3522:108;:::i;:::-;3513:117;;3650:5;3679:6;3672:5;3665:21;3713:4;3706:5;3702:16;3695:23;;3766:4;3758:6;3754:17;3746:6;3742:30;3795:3;3787:6;3784:15;3781:122;;;3814:79;;:::i;:::-;3781:122;3929:6;3912:247;3946:6;3941:3;3938:15;3912:247;;;4021:3;4050:64;4110:3;4098:10;4050:64;:::i;:::-;4045:3;4038:77;4144:4;4139:3;4135:14;4128:21;;3988:171;3972:4;3967:3;3963:14;3956:21;;3912:247;;;3916:21;3503:662;;3374:791;;;;;:::o;4213:424::-;4311:5;4360:3;4353:4;4345:6;4341:17;4337:27;4327:122;;4368:79;;:::i;:::-;4327:122;4485:6;4472:20;4510:121;4627:3;4619:6;4612:4;4604:6;4600:17;4510:121;:::i;:::-;4501:130;;4317:320;4213:424;;;;:::o;4643:593::-;4754:6;4803:2;4791:9;4782:7;4778:23;4774:32;4771:119;;;4809:79;;:::i;:::-;4771:119;4957:1;4946:9;4942:17;4929:31;4987:18;4979:6;4976:30;4973:117;;;5009:79;;:::i;:::-;4973:117;5114:105;5211:7;5202:6;5191:9;5187:22;5114:105;:::i;:::-;5104:115;;4900:329;4643:593;;;;:::o;5242:147::-;5342:6;5376:5;5370:12;5360:22;;5242:147;;;:::o;5395:217::-;5527:11;5561:6;5556:3;5549:19;5601:4;5596:3;5592:14;5577:29;;5395:217;;;;:::o;5618:165::-;5718:4;5741:3;5733:11;;5771:4;5766:3;5762:14;5754:22;;5618:165;;;:::o;5789:180::-;5837:77;5834:1;5827:88;5934:4;5931:1;5924:15;5958:4;5955:1;5948:15;5975:119;6062:1;6055:5;6052:12;6042:46;;6068:18;;:::i;:::-;6042:46;5975:119;:::o;6100:139::-;6151:7;6180:5;6169:16;;6186:47;6227:5;6186:47;:::i;:::-;6100:139;;;:::o;6245:::-;6307:9;6340:38;6372:5;6340:38;:::i;:::-;6327:51;;6245:139;;;:::o;6390:145::-;6479:49;6522:5;6479:49;:::i;:::-;6474:3;6467:62;6390:145;;:::o;6541:108::-;6618:24;6636:5;6618:24;:::i;:::-;6613:3;6606:37;6541:108;;:::o;6655:77::-;6692:7;6721:5;6710:16;;6655:77;;;:::o;6738:108::-;6815:24;6833:5;6815:24;:::i;:::-;6810:3;6803:37;6738:108;;:::o;6940:715::-;7093:4;7088:3;7084:14;7184:4;7177:5;7173:16;7167:23;7203:75;7272:4;7267:3;7263:14;7249:12;7203:75;:::i;:::-;7108:180;7377:4;7370:5;7366:16;7360:23;7396:63;7453:4;7448:3;7444:14;7430:12;7396:63;:::i;:::-;7298:171;7556:4;7549:5;7545:16;7539:23;7575:63;7632:4;7627:3;7623:14;7609:12;7575:63;:::i;:::-;7479:169;7062:593;6940:715;;:::o;7661:311::-;7796:10;7817:112;7925:3;7917:6;7817:112;:::i;:::-;7961:4;7956:3;7952:14;7938:28;;7661:311;;;;:::o;7978:146::-;8081:4;8113;8108:3;8104:14;8096:22;;7978:146;;;:::o;8222:996::-;8407:3;8436:87;8517:5;8436:87;:::i;:::-;8539:119;8651:6;8646:3;8539:119;:::i;:::-;8532:126;;8682:89;8765:5;8682:89;:::i;:::-;8794:7;8825:1;8810:383;8835:6;8832:1;8829:13;8810:383;;;8911:6;8905:13;8938:129;9063:3;9048:13;8938:129;:::i;:::-;8931:136;;9090:93;9176:6;9090:93;:::i;:::-;9080:103;;8870:323;8857:1;8854;8850:9;8845:14;;8810:383;;;8814:14;9209:3;9202:10;;8412:806;;;8222:996;;;;:::o;9224:505::-;9433:4;9471:2;9460:9;9456:18;9448:26;;9520:9;9514:4;9510:20;9506:1;9495:9;9491:17;9484:47;9548:174;9717:4;9708:6;9548:174;:::i;:::-;9540:182;;9224:505;;;;:::o;9735:180::-;9783:77;9780:1;9773:88;9880:4;9877:1;9870:15;9904:4;9901:1;9894:15;9921:311;9998:4;10088:18;10080:6;10077:30;10074:56;;;10110:18;;:::i;:::-;10074:56;10160:4;10152:6;10148:17;10140:25;;10220:4;10214;10210:15;10202:23;;9921:311;;;:::o;10238:143::-;10295:5;10326:6;10320:13;10311:22;;10342:33;10369:5;10342:33;:::i;:::-;10238:143;;;;:::o;10404:732::-;10511:5;10536:81;10552:64;10609:6;10552:64;:::i;:::-;10536:81;:::i;:::-;10527:90;;10637:5;10666:6;10659:5;10652:21;10700:4;10693:5;10689:16;10682:23;;10753:4;10745:6;10741:17;10733:6;10729:30;10782:3;10774:6;10771:15;10768:122;;;10801:79;;:::i;:::-;10768:122;10916:6;10899:231;10933:6;10928:3;10925:15;10899:231;;;11008:3;11037:48;11081:3;11069:10;11037:48;:::i;:::-;11032:3;11025:61;11115:4;11110:3;11106:14;11099:21;;10975:155;10959:4;10954:3;10950:14;10943:21;;10899:231;;;10903:21;10517:619;;10404:732;;;;;:::o;11159:385::-;11241:5;11290:3;11283:4;11275:6;11271:17;11267:27;11257:122;;11298:79;;:::i;:::-;11257:122;11408:6;11402:13;11433:105;11534:3;11526:6;11519:4;11511:6;11507:17;11433:105;:::i;:::-;11424:114;;11247:297;11159:385;;;;:::o;11550:554::-;11645:6;11694:2;11682:9;11673:7;11669:23;11665:32;11662:119;;;11700:79;;:::i;:::-;11662:119;11841:1;11830:9;11826:17;11820:24;11871:18;11863:6;11860:30;11857:117;;;11893:79;;:::i;:::-;11857:117;11998:89;12079:7;12070:6;12059:9;12055:22;11998:89;:::i;:::-;11988:99;;11791:306;11550:554;;;;:::o;12110:118::-;12197:24;12215:5;12197:24;:::i;:::-;12192:3;12185:37;12110:118;;:::o;12234:222::-;12327:4;12365:2;12354:9;12350:18;12342:26;;12378:71;12446:1;12435:9;12431:17;12422:6;12378:71;:::i;:::-;12234:222;;;;:::o;12462:122::-;12535:24;12553:5;12535:24;:::i;:::-;12528:5;12525:35;12515:63;;12574:1;12571;12564:12;12515:63;12462:122;:::o;12590:143::-;12647:5;12678:6;12672:13;12663:22;;12694:33;12721:5;12694:33;:::i;:::-;12590:143;;;;:::o;12739:351::-;12809:6;12858:2;12846:9;12837:7;12833:23;12829:32;12826:119;;;12864:79;;:::i;:::-;12826:119;12984:1;13009:64;13065:7;13056:6;13045:9;13041:22;13009:64;:::i;:::-;12999:74;;12955:128;12739:351;;;;:::o;13096:180::-;13144:77;13141:1;13134:88;13241:4;13238:1;13231:15;13265:4;13262:1;13255:15;13282:410;13322:7;13345:20;13363:1;13345:20;:::i;:::-;13340:25;;13379:20;13397:1;13379:20;:::i;:::-;13374:25;;13434:1;13431;13427:9;13456:30;13474:11;13456:30;:::i;:::-;13445:41;;13635:1;13626:7;13622:15;13619:1;13616:22;13596:1;13589:9;13569:83;13546:139;;13665:18;;:::i;:::-;13546:139;13330:362;13282:410;;;;:::o;13698:351::-;13768:6;13817:2;13805:9;13796:7;13792:23;13788:32;13785:119;;;13823:79;;:::i;:::-;13785:119;13943:1;13968:64;14024:7;14015:6;14004:9;14000:22;13968:64;:::i;:::-;13958:74;;13914:128;13698:351;;;;:::o;14055:114::-;14092:7;14132:30;14125:5;14121:42;14110:53;;14055:114;;;:::o;14175:122::-;14248:24;14266:5;14248:24;:::i;:::-;14241:5;14238:35;14228:63;;14287:1;14284;14277:12;14228:63;14175:122;:::o;14303:143::-;14360:5;14391:6;14385:13;14376:22;;14407:33;14434:5;14407:33;:::i;:::-;14303:143;;;;:::o;14452:93::-;14488:7;14528:10;14521:5;14517:22;14506:33;;14452:93;;;:::o;14551:120::-;14623:23;14640:5;14623:23;:::i;:::-;14616:5;14613:34;14603:62;;14661:1;14658;14651:12;14603:62;14551:120;:::o;14677:141::-;14733:5;14764:6;14758:13;14749:22;;14780:32;14806:5;14780:32;:::i;:::-;14677:141;;;;:::o;14824:661::-;14911:6;14919;14927;14976:2;14964:9;14955:7;14951:23;14947:32;14944:119;;;14982:79;;:::i;:::-;14944:119;15102:1;15127:64;15183:7;15174:6;15163:9;15159:22;15127:64;:::i;:::-;15117:74;;15073:128;15240:2;15266:64;15322:7;15313:6;15302:9;15298:22;15266:64;:::i;:::-;15256:74;;15211:129;15379:2;15405:63;15460:7;15451:6;15440:9;15436:22;15405:63;:::i;:::-;15395:73;;15350:128;14824:661;;;;;:::o;15491:279::-;15531:7;15554:20;15572:1;15554:20;:::i;:::-;15549:25;;15588:20;15606:1;15588:20;:::i;:::-;15583:25;;15643:1;15640;15636:9;15665:30;15683:11;15665:30;:::i;:::-;15654:41;;15727:11;15718:7;15715:24;15705:58;;15743:18;;:::i;:::-;15705:58;15539:231;15491:279;;;;:::o;15776:332::-;15897:4;15935:2;15924:9;15920:18;15912:26;;15948:71;16016:1;16005:9;16001:17;15992:6;15948:71;:::i;:::-;16029:72;16097:2;16086:9;16082:18;16073:6;16029:72;:::i;:::-;15776:332;;;;;:::o;16114:86::-;16149:7;16189:4;16182:5;16178:16;16167:27;;16114:86;;;:::o;16206:191::-;16244:4;16264:18;16280:1;16264:18;:::i;:::-;16259:23;;16296:18;16312:1;16296:18;:::i;:::-;16291:23;;16338:1;16335;16331:9;16323:17;;16362:4;16356;16353:14;16350:40;;;16370:18;;:::i;:::-;16350:40;16206:191;;;;:::o;16403:102::-;16445:8;16492:5;16489:1;16485:13;16464:34;;16403:102;;;:::o;16511:848::-;16572:5;16579:4;16603:6;16594:15;;16627:5;16618:14;;16641:712;16662:1;16652:8;16649:15;16641:712;;;16757:4;16752:3;16748:14;16742:4;16739:24;16736:50;;;16766:18;;:::i;:::-;16736:50;16816:1;16806:8;16802:16;16799:451;;;17231:4;17224:5;17220:16;17211:25;;16799:451;17281:4;17275;17271:15;17263:23;;17311:32;17334:8;17311:32;:::i;:::-;17299:44;;16641:712;;;16511:848;;;;;;;:::o;17365:1073::-;17419:5;17610:8;17600:40;;17631:1;17622:10;;17633:5;;17600:40;17659:4;17649:36;;17676:1;17667:10;;17678:5;;17649:36;17745:4;17793:1;17788:27;;;;17829:1;17824:191;;;;17738:277;;17788:27;17806:1;17797:10;;17808:5;;;17824:191;17869:3;17859:8;17856:17;17853:43;;;17876:18;;:::i;:::-;17853:43;17925:8;17922:1;17918:16;17909:25;;17960:3;17953:5;17950:14;17947:40;;;17967:18;;:::i;:::-;17947:40;18000:5;;;17738:277;;18124:2;18114:8;18111:16;18105:3;18099:4;18096:13;18092:36;18074:2;18064:8;18061:16;18056:2;18050:4;18047:12;18043:35;18027:111;18024:246;;;18180:8;18174:4;18170:19;18161:28;;18215:3;18208:5;18205:14;18202:40;;;18222:18;;:::i;:::-;18202:40;18255:5;;18024:246;18295:42;18333:3;18323:8;18317:4;18314:1;18295:42;:::i;:::-;18280:57;;;;18369:4;18364:3;18360:14;18353:5;18350:25;18347:51;;;18378:18;;:::i;:::-;18347:51;18427:4;18420:5;18416:16;18407:25;;17365:1073;;;;;;:::o;18444:281::-;18502:5;18526:23;18544:4;18526:23;:::i;:::-;18518:31;;18570:25;18586:8;18570:25;:::i;:::-;18558:37;;18614:104;18651:66;18641:8;18635:4;18614:104;:::i;:::-;18605:113;;18444:281;;;;:::o;18731:180::-;18779:77;18776:1;18769:88;18876:4;18873:1;18866:15;18900:4;18897:1;18890:15;18917:185;18957:1;18974:20;18992:1;18974:20;:::i;:::-;18969:25;;19008:20;19026:1;19008:20;:::i;:::-;19003:25;;19047:1;19037:35;;19052:18;;:::i;:::-;19037:35;19094:1;19091;19087:9;19082:14;;18917:185;;;;:::o;19108:89::-;19144:7;19184:6;19177:5;19173:18;19162:29;;19108:89;;;:::o;19203:91::-;19239:7;19279:8;19272:5;19268:20;19257:31;;19203:91;;;:::o;19300:60::-;19328:3;19349:5;19342:12;;19300:60;;;:::o;19366:138::-;19414:9;19447:51;19464:33;19473:23;19490:5;19473:23;:::i;:::-;19464:33;:::i;:::-;19447:51;:::i;:::-;19434:64;;19366:138;;;:::o;19510:127::-;19595:35;19624:5;19595:35;:::i;:::-;19590:3;19583:48;19510:127;;:::o;19643:438::-;19790:4;19828:2;19817:9;19813:18;19805:26;;19841:71;19909:1;19898:9;19894:17;19885:6;19841:71;:::i;:::-;19922:72;19990:2;19979:9;19975:18;19966:6;19922:72;:::i;:::-;20004:70;20070:2;20059:9;20055:18;20046:6;20004:70;:::i;:::-;19643:438;;;;;;:::o;20087:122::-;20160:24;20178:5;20160:24;:::i;:::-;20153:5;20150:35;20140:63;;20199:1;20196;20189:12;20140:63;20087:122;:::o;20215:143::-;20272:5;20303:6;20297:13;20288:22;;20319:33;20346:5;20319:33;:::i;:::-;20215:143;;;;:::o;20364:90::-;20399:7;20442:5;20439:1;20428:20;20417:31;;20364:90;;;:::o;20460:118::-;20531:22;20547:5;20531:22;:::i;:::-;20524:5;20521:33;20511:61;;20568:1;20565;20558:12;20511:61;20460:118;:::o;20584:139::-;20639:5;20670:6;20664:13;20655:22;;20686:31;20711:5;20686:31;:::i;:::-;20584:139;;;;:::o;20729:120::-;20801:23;20818:5;20801:23;:::i;:::-;20794:5;20791:34;20781:62;;20839:1;20836;20829:12;20781:62;20729:120;:::o;20855:141::-;20911:5;20942:6;20936:13;20927:22;;20958:32;20984:5;20958:32;:::i;:::-;20855:141;;;;:::o;21002:118::-;21073:22;21089:5;21073:22;:::i;:::-;21066:5;21063:33;21053:61;;21110:1;21107;21100:12;21053:61;21002:118;:::o;21126:139::-;21181:5;21212:6;21206:13;21197:22;;21228:31;21253:5;21228:31;:::i;:::-;21126:139;;;;:::o;21271:90::-;21305:7;21348:5;21341:13;21334:21;21323:32;;21271:90;;;:::o;21367:116::-;21437:21;21452:5;21437:21;:::i;:::-;21430:5;21427:32;21417:60;;21473:1;21470;21463:12;21417:60;21367:116;:::o;21489:137::-;21543:5;21574:6;21568:13;21559:22;;21590:30;21614:5;21590:30;:::i;:::-;21489:137;;;;:::o;21632:1271::-;21746:6;21754;21762;21770;21778;21786;21794;21843:3;21831:9;21822:7;21818:23;21814:33;21811:120;;;21850:79;;:::i;:::-;21811:120;21970:1;21995:64;22051:7;22042:6;22031:9;22027:22;21995:64;:::i;:::-;21985:74;;21941:128;22108:2;22134:62;22188:7;22179:6;22168:9;22164:22;22134:62;:::i;:::-;22124:72;;22079:127;22245:2;22271:63;22326:7;22317:6;22306:9;22302:22;22271:63;:::i;:::-;22261:73;;22216:128;22383:2;22409:63;22464:7;22455:6;22444:9;22440:22;22409:63;:::i;:::-;22399:73;;22354:128;22521:3;22548:63;22603:7;22594:6;22583:9;22579:22;22548:63;:::i;:::-;22538:73;;22492:129;22660:3;22687:62;22741:7;22732:6;22721:9;22717:22;22687:62;:::i;:::-;22677:72;;22631:128;22798:3;22825:61;22878:7;22869:6;22858:9;22854:22;22825:61;:::i;:::-;22815:71;;22769:127;21632:1271;;;;;;;;;;:::o;22909:98::-;22960:6;22994:5;22988:12;22978:22;;22909:98;;;:::o;23013:147::-;23114:11;23151:3;23136:18;;23013:147;;;;:::o;23166:139::-;23255:6;23250:3;23245;23239:23;23296:1;23287:6;23282:3;23278:16;23271:27;23166:139;;;:::o;23311:386::-;23415:3;23443:38;23475:5;23443:38;:::i;:::-;23497:88;23578:6;23573:3;23497:88;:::i;:::-;23490:95;;23594:65;23652:6;23647:3;23640:4;23633:5;23629:16;23594:65;:::i;:::-;23684:6;23679:3;23675:16;23668:23;;23419:278;23311:386;;;;:::o;23703:271::-;23833:3;23855:93;23944:3;23935:6;23855:93;:::i;:::-;23848:100;;23965:3;23958:10;;23703:271;;;;:::o;23980:180::-;24028:77;24025:1;24018:88;24125:4;24122:1;24115:15;24149:4;24146:1;24139:15","linkReferences":{}},"methodIdentifiers":{"getWethValueInPools((uint8,address)[])":"339173fd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_uniswapV2Factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_uniswapV3Factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_weth\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"enum WethValueInPools.PoolType\",\"name\":\"poolType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"poolAddress\",\"type\":\"address\"}],\"internalType\":\"struct WethValueInPools.PoolInfo[]\",\"name\":\"pools\",\"type\":\"tuple[]\"}],\"name\":\"getWethValueInPools\",\"outputs\":[{\"components\":[{\"internalType\":\"enum WethValueInPools.PoolType\",\"name\":\"poolType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"poolAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wethValue\",\"type\":\"uint256\"}],\"internalType\":\"struct WethValueInPools.PoolInfoReturn[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getWethValueInPools((uint8,address)[])\":{\"details\":\"We require a 1 ETH minimum liquidity in the quoting pool for it to be considered.\"}},\"stateVariables\":{\"UNISWAP_V2_FACTORY\":{\"details\":\"Used as the first priority for quoting WETH value\"},\"UNISWAP_V3_FACTORY\":{\"details\":\"Used as the second priority for quoting WETH value\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getWethValueInPools((uint8,address)[])\":{\"notice\":\"Returns an array of `PoolInfoReturn` for the consumer to determine wether to filter or not to save gas.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/filters/WethValueInPools.sol\":\"WethValueInPools\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/UniswapV3/FixedPoint.sol\":{\"keccak256\":\"0xf82873fe78051afcf0446c27f5c5857816d1129e2bc84855dee8275d764b49d0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5d1b9704466cdf93f446ac2330ef89752c2bcc1f271a70c296f54e0d9291467f\",\"dweb:/ipfs/QmaQd3DUAdJMVQD422o2HyAwhTDyLo33znMgRDU5NaZegE\"]},\"src/filters/WethValueInPools.sol\":{\"keccak256\":\"0x1bd98caec9df680366948f8e1f24ed7262021aeb841ea155efafb05648152c4b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f88558f892e5441c824e1d6973036e1196445b99c7e24fcfa6a399af64e2ace\",\"dweb:/ipfs/QmT7KqFaR9pysM94AAbSgeJrb1XsQickV6kyowBWc5vYgT\"]},\"src/interfaces/IBalancer.sol\":{\"keccak256\":\"0xe7ca1e7f70a16d6919334b612a584e5d42692a802f4d92686c564a4ab1550c27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e0cf4540fca9dbf3650d22d1d927b43bcd8333a988c7575c6618b633bff082f\",\"dweb:/ipfs/QmYAcUnqBauhiXJNfMLta4Bj1dntGmNJ3cxaHq18LnBDAQ\"]},\"src/interfaces/IUniswapV2.sol\":{\"keccak256\":\"0x067d9c125da6fdbe44d6ce7d498c42460d7347317413f8317bf80bd25c08898d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1ad58162042aa8d1eb7451af3ccc3b1df64e720aeeb69a6843507aec0e5d146\",\"dweb:/ipfs/QmdvEJYkfWaGWrGXtKajZSDdfNYJ3sDFpzsV4f1X4KQYZM\"]},\"src/interfaces/IUniswapV3.sol\":{\"keccak256\":\"0x914ac5f4d9e6b6d0345c89e769f1a2d9784d047e8cac6f3265b229afd9363729\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://19a3f9d71839d62cea60562c57cdfe582821da7bfe17a1d6ca26597db51a3762\",\"dweb:/ipfs/QmdWoVo3J7tcSKCk5cCADvjvMtmczcGbsmKx5v9AFjQANz\"]},\"src/interfaces/Token.sol\":{\"keccak256\":\"0x2f7118f6cba8e0303e66028f738463e025a19ec0186a5462523692f44330e113\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca6355f3ce4aec77f281142db4cb0a63d5e1b3b4b12836ac9a3ed251069801d0\",\"dweb:/ipfs/QmWTt8HyEuzTdKVWCzBDxVMWL3tptkxsTfsssbEMVA818A\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_uniswapV2Factory","type":"address"},{"internalType":"address","name":"_uniswapV3Factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"struct WethValueInPools.PoolInfo[]","name":"pools","type":"tuple[]","components":[{"internalType":"enum WethValueInPools.PoolType","name":"poolType","type":"uint8"},{"internalType":"address","name":"poolAddress","type":"address"}]}],"stateMutability":"nonpayable","type":"function","name":"getWethValueInPools","outputs":[{"internalType":"struct WethValueInPools.PoolInfoReturn[]","name":"","type":"tuple[]","components":[{"internalType":"enum WethValueInPools.PoolType","name":"poolType","type":"uint8"},{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint256","name":"wethValue","type":"uint256"}]}]}],"devdoc":{"kind":"dev","methods":{"getWethValueInPools((uint8,address)[])":{"details":"We require a 1 ETH minimum liquidity in the quoting pool for it to be considered."}},"version":1},"userdoc":{"kind":"user","methods":{"getWethValueInPools((uint8,address)[])":{"notice":"Returns an array of `PoolInfoReturn` for the consumer to determine wether to filter or not to save gas."}},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/filters/WethValueInPools.sol":"WethValueInPools"},"evmVersion":"cancun","libraries":{}},"sources":{"src/UniswapV3/FixedPoint.sol":{"keccak256":"0xf82873fe78051afcf0446c27f5c5857816d1129e2bc84855dee8275d764b49d0","urls":["bzz-raw://5d1b9704466cdf93f446ac2330ef89752c2bcc1f271a70c296f54e0d9291467f","dweb:/ipfs/QmaQd3DUAdJMVQD422o2HyAwhTDyLo33znMgRDU5NaZegE"],"license":"MIT"},"src/filters/WethValueInPools.sol":{"keccak256":"0x1bd98caec9df680366948f8e1f24ed7262021aeb841ea155efafb05648152c4b","urls":["bzz-raw://3f88558f892e5441c824e1d6973036e1196445b99c7e24fcfa6a399af64e2ace","dweb:/ipfs/QmT7KqFaR9pysM94AAbSgeJrb1XsQickV6kyowBWc5vYgT"],"license":"MIT"},"src/interfaces/IBalancer.sol":{"keccak256":"0xe7ca1e7f70a16d6919334b612a584e5d42692a802f4d92686c564a4ab1550c27","urls":["bzz-raw://2e0cf4540fca9dbf3650d22d1d927b43bcd8333a988c7575c6618b633bff082f","dweb:/ipfs/QmYAcUnqBauhiXJNfMLta4Bj1dntGmNJ3cxaHq18LnBDAQ"],"license":"MIT"},"src/interfaces/IUniswapV2.sol":{"keccak256":"0x067d9c125da6fdbe44d6ce7d498c42460d7347317413f8317bf80bd25c08898d","urls":["bzz-raw://b1ad58162042aa8d1eb7451af3ccc3b1df64e720aeeb69a6843507aec0e5d146","dweb:/ipfs/QmdvEJYkfWaGWrGXtKajZSDdfNYJ3sDFpzsV4f1X4KQYZM"],"license":"MIT"},"src/interfaces/IUniswapV3.sol":{"keccak256":"0x914ac5f4d9e6b6d0345c89e769f1a2d9784d047e8cac6f3265b229afd9363729","urls":["bzz-raw://19a3f9d71839d62cea60562c57cdfe582821da7bfe17a1d6ca26597db51a3762","dweb:/ipfs/QmdWoVo3J7tcSKCk5cCADvjvMtmczcGbsmKx5v9AFjQANz"],"license":"MIT"},"src/interfaces/Token.sol":{"keccak256":"0x2f7118f6cba8e0303e66028f738463e025a19ec0186a5462523692f44330e113","urls":["bzz-raw://ca6355f3ce4aec77f281142db4cb0a63d5e1b3b4b12836ac9a3ed251069801d0","dweb:/ipfs/QmWTt8HyEuzTdKVWCzBDxVMWL3tptkxsTfsssbEMVA818A"],"license":"MIT"}},"version":1},"id":37} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"_uniswapV2Factory","type":"address","internalType":"address"},{"name":"_uniswapV3Factory","type":"address","internalType":"address"},{"name":"_weth","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"getWethValueInPools","inputs":[{"name":"pools","type":"tuple[]","internalType":"struct WethValueInPools.PoolInfo[]","components":[{"name":"poolType","type":"uint8","internalType":"enum WethValueInPools.PoolType"},{"name":"poolAddress","type":"address","internalType":"address"}]}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct WethValueInPools.PoolInfoReturn[]","components":[{"name":"poolType","type":"uint8","internalType":"enum WethValueInPools.PoolType"},{"name":"poolAddress","type":"address","internalType":"address"},{"name":"wethValue","type":"uint256","internalType":"uint256"}]}],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x608060405234801561000f575f5ffd5b5060405161269338038061269383398181016040528101906100319190610156565b825f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506101a6565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610125826100fc565b9050919050565b6101358161011b565b811461013f575f5ffd5b50565b5f815190506101508161012c565b92915050565b5f5f5f6060848603121561016d5761016c6100f8565b5b5f61017a86828701610142565b935050602061018b86828701610142565b925050604061019c86828701610142565b9150509250925092565b6124e0806101b35f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063339173fd1461002d575b5f5ffd5b61004760048036038101906100429190611a7a565b61005d565b6040516100549190611c43565b60405180910390f35b60605f825167ffffffffffffffff81111561007b5761007a611870565b5b6040519080825280602002602001820160405280156100b457816020015b6100a1611805565b8152602001906001900390816100995790505b5090505f5f90505b83518110156102f4575f8482815181106100d9576100d8611c63565b5b602002602001015190505f60028111156100f6576100f5611aea565b5b815f0151600281111561010c5761010b611aea565b5b0361018f575f61011f82602001516102fe565b90506040518060600160405280835f0151600281111561014257610141611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061017e5761017d611c63565b5b6020026020010181905250506102e6565b600160028111156101a3576101a2611aea565b5b815f015160028111156101b9576101b8611aea565b5b0361023c575f6101cc8260200151610587565b90506040518060600160405280835f015160028111156101ef576101ee611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061022b5761022a611c63565b5b6020026020010181905250506102e5565b60028081111561024f5761024e611aea565b5b815f0151600281111561026557610264611aea565b5b036102e4575f6102788260200151610825565b90506040518060600160405280835f0151600281111561029b5761029a611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001828152508484815181106102d7576102d6611c63565b5b6020026020010181905250505b5b5b5080806001019150506100bc565b5080915050919050565b5f60608273ffffffffffffffffffffffffffffffffffffffff1663cc77828d6040518163ffffffff1660e01b81526004015f604051808303815f875af192505050801561036d57506040513d5f823e3d601f19601f8201168201806040525081019061036a9190611d64565b60015b61037a575f915050610582565b809150505f5f90505b81518110156104ba5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168282815181106103d7576103d6611c63565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036104ad578373ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f83838151811061042957610428611c63565b5b60200260200101516040518263ffffffff1660e01b815260040161044d9190611dba565b6020604051808303815f875af192505050801561048857506040513d601f19601f820116820180604052508101906104859190611dfd565b60015b610496575f92505050610582565b8251816104a39190611e55565b9350505050610582565b8080600101915050610383565b505f815f815181106104cf576104ce611c63565b5b602002602001015190505f8473ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f836040518263ffffffff1660e01b81526004016105139190611dba565b6020604051808303815f875af192505050801561054e57506040513d601f19601f8201168201806040525081019061054b9190611dfd565b60015b61055d575f9350505050610582565b809150505f61056c8383610b9a565b905083518161057b9190611e55565b9450505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156105f157506040513d601f19601f820116820180604052508101906105ee9190611e96565b60015b6105fe575f915050610820565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561066b57506040513d601f19601f820116820180604052508101906106689190611e96565b60015b610679575f92505050610820565b809150508373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa9250505080156106e557506040513d601f19601f820116820180604052508101906106e29190611f3d565b60015b6106f3575f92505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610770576002836107549190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107ed576002826107d19190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b5f61080886856dffffffffffffffffffffffffffff16610b9a565b90506002816108179190611e55565b96505050505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561088f57506040513d601f19601f8201168201806040525081019061088c9190611e96565b60015b61089c575f915050610b95565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561090957506040513d601f19601f820116820180604052508101906109069190611e96565b60015b610917575f92505050610b95565b8091505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a07578173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016109a89190611dba565b602060405180830381865afa9250505080156109e257506040513d601f19601f820116820180604052508101906109df9190611dfd565b60015b6109f0575f92505050610b95565b6002816109fd9190611e55565b9350505050610b95565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610af3578073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610a949190611dba565b602060405180830381865afa925050508015610ace57506040513d601f19601f82011682018060405250810190610acb9190611dfd565b60015b610adc575f92505050610b95565b600281610ae99190611e55565b9350505050610b95565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610b2c9190611dba565b602060405180830381865afa925050508015610b6657506040513d601f19601f82011682018060405250810190610b639190611dfd565b60015b610b74575f92505050610b95565b5f610b7f8483610b9a565b9050600281610b8e9190611e55565b9450505050505b919050565b5f5f610ba584610bf0565b90505f816fffffffffffffffffffffffffffffffff161115610bd357610bcb8184610c35565b915050610bea565b806fffffffffffffffffffffffffffffffff169150505b92915050565b5f5f610bfb83610d1f565b90505f816fffffffffffffffffffffffffffffffff161115610c205780915050610c30565b610c2983611070565b9050809150505b919050565b5f5f821480610c5557505f836fffffffffffffffffffffffffffffffff16145b15610c62575f9050610d19565b5f60406fffffffffffffffffffffffffffffffff8416856fffffffffffffffffffffffffffffffff1602901c90505f608084901c856fffffffffffffffffffffffffffffffff1602905077ffffffffffffffffffffffffffffffffffffffffffffffff811115610cd6575f92505050610d19565b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03811115610d11575f92505050610d19565b818101925050505b92915050565b5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439058460025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610d9d929190611fc9565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e1a575f91505061106b565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa925050508015610e8457506040513d601f19601f82011682018060405250810190610e819190611f3d565b60015b610e93575f935050505061106b565b8294508193505050505f826dffffffffffffffffffffffffffff161480610ec957505f816dffffffffffffffffffffffffffff16145b15610ed9575f935050505061106b565b5f5f610ee48761133d565b9150915080610efa575f9550505050505061106b565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1610610f555784610f57565b835b90505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1610610fb45784610fb6565b855b9050601260ff168460ff16111561100057601284610fd49190611ffc565b600a610fe0919061215f565b816dffffffffffffffffffffffffffff16610ffb91906121d6565b611035565b83601261100d9190611ffc565b600a611019919061215f565b816dffffffffffffffffffffffffffff166110349190611e55565b5b9050611061826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff166114a1565b9750505050505050505b919050565b5f5f60405180606001604052806101f461ffff168152602001610bb861ffff16815260200161271061ffff1681525090505f5f5f90505b60038110156111d0575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631698ee828760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687866003811061112457611123611c63565b5b60200201516040518463ffffffff1660e01b81526004016111479392919061225a565b602060405180830381865afa158015611162573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111869190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146111c457809250506111d0565b508060010190506110a7565b505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361120e575f92505050611338565b5f8173ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa92505050801561127757506040513d601f19601f820116820180604052508101906112749190612378565b60015b611286575f9350505050611338565b869750505050505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161090505f5f6112ee8861133d565b9150915080611305575f9650505050505050611338565b604061132d85858661131857601261131a565b855b876113255786611328565b60125b611683565b901c96505050505050505b919050565b5f5f5f5f8473ffffffffffffffffffffffffffffffffffffffff16614e206040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516113eb9190612467565b5f604051808303815f8787f1925050503d805f8114611425576040519150601f19603f3d011682016040523d82523d5f602084013e61142a565b606091505b50915091508115611493575f602082510361148557818060200190518101906114539190611dfd565b90505f811480611463575060ff81115b15611476575f5f9450945050505061149c565b8060019450945050505061149c565b5f5f9450945050505061149c565b5f5f9350935050505b915091565b5f5f82036114b1575f905061167d565b5f77ffffffffffffffffffffffffffffffffffffffffffffffff84116114ed5782604085901b816114e5576114e46121a9565b5b049050611657565b5f60c090505f60c086901c9050640100000000811061151457602081901c90506020820191505b62010000811061152c57601081901c90506010820191505b610100811061154357600881901c90506008820191505b6010811061155957600481901c90506004820191505b6004811061156f57600281901c90506002820191505b6002811061157e576001820191505b600160bf830360018703901c018260ff0387901b816115a05761159f6121a9565b5b0492506fffffffffffffffffffffffffffffffff8311156115c6575f935050505061167d565b5f608086901c840290505f6fffffffffffffffffffffffffffffffff8716850290505f60c089901c90505f60408a901b905082811015611607576001820391505b8281039050608084901b925082811015611622576001820391505b8281039050608084901c821461163b5761163a61247d565b5b88818161164b5761164a6121a9565b5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115611678575f91505061167d565b809150505b92915050565b5f5f82840390505f5f825f0b126116bb578160ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a026116ee565b815f0360ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a816116ec576116eb6121a9565b5b045b9050806c01000000000000000000000000111561170f575f925050506117fd565b5f86611767576c010000000000000000000000008281611732576117316121a9565b5b046fffffffffffffffffffffffffffffffff6c010000000000000000000000000281611761576117606121a9565b5b04611786565b6c010000000000000000000000008281611784576117836121a9565b5b045b90508661179357806117c4565b6c010000000000000000000000006fffffffffffffffffffffffffffffffff8202816117c2576117c16121a9565b5b045b93507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156117f9575f93505050506117fd565b5050505b949350505050565b60405180606001604052805f600281111561182357611822611aea565b5b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6118a682611860565b810181811067ffffffffffffffff821117156118c5576118c4611870565b5b80604052505050565b5f6118d761184b565b90506118e3828261189d565b919050565b5f67ffffffffffffffff82111561190257611901611870565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b60038110611927575f5ffd5b50565b5f813590506119388161191b565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119678261193e565b9050919050565b6119778161195d565b8114611981575f5ffd5b50565b5f813590506119928161196e565b92915050565b5f604082840312156119ad576119ac611917565b5b6119b760406118ce565b90505f6119c68482850161192a565b5f8301525060206119d984828501611984565b60208301525092915050565b5f6119f76119f2846118e8565b6118ce565b90508083825260208201905060408402830185811115611a1a57611a19611913565b5b835b81811015611a435780611a2f8882611998565b845260208401935050604081019050611a1c565b5050509392505050565b5f82601f830112611a6157611a6061185c565b5b8135611a718482602086016119e5565b91505092915050565b5f60208284031215611a8f57611a8e611854565b5b5f82013567ffffffffffffffff811115611aac57611aab611858565b5b611ab884828501611a4d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110611b2857611b27611aea565b5b50565b5f819050611b3882611b17565b919050565b5f611b4782611b2b565b9050919050565b611b5781611b3d565b82525050565b611b668161195d565b82525050565b5f819050919050565b611b7e81611b6c565b82525050565b606082015f820151611b985f850182611b4e565b506020820151611bab6020850182611b5d565b506040820151611bbe6040850182611b75565b50505050565b5f611bcf8383611b84565b60608301905092915050565b5f602082019050919050565b5f611bf182611ac1565b611bfb8185611acb565b9350611c0683611adb565b805f5b83811015611c36578151611c1d8882611bc4565b9750611c2883611bdb565b925050600181019050611c09565b5085935050505092915050565b5f6020820190508181035f830152611c5b8184611be7565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f67ffffffffffffffff821115611caa57611ca9611870565b5b602082029050602081019050919050565b5f81519050611cc98161196e565b92915050565b5f611ce1611cdc84611c90565b6118ce565b90508083825260208201905060208402830185811115611d0457611d03611913565b5b835b81811015611d2d5780611d198882611cbb565b845260208401935050602081019050611d06565b5050509392505050565b5f82601f830112611d4b57611d4a61185c565b5b8151611d5b848260208601611ccf565b91505092915050565b5f60208284031215611d7957611d78611854565b5b5f82015167ffffffffffffffff811115611d9657611d95611858565b5b611da284828501611d37565b91505092915050565b611db48161195d565b82525050565b5f602082019050611dcd5f830184611dab565b92915050565b611ddc81611b6c565b8114611de6575f5ffd5b50565b5f81519050611df781611dd3565b92915050565b5f60208284031215611e1257611e11611854565b5b5f611e1f84828501611de9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e5f82611b6c565b9150611e6a83611b6c565b9250828202611e7881611b6c565b91508282048414831517611e8f57611e8e611e28565b5b5092915050565b5f60208284031215611eab57611eaa611854565b5b5f611eb884828501611cbb565b91505092915050565b5f6dffffffffffffffffffffffffffff82169050919050565b611ee381611ec1565b8114611eed575f5ffd5b50565b5f81519050611efe81611eda565b92915050565b5f63ffffffff82169050919050565b611f1c81611f04565b8114611f26575f5ffd5b50565b5f81519050611f3781611f13565b92915050565b5f5f5f60608486031215611f5457611f53611854565b5b5f611f6186828701611ef0565b9350506020611f7286828701611ef0565b9250506040611f8386828701611f29565b9150509250925092565b5f611f9782611ec1565b9150611fa283611ec1565b9250828202611fb081611ec1565b9150808214611fc257611fc1611e28565b5b5092915050565b5f604082019050611fdc5f830185611dab565b611fe96020830184611dab565b9392505050565b5f60ff82169050919050565b5f61200682611ff0565b915061201183611ff0565b9250828203905060ff81111561202a57612029611e28565b5b92915050565b5f8160011c9050919050565b5f5f8291508390505b60018511156120855780860481111561206157612060611e28565b5b60018516156120705780820291505b808102905061207e85612030565b9450612045565b94509492505050565b5f8261209d5760019050612158565b816120aa575f9050612158565b81600181146120c057600281146120ca576120f9565b6001915050612158565b60ff8411156120dc576120db611e28565b5b8360020a9150848211156120f3576120f2611e28565b5b50612158565b5060208310610133831016604e8410600b841016171561212e5782820a90508381111561212957612128611e28565b5b612158565b61213b848484600161203c565b9250905081840481111561215257612151611e28565b5b81810290505b9392505050565b5f61216982611b6c565b915061217483611ff0565b92506121a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461208e565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6121e082611b6c565b91506121eb83611b6c565b9250826121fb576121fa6121a9565b5b828204905092915050565b5f61ffff82169050919050565b5f62ffffff82169050919050565b5f819050919050565b5f61224461223f61223a84612206565b612221565b612213565b9050919050565b6122548161222a565b82525050565b5f60608201905061226d5f830186611dab565b61227a6020830185611dab565b612287604083018461224b565b949350505050565b6122988161193e565b81146122a2575f5ffd5b50565b5f815190506122b38161228f565b92915050565b5f8160020b9050919050565b6122ce816122b9565b81146122d8575f5ffd5b50565b5f815190506122e9816122c5565b92915050565b6122f881612206565b8114612302575f5ffd5b50565b5f81519050612313816122ef565b92915050565b61232281611ff0565b811461232c575f5ffd5b50565b5f8151905061233d81612319565b92915050565b5f8115159050919050565b61235781612343565b8114612361575f5ffd5b50565b5f815190506123728161234e565b92915050565b5f5f5f5f5f5f5f60e0888a03121561239357612392611854565b5b5f6123a08a828b016122a5565b97505060206123b18a828b016122db565b96505060406123c28a828b01612305565b95505060606123d38a828b01612305565b94505060806123e48a828b01612305565b93505060a06123f58a828b0161232f565b92505060c06124068a828b01612364565b91505092959891949750929550565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61244182612415565b61244b818561241f565b935061245b818560208601612429565b80840191505092915050565b5f6124728284612437565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea26469706673582212201b852539356655a642cef5907afb8f205af3c33ec214eaee59e37eb2f091109764736f6c634300081c0033","sourceMap":"468:10235:37:-:0;;;1079:206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1191:17;1170:18;;:38;;;;;;;;;;;;;;;;;;1239:17;1218:18;;:38;;;;;;;;;;;;;;;;;;1273:5;1266:4;;:12;;;;;;;;;;;;;;;;;;1079:206;;;468:10235;;88:117:46;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:663::-;933:6;941;949;998:2;986:9;977:7;973:23;969:32;966:119;;;1004:79;;:::i;:::-;966:119;1124:1;1149:64;1205:7;1196:6;1185:9;1181:22;1149:64;:::i;:::-;1139:74;;1095:128;1262:2;1288:64;1344:7;1335:6;1324:9;1320:22;1288:64;:::i;:::-;1278:74;;1233:129;1401:2;1427:64;1483:7;1474:6;1463:9;1459:22;1427:64;:::i;:::-;1417:74;;1372:129;845:663;;;;;:::o;468:10235:37:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063339173fd1461002d575b5f5ffd5b61004760048036038101906100429190611a7a565b61005d565b6040516100549190611c43565b60405180910390f35b60605f825167ffffffffffffffff81111561007b5761007a611870565b5b6040519080825280602002602001820160405280156100b457816020015b6100a1611805565b8152602001906001900390816100995790505b5090505f5f90505b83518110156102f4575f8482815181106100d9576100d8611c63565b5b602002602001015190505f60028111156100f6576100f5611aea565b5b815f0151600281111561010c5761010b611aea565b5b0361018f575f61011f82602001516102fe565b90506040518060600160405280835f0151600281111561014257610141611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061017e5761017d611c63565b5b6020026020010181905250506102e6565b600160028111156101a3576101a2611aea565b5b815f015160028111156101b9576101b8611aea565b5b0361023c575f6101cc8260200151610587565b90506040518060600160405280835f015160028111156101ef576101ee611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff1681526020018281525084848151811061022b5761022a611c63565b5b6020026020010181905250506102e5565b60028081111561024f5761024e611aea565b5b815f0151600281111561026557610264611aea565b5b036102e4575f6102788260200151610825565b90506040518060600160405280835f0151600281111561029b5761029a611aea565b5b8152602001836020015173ffffffffffffffffffffffffffffffffffffffff168152602001828152508484815181106102d7576102d6611c63565b5b6020026020010181905250505b5b5b5080806001019150506100bc565b5080915050919050565b5f60608273ffffffffffffffffffffffffffffffffffffffff1663cc77828d6040518163ffffffff1660e01b81526004015f604051808303815f875af192505050801561036d57506040513d5f823e3d601f19601f8201168201806040525081019061036a9190611d64565b60015b61037a575f915050610582565b809150505f5f90505b81518110156104ba5760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168282815181106103d7576103d6611c63565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036104ad578373ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f83838151811061042957610428611c63565b5b60200260200101516040518263ffffffff1660e01b815260040161044d9190611dba565b6020604051808303815f875af192505050801561048857506040513d601f19601f820116820180604052508101906104859190611dfd565b60015b610496575f92505050610582565b8251816104a39190611e55565b9350505050610582565b8080600101915050610383565b505f815f815181106104cf576104ce611c63565b5b602002602001015190505f8473ffffffffffffffffffffffffffffffffffffffff1663f8b2cb4f836040518263ffffffff1660e01b81526004016105139190611dba565b6020604051808303815f875af192505050801561054e57506040513d601f19601f8201168201806040525081019061054b9190611dfd565b60015b61055d575f9350505050610582565b809150505f61056c8383610b9a565b905083518161057b9190611e55565b9450505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156105f157506040513d601f19601f820116820180604052508101906105ee9190611e96565b60015b6105fe575f915050610820565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561066b57506040513d601f19601f820116820180604052508101906106689190611e96565b60015b610679575f92505050610820565b809150508373ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa9250505080156106e557506040513d601f19601f820116820180604052508101906106e29190611f3d565b60015b6106f3575f92505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610770576002836107549190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107ed576002826107d19190611f8d565b6dffffffffffffffffffffffffffff1695505050505050610820565b5f61080886856dffffffffffffffffffffffffffff16610b9a565b90506002816108179190611e55565b96505050505050505b919050565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561088f57506040513d601f19601f8201168201806040525081019061088c9190611e96565b60015b61089c575f915050610b95565b809150505f8373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561090957506040513d601f19601f820116820180604052508101906109069190611e96565b60015b610917575f92505050610b95565b8091505060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a07578173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016109a89190611dba565b602060405180830381865afa9250505080156109e257506040513d601f19601f820116820180604052508101906109df9190611dfd565b60015b6109f0575f92505050610b95565b6002816109fd9190611e55565b9350505050610b95565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610af3578073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610a949190611dba565b602060405180830381865afa925050508015610ace57506040513d601f19601f82011682018060405250810190610acb9190611dfd565b60015b610adc575f92505050610b95565b600281610ae99190611e55565b9350505050610b95565b8173ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401610b2c9190611dba565b602060405180830381865afa925050508015610b6657506040513d601f19601f82011682018060405250810190610b639190611dfd565b60015b610b74575f92505050610b95565b5f610b7f8483610b9a565b9050600281610b8e9190611e55565b9450505050505b919050565b5f5f610ba584610bf0565b90505f816fffffffffffffffffffffffffffffffff161115610bd357610bcb8184610c35565b915050610bea565b806fffffffffffffffffffffffffffffffff169150505b92915050565b5f5f610bfb83610d1f565b90505f816fffffffffffffffffffffffffffffffff161115610c205780915050610c30565b610c2983611070565b9050809150505b919050565b5f5f821480610c5557505f836fffffffffffffffffffffffffffffffff16145b15610c62575f9050610d19565b5f60406fffffffffffffffffffffffffffffffff8416856fffffffffffffffffffffffffffffffff1602901c90505f608084901c856fffffffffffffffffffffffffffffffff1602905077ffffffffffffffffffffffffffffffffffffffffffffffff811115610cd6575f92505050610d19565b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03811115610d11575f92505050610d19565b818101925050505b92915050565b5f5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a439058460025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401610d9d929190611fc9565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e1a575f91505061106b565b5f5f8273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa925050508015610e8457506040513d601f19601f82011682018060405250810190610e819190611f3d565b60015b610e93575f935050505061106b565b8294508193505050505f826dffffffffffffffffffffffffffff161480610ec957505f816dffffffffffffffffffffffffffff16145b15610ed9575f935050505061106b565b5f5f610ee48761133d565b9150915080610efa575f9550505050505061106b565b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1610610f555784610f57565b835b90505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1610610fb45784610fb6565b855b9050601260ff168460ff16111561100057601284610fd49190611ffc565b600a610fe0919061215f565b816dffffffffffffffffffffffffffff16610ffb91906121d6565b611035565b83601261100d9190611ffc565b600a611019919061215f565b816dffffffffffffffffffffffffffff166110349190611e55565b5b9050611061826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff166114a1565b9750505050505050505b919050565b5f5f60405180606001604052806101f461ffff168152602001610bb861ffff16815260200161271061ffff1681525090505f5f5f90505b60038110156111d0575f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631698ee828760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687866003811061112457611123611c63565b5b60200201516040518463ffffffff1660e01b81526004016111479392919061225a565b602060405180830381865afa158015611162573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111869190611e96565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146111c457809250506111d0565b508060010190506110a7565b505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361120e575f92505050611338565b5f8173ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa92505050801561127757506040513d601f19601f820116820180604052508101906112749190612378565b60015b611286575f9350505050611338565b869750505050505050505f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161090505f5f6112ee8861133d565b9150915080611305575f9650505050505050611338565b604061132d85858661131857601261131a565b855b876113255786611328565b60125b611683565b901c96505050505050505b919050565b5f5f5f5f8473ffffffffffffffffffffffffffffffffffffffff16614e206040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516113eb9190612467565b5f604051808303815f8787f1925050503d805f8114611425576040519150601f19603f3d011682016040523d82523d5f602084013e61142a565b606091505b50915091508115611493575f602082510361148557818060200190518101906114539190611dfd565b90505f811480611463575060ff81115b15611476575f5f9450945050505061149c565b8060019450945050505061149c565b5f5f9450945050505061149c565b5f5f9350935050505b915091565b5f5f82036114b1575f905061167d565b5f77ffffffffffffffffffffffffffffffffffffffffffffffff84116114ed5782604085901b816114e5576114e46121a9565b5b049050611657565b5f60c090505f60c086901c9050640100000000811061151457602081901c90506020820191505b62010000811061152c57601081901c90506010820191505b610100811061154357600881901c90506008820191505b6010811061155957600481901c90506004820191505b6004811061156f57600281901c90506002820191505b6002811061157e576001820191505b600160bf830360018703901c018260ff0387901b816115a05761159f6121a9565b5b0492506fffffffffffffffffffffffffffffffff8311156115c6575f935050505061167d565b5f608086901c840290505f6fffffffffffffffffffffffffffffffff8716850290505f60c089901c90505f60408a901b905082811015611607576001820391505b8281039050608084901b925082811015611622576001820391505b8281039050608084901c821461163b5761163a61247d565b5b88818161164b5761164a6121a9565b5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115611678575f91505061167d565b809150505b92915050565b5f5f82840390505f5f825f0b126116bb578160ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a026116ee565b815f0360ff16600a0a60028873ffffffffffffffffffffffffffffffffffffffff160a816116ec576116eb6121a9565b5b045b9050806c01000000000000000000000000111561170f575f925050506117fd565b5f86611767576c010000000000000000000000008281611732576117316121a9565b5b046fffffffffffffffffffffffffffffffff6c010000000000000000000000000281611761576117606121a9565b5b04611786565b6c010000000000000000000000008281611784576117836121a9565b5b045b90508661179357806117c4565b6c010000000000000000000000006fffffffffffffffffffffffffffffffff8202816117c2576117c16121a9565b5b045b93507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8411156117f9575f93505050506117fd565b5050505b949350505050565b60405180606001604052805f600281111561182357611822611aea565b5b81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6118a682611860565b810181811067ffffffffffffffff821117156118c5576118c4611870565b5b80604052505050565b5f6118d761184b565b90506118e3828261189d565b919050565b5f67ffffffffffffffff82111561190257611901611870565b5b602082029050602081019050919050565b5f5ffd5b5f5ffd5b60038110611927575f5ffd5b50565b5f813590506119388161191b565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6119678261193e565b9050919050565b6119778161195d565b8114611981575f5ffd5b50565b5f813590506119928161196e565b92915050565b5f604082840312156119ad576119ac611917565b5b6119b760406118ce565b90505f6119c68482850161192a565b5f8301525060206119d984828501611984565b60208301525092915050565b5f6119f76119f2846118e8565b6118ce565b90508083825260208201905060408402830185811115611a1a57611a19611913565b5b835b81811015611a435780611a2f8882611998565b845260208401935050604081019050611a1c565b5050509392505050565b5f82601f830112611a6157611a6061185c565b5b8135611a718482602086016119e5565b91505092915050565b5f60208284031215611a8f57611a8e611854565b5b5f82013567ffffffffffffffff811115611aac57611aab611858565b5b611ab884828501611a4d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b60038110611b2857611b27611aea565b5b50565b5f819050611b3882611b17565b919050565b5f611b4782611b2b565b9050919050565b611b5781611b3d565b82525050565b611b668161195d565b82525050565b5f819050919050565b611b7e81611b6c565b82525050565b606082015f820151611b985f850182611b4e565b506020820151611bab6020850182611b5d565b506040820151611bbe6040850182611b75565b50505050565b5f611bcf8383611b84565b60608301905092915050565b5f602082019050919050565b5f611bf182611ac1565b611bfb8185611acb565b9350611c0683611adb565b805f5b83811015611c36578151611c1d8882611bc4565b9750611c2883611bdb565b925050600181019050611c09565b5085935050505092915050565b5f6020820190508181035f830152611c5b8184611be7565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f67ffffffffffffffff821115611caa57611ca9611870565b5b602082029050602081019050919050565b5f81519050611cc98161196e565b92915050565b5f611ce1611cdc84611c90565b6118ce565b90508083825260208201905060208402830185811115611d0457611d03611913565b5b835b81811015611d2d5780611d198882611cbb565b845260208401935050602081019050611d06565b5050509392505050565b5f82601f830112611d4b57611d4a61185c565b5b8151611d5b848260208601611ccf565b91505092915050565b5f60208284031215611d7957611d78611854565b5b5f82015167ffffffffffffffff811115611d9657611d95611858565b5b611da284828501611d37565b91505092915050565b611db48161195d565b82525050565b5f602082019050611dcd5f830184611dab565b92915050565b611ddc81611b6c565b8114611de6575f5ffd5b50565b5f81519050611df781611dd3565b92915050565b5f60208284031215611e1257611e11611854565b5b5f611e1f84828501611de9565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e5f82611b6c565b9150611e6a83611b6c565b9250828202611e7881611b6c565b91508282048414831517611e8f57611e8e611e28565b5b5092915050565b5f60208284031215611eab57611eaa611854565b5b5f611eb884828501611cbb565b91505092915050565b5f6dffffffffffffffffffffffffffff82169050919050565b611ee381611ec1565b8114611eed575f5ffd5b50565b5f81519050611efe81611eda565b92915050565b5f63ffffffff82169050919050565b611f1c81611f04565b8114611f26575f5ffd5b50565b5f81519050611f3781611f13565b92915050565b5f5f5f60608486031215611f5457611f53611854565b5b5f611f6186828701611ef0565b9350506020611f7286828701611ef0565b9250506040611f8386828701611f29565b9150509250925092565b5f611f9782611ec1565b9150611fa283611ec1565b9250828202611fb081611ec1565b9150808214611fc257611fc1611e28565b5b5092915050565b5f604082019050611fdc5f830185611dab565b611fe96020830184611dab565b9392505050565b5f60ff82169050919050565b5f61200682611ff0565b915061201183611ff0565b9250828203905060ff81111561202a57612029611e28565b5b92915050565b5f8160011c9050919050565b5f5f8291508390505b60018511156120855780860481111561206157612060611e28565b5b60018516156120705780820291505b808102905061207e85612030565b9450612045565b94509492505050565b5f8261209d5760019050612158565b816120aa575f9050612158565b81600181146120c057600281146120ca576120f9565b6001915050612158565b60ff8411156120dc576120db611e28565b5b8360020a9150848211156120f3576120f2611e28565b5b50612158565b5060208310610133831016604e8410600b841016171561212e5782820a90508381111561212957612128611e28565b5b612158565b61213b848484600161203c565b9250905081840481111561215257612151611e28565b5b81810290505b9392505050565b5f61216982611b6c565b915061217483611ff0565b92506121a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461208e565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6121e082611b6c565b91506121eb83611b6c565b9250826121fb576121fa6121a9565b5b828204905092915050565b5f61ffff82169050919050565b5f62ffffff82169050919050565b5f819050919050565b5f61224461223f61223a84612206565b612221565b612213565b9050919050565b6122548161222a565b82525050565b5f60608201905061226d5f830186611dab565b61227a6020830185611dab565b612287604083018461224b565b949350505050565b6122988161193e565b81146122a2575f5ffd5b50565b5f815190506122b38161228f565b92915050565b5f8160020b9050919050565b6122ce816122b9565b81146122d8575f5ffd5b50565b5f815190506122e9816122c5565b92915050565b6122f881612206565b8114612302575f5ffd5b50565b5f81519050612313816122ef565b92915050565b61232281611ff0565b811461232c575f5ffd5b50565b5f8151905061233d81612319565b92915050565b5f8115159050919050565b61235781612343565b8114612361575f5ffd5b50565b5f815190506123728161234e565b92915050565b5f5f5f5f5f5f5f60e0888a03121561239357612392611854565b5b5f6123a08a828b016122a5565b97505060206123b18a828b016122db565b96505060406123c28a828b01612305565b95505060606123d38a828b01612305565b94505060806123e48a828b01612305565b93505060a06123f58a828b0161232f565b92505060c06124068a828b01612364565b91505092959891949750929550565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f61244182612415565b61244b818561241f565b935061245b818560208601612429565b80840191505092915050565b5f6124728284612437565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffdfea26469706673582212201b852539356655a642cef5907afb8f205af3c33ec214eaee59e37eb2f091109764736f6c634300081c0033","sourceMap":"468:10235:37:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1908:1035;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;1978:23;2013:39;2076:5;:12;2055:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2013:76;;2104:9;2116:1;2104:13;;2099:806;2123:5;:12;2119:1;:16;2099:806;;;2156:20;2179:5;2185:1;2179:8;;;;;;;;:::i;:::-;;;;;;;;2156:31;;2222:17;2205:34;;;;;;;;:::i;:::-;;:4;:13;;;:34;;;;;;;;:::i;:::-;;;2201:694;;2259:17;2279:36;2298:4;:16;;;2279:18;:36::i;:::-;2259:56;;2354:58;;;;;;;;2369:4;:13;;;2354:58;;;;;;;;:::i;:::-;;;;;;2384:4;:16;;;2354:58;;;;;;2402:9;2354:58;;;2333:15;2349:1;2333:18;;;;;;;;:::i;:::-;;;;;;;:79;;;;2241:186;2201:694;;;2454:18;2437:35;;;;;;;;:::i;:::-;;:4;:13;;;:35;;;;;;;;:::i;:::-;;;2433:462;;2492:17;2512:37;2532:4;:16;;;2512:19;:37::i;:::-;2492:57;;2588:58;;;;;;;;2603:4;:13;;;2588:58;;;;;;;;:::i;:::-;;;;;;2618:4;:16;;;2588:58;;;;;;2636:9;2588:58;;;2567:15;2583:1;2567:18;;;;;;;;:::i;:::-;;;;;;;:79;;;;2474:187;2433:462;;;2688:18;2671:35;;;;;;;;:::i;:::-;;:4;:13;;;:35;;;;;;;;:::i;:::-;;;2667:228;;2726:17;2746:37;2766:4;:16;;;2746:19;:37::i;:::-;2726:57;;2822:58;;;;;;;;2837:4;:13;;;2822:58;;;;;;;;:::i;:::-;;;;;;2852:4;:16;;;2822:58;;;;;;2870:9;2822:58;;;2801:15;2817:1;2801:18;;;;;;;;:::i;:::-;;;;;;;:79;;;;2708:187;2667:228;2433:462;2201:694;2142:763;2137:3;;;;;;;2099:806;;;;2921:15;2914:22;;;1908:1035;;;:::o;2949:1221::-;3009:7;3055:23;3099:4;3092:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3088:152;;3228:1;3221:8;;;;;3088:152;3182:7;3173:16;;3124:76;3359:9;3371:1;3359:13;;3354:473;3378:6;:13;3374:1;:17;3354:473;;;3429:4;;;;;;;;;;;3416:17;;:6;3423:1;3416:9;;;;;;;;:::i;:::-;;;;;;;;:17;;;3412:405;;3464:4;3457:23;;;3481:6;3488:1;3481:9;;;;;;;;:::i;:::-;;;;;;;;3457:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3453:350;;3783:1;3776:8;;;;;;3453:350;3715:6;:13;3704:8;:24;;;;:::i;:::-;3697:31;;;;;;;3412:405;3393:3;;;;;;;3354:473;;;;3837:17;3857:6;3864:1;3857:9;;;;;;;;:::i;:::-;;;;;;;;3837:29;;3876:15;3912:4;3905:23;;;3929:9;3905:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3901:149;;4038:1;4031:8;;;;;;;3901:149;3991:8;3981:18;;3940:70;4060:17;4080:41;4102:9;4113:7;4080:21;:41::i;:::-;4060:61;;4150:6;:13;4138:9;:25;;;;:::i;:::-;4131:32;;;;;;2949:1221;;;;:::o;4176:896::-;4237:7;4256:14;4299:4;4284:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4280:141;;4409:1;4402:8;;;;;4280:141;4363:7;4354:16;;4314:67;4430:14;4473:4;4458:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4454:141;;4583:1;4576:8;;;;;;4454:141;4537:7;4528:16;;4488:67;4623:4;4608:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;4604:462;;5054:1;5047:8;;;;;;4604:462;4724:4;;;;;;;;;;;4714:14;;:6;:14;;;4710:150;;4766:1;4755:8;:12;;;;:::i;:::-;4748:19;;;;;;;;;;;4710:150;4802:4;;;;;;;;;;;4792:14;;:6;:14;;;4788:72;;4844:1;4833:8;:12;;;;:::i;:::-;4826:19;;;;;;;;;;;4788:72;4922:17;4942:39;4964:6;4972:8;4942:39;;:21;:39::i;:::-;4922:59;;5014:1;5002:9;:13;;;;:::i;:::-;4995:20;;;;;;;;4176:896;;;;:::o;5078:1167::-;5139:7;5158:14;5209:4;5186:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5182:150;;5320:1;5313:8;;;;;5182:150;5274:7;5265:16;;5225:67;5341:14;5392:4;5369:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5365:150;;5503:1;5496:8;;;;;;5365:150;5457:7;5448:16;;5408:67;5539:4;;;;;;;;;;;5529:14;;:6;:14;;;5525:432;;5570:6;5563:24;;;5596:4;5563:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5559:169;;5712:1;5705:8;;;;;;5559:169;5664:1;5654:7;:11;;;;:::i;:::-;5647:18;;;;;;;5525:432;5758:4;;;;;;;;;;;5748:14;;:6;:14;;;5744:213;;5789:6;5782:24;;;5815:4;5782:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;5778:169;;5931:1;5924:8;;;;;;5778:169;5883:1;5873:7;:11;;;;:::i;:::-;5866:18;;;;;;;5744:213;6023:6;6016:24;;;6049:4;6016:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6012:227;;6227:1;6220:8;;;;;;6012:227;6096:17;6116:38;6138:6;6146:7;6116:21;:38::i;:::-;6096:58;;6187:1;6175:9;:13;;;;:::i;:::-;6168:20;;;;;;5078:1167;;;;:::o;6323:301::-;6403:7;6449:13;6465:17;6476:5;6465:10;:17::i;:::-;6449:33;;6504:1;6496:5;:9;;;6492:126;;;6528:36;6550:5;6557:6;6528:21;:36::i;:::-;6521:43;;;;;6492:126;6602:5;6595:12;;;;;6323:301;;;;;:::o;6691:351::-;6744:7;6797:13;6855:26;6875:5;6855:19;:26::i;:::-;6847:34;;6903:1;6895:5;:9;;;6891:52;;;6927:5;6920:12;;;;;6891:52;6987:26;7007:5;6987:19;:26::i;:::-;6979:34;;7030:5;7023:12;;;6691:351;;;;:::o;369:626:28:-;430:7;482:1;477;:6;:16;;;;492:1;487;:6;;;477:16;473:63;;;520:1;513:8;;;;473:63;550:10;622:2;582:34;578:1;:38;572:1;564:10;;:53;563:61;;550:74;;638:10;670:3;665:1;:8;;659:1;651:10;;:23;638:36;;698:50;693:2;:55;689:102;;;775:1;768:8;;;;;;689:102;811:2;804:9;;;;;906:2;837:66;:71;832:2;:76;828:123;;;935:1;928:8;;;;;;828:123;976:2;971;:7;964:14;;;;369:626;;;;;:::o;7048:1376:37:-;7110:13;7159:19;7214:18;;;;;;;;;;;7196:45;;;7242:5;7249:4;;;;;;;;;;;7196:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7159:96;;1022:1;7269:29;;7277:4;7269:29;;;7265:68;;7321:1;7314:8;;;;;7265:68;7443:16;7469;7499:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7495:197;;7680:1;7673:8;;;;;;;7495:197;7598:9;7587:20;;7632:9;7621:20;;7518:134;;;7717:1;7705:8;:13;;;:30;;;;7734:1;7722:8;:13;;;7705:30;7701:69;;;7758:1;7751:8;;;;;;;7701:69;7819:19;7840:25;7869:29;7892:5;7869:22;:29::i;:::-;7818:80;;;;7913:20;7908:60;;7956:1;7949:8;;;;;;;;;7908:60;8021:19;8051:4;;;;;;;;;;;8043:12;;:5;:12;;;:34;;8069:8;8043:34;;;8058:8;8043:34;8021:56;;8087:20;8118:4;;;;;;;;;;;8110:12;;:5;:12;;;:34;;8136:8;8110:34;;;8125:8;8110:34;8087:57;;1070:2;8170:30;;:13;:30;;;;:182;;1070:2;8321:13;:29;;;;:::i;:::-;8314:2;:37;;;;:::i;:::-;8299:12;:52;;;;;;:::i;:::-;8170:182;;;8261:13;1070:2;8245:29;;;;:::i;:::-;8238:2;:37;;;;:::i;:::-;8223:12;:52;;;;;;:::i;:::-;8170:182;8155:197;;8370:47;8391:11;8370:47;;8404:12;8370:47;;:20;:47::i;:::-;8362:55;;7125:1299;;;;;;;7048:1376;;;;:::o;8430:1395::-;8492:7;8511:25;:46;;;;;;;;8540:3;8511:46;;;;;;8545:4;8511:46;;;;;;8551:5;8511:46;;;;;;;8567:19;8601:9;8613:1;8601:13;;8596:339;8620:15;8616:1;:19;8596:339;;;8684:19;8755:18;;;;;;;;;;;8737:45;;;8783:5;8790:4;;;;;;;;;;;8796:8;8805:1;8796:11;;;;;;;:::i;:::-;;;;;;8737:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8684:125;;1022:1;8827:29;;8835:4;8827:29;;;8823:102;;8883:4;8876:11;;8905:5;;;8823:102;8642:293;8637:3;;;;;8596:339;;;;1022:1;8949:29;;8957:4;8949:29;;;8945:68;;9001:1;8994:8;;;;;;8945:68;9058:20;9092:4;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;9088:186;;9262:1;9255:8;;;;;;;9088:186;9210:13;9195:28;;9105:129;;;;;;;9284:21;9316:4;;;;;;;;;;;9308:12;;:5;:12;;;9284:36;;9331:19;9352:26;9382:29;9405:5;9382:22;:29::i;:::-;9330:81;;;;9426:21;9421:61;;9470:1;9463:8;;;;;;;;;;9421:61;9806:2;9542:260;9586:12;9616:16;9650;:60;;1070:2;9650:60;;;9674:13;9650:60;9728:16;:60;;9774:13;9728:60;;;1070:2;9728:60;9542:26;:260::i;:::-;:266;;9514:304;;;;;;;;8430:1395;;;;:::o;9939:762::-;10004:5;10011:4;10028:25;10055:30;10101:5;:10;;10117:5;10124:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10101:61;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10027:135;;;;10177:20;10173:522;;;10213:21;10281:2;10253:17;:24;:30;10249:388;;10332:17;10321:40;;;;;;;;;;;;:::i;:::-;10303:58;;10401:1;10384:13;:18;:41;;;;10422:3;10406:13;:19;10384:41;10380:187;;;10457:1;10460:5;10449:17;;;;;;;;;10380:187;10527:13;10543:4;10513:35;;;;;;;;;10249:388;10613:1;10616:5;10605:17;;;;;;;;;10173:522;10675:1;10678:5;10667:17;;;;;;9939:762;;;;:::o;1190:2514:28:-;1250:7;1302:1;1297;:6;1293:20;;1312:1;1305:8;;;;1293:20;1328:14;1366:50;1361:1;:55;1357:1967;;1457:1;1451:2;1446:1;:7;;1445:13;;;;;:::i;:::-;;;1436:22;;1357:1967;;;1497:11;1511:3;1497:17;;1532:10;1550:3;1545:1;:8;;1532:21;;1581:11;1575:2;:17;1571:104;;1623:2;1616:9;;;;;1654:2;1647:9;;;;1571:104;1702:7;1696:2;:13;1692:100;;1740:2;1733:9;;;;;1771:2;1764:9;;;;1692:100;1819:5;1813:2;:11;1809:96;;1855:1;1848:8;;;;;1885:1;1878:8;;;;1809:96;1932:4;1926:2;:10;1922:95;;1967:1;1960:8;;;;;1997:1;1990:8;;;;1922:95;2044:3;2038:2;:9;2034:94;;2078:1;2071:8;;;;;2108:1;2101:8;;;;2034:94;2155:3;2149:2;:9;2145:23;;2167:1;2160:8;;;;2145:23;2276:1;2268:3;2262;:9;2255:1;2251;:5;2250:22;;2249:28;2240:3;2234;:9;2228:1;:16;;2227:51;;;;;:::i;:::-;;;2218:60;;2704:34;2695:6;:43;2691:98;;;2769:1;2762:8;;;;;;;2691:98;2807:10;2835:3;2830:1;:8;;2820:6;:19;2807:32;;2857:10;2884:34;2880:1;:38;2870:6;:49;2857:62;;2938:10;2956:3;2951:1;:8;;2938:21;;2977:10;2995:2;2990:1;:7;;2977:20;;3025:2;3020;:7;3016:20;;;3035:1;3029:7;;;;3016:20;3060:2;3054:8;;;;3128:3;3122:2;:9;;3117:14;;3158:2;3153;:7;3149:20;;;3168:1;3162:7;;;;3149:20;3193:2;3187:8;;;;3270:3;3264:2;:9;;3258:2;:15;3251:23;;;;:::i;:::-;;3308:1;3303:2;:6;;;;;:::i;:::-;;;3293:16;;;;1479:1845;;;;;;1357:1967;3574:34;3565:6;:43;3561:90;;;3635:1;3628:8;;;;;3561:90;3680:6;3665:22;;;1190:2514;;;;;:::o;3710:1606::-;3865:17;4094;4131:14;4114;:31;4094:51;;4256:23;4297:1;4282:12;:16;;;:174;;4443:12;4431:25;;:2;:25;4427:1;4410:12;4402:21;;:26;:54;4282:174;;;4369:12;4368:13;;4346:37;;4354:2;4346:37;4342:1;4325:12;4317:21;;:26;:66;;;;;:::i;:::-;;;4282:174;4256:200;;4480:15;117:27;4474:21;4470:68;;;4522:1;4515:8;;;;;;4470:68;4686:28;4717:16;:143;;117:27;4838:15;:21;;;;;:::i;:::-;;;4799:34;117:27;4793:40;4792:68;;;;;:::i;:::-;;;4717:143;;;117:27;4752:15;:21;;;;;:::i;:::-;;;4717:143;4686:174;;5017:16;:148;;5145:20;5017:148;;;117:27;5085:34;5061:20;5053:66;5052:74;;;;;:::i;:::-;;;5017:148;5005:160;;5196:17;5184:9;:29;5180:120;;;5284:1;5277:8;;;;;;;5180:120;3898:1412;;;3710:1606;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;7:75:46:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:102;498:6;549:2;545:7;540:2;533:5;529:14;525:28;515:38;;457:102;;;:::o;565:180::-;613:77;610:1;603:88;710:4;707:1;700:15;734:4;731:1;724:15;751:281;834:27;856:4;834:27;:::i;:::-;826:6;822:40;964:6;952:10;949:22;928:18;916:10;913:34;910:62;907:88;;;975:18;;:::i;:::-;907:88;1015:10;1011:2;1004:22;794:238;751:281;;:::o;1038:129::-;1072:6;1099:20;;:::i;:::-;1089:30;;1128:33;1156:4;1148:6;1128:33;:::i;:::-;1038:129;;;:::o;1173:338::-;1277:4;1367:18;1359:6;1356:30;1353:56;;;1389:18;;:::i;:::-;1353:56;1439:4;1431:6;1427:17;1419:25;;1499:4;1493;1489:15;1481:23;;1173:338;;;:::o;1517:117::-;1626:1;1623;1616:12;1640:117;1749:1;1746;1739:12;1886:113;1973:1;1966:5;1963:12;1953:40;;1989:1;1986;1979:12;1953:40;1886:113;:::o;2005:167::-;2065:5;2103:6;2090:20;2081:29;;2119:47;2160:5;2119:47;:::i;:::-;2005:167;;;;:::o;2178:126::-;2215:7;2255:42;2248:5;2244:54;2233:65;;2178:126;;;:::o;2310:96::-;2347:7;2376:24;2394:5;2376:24;:::i;:::-;2365:35;;2310:96;;;:::o;2412:122::-;2485:24;2503:5;2485:24;:::i;:::-;2478:5;2475:35;2465:63;;2524:1;2521;2514:12;2465:63;2412:122;:::o;2540:139::-;2586:5;2624:6;2611:20;2602:29;;2640:33;2667:5;2640:33;:::i;:::-;2540:139;;;;:::o;2725:601::-;2801:5;2845:4;2833:9;2828:3;2824:19;2820:30;2817:117;;;2853:79;;:::i;:::-;2817:117;2952:21;2968:4;2952:21;:::i;:::-;2943:30;;3036:1;3076:63;3135:3;3126:6;3115:9;3111:22;3076:63;:::i;:::-;3069:4;3062:5;3058:16;3051:89;2983:168;3217:2;3258:49;3303:3;3294:6;3283:9;3279:22;3258:49;:::i;:::-;3251:4;3244:5;3240:16;3233:75;3161:158;2725:601;;;;:::o;3374:791::-;3497:5;3522:108;3538:91;3622:6;3538:91;:::i;:::-;3522:108;:::i;:::-;3513:117;;3650:5;3679:6;3672:5;3665:21;3713:4;3706:5;3702:16;3695:23;;3766:4;3758:6;3754:17;3746:6;3742:30;3795:3;3787:6;3784:15;3781:122;;;3814:79;;:::i;:::-;3781:122;3929:6;3912:247;3946:6;3941:3;3938:15;3912:247;;;4021:3;4050:64;4110:3;4098:10;4050:64;:::i;:::-;4045:3;4038:77;4144:4;4139:3;4135:14;4128:21;;3988:171;3972:4;3967:3;3963:14;3956:21;;3912:247;;;3916:21;3503:662;;3374:791;;;;;:::o;4213:424::-;4311:5;4360:3;4353:4;4345:6;4341:17;4337:27;4327:122;;4368:79;;:::i;:::-;4327:122;4485:6;4472:20;4510:121;4627:3;4619:6;4612:4;4604:6;4600:17;4510:121;:::i;:::-;4501:130;;4317:320;4213:424;;;;:::o;4643:593::-;4754:6;4803:2;4791:9;4782:7;4778:23;4774:32;4771:119;;;4809:79;;:::i;:::-;4771:119;4957:1;4946:9;4942:17;4929:31;4987:18;4979:6;4976:30;4973:117;;;5009:79;;:::i;:::-;4973:117;5114:105;5211:7;5202:6;5191:9;5187:22;5114:105;:::i;:::-;5104:115;;4900:329;4643:593;;;;:::o;5242:147::-;5342:6;5376:5;5370:12;5360:22;;5242:147;;;:::o;5395:217::-;5527:11;5561:6;5556:3;5549:19;5601:4;5596:3;5592:14;5577:29;;5395:217;;;;:::o;5618:165::-;5718:4;5741:3;5733:11;;5771:4;5766:3;5762:14;5754:22;;5618:165;;;:::o;5789:180::-;5837:77;5834:1;5827:88;5934:4;5931:1;5924:15;5958:4;5955:1;5948:15;5975:119;6062:1;6055:5;6052:12;6042:46;;6068:18;;:::i;:::-;6042:46;5975:119;:::o;6100:139::-;6151:7;6180:5;6169:16;;6186:47;6227:5;6186:47;:::i;:::-;6100:139;;;:::o;6245:::-;6307:9;6340:38;6372:5;6340:38;:::i;:::-;6327:51;;6245:139;;;:::o;6390:145::-;6479:49;6522:5;6479:49;:::i;:::-;6474:3;6467:62;6390:145;;:::o;6541:108::-;6618:24;6636:5;6618:24;:::i;:::-;6613:3;6606:37;6541:108;;:::o;6655:77::-;6692:7;6721:5;6710:16;;6655:77;;;:::o;6738:108::-;6815:24;6833:5;6815:24;:::i;:::-;6810:3;6803:37;6738:108;;:::o;6940:715::-;7093:4;7088:3;7084:14;7184:4;7177:5;7173:16;7167:23;7203:75;7272:4;7267:3;7263:14;7249:12;7203:75;:::i;:::-;7108:180;7377:4;7370:5;7366:16;7360:23;7396:63;7453:4;7448:3;7444:14;7430:12;7396:63;:::i;:::-;7298:171;7556:4;7549:5;7545:16;7539:23;7575:63;7632:4;7627:3;7623:14;7609:12;7575:63;:::i;:::-;7479:169;7062:593;6940:715;;:::o;7661:311::-;7796:10;7817:112;7925:3;7917:6;7817:112;:::i;:::-;7961:4;7956:3;7952:14;7938:28;;7661:311;;;;:::o;7978:146::-;8081:4;8113;8108:3;8104:14;8096:22;;7978:146;;;:::o;8222:996::-;8407:3;8436:87;8517:5;8436:87;:::i;:::-;8539:119;8651:6;8646:3;8539:119;:::i;:::-;8532:126;;8682:89;8765:5;8682:89;:::i;:::-;8794:7;8825:1;8810:383;8835:6;8832:1;8829:13;8810:383;;;8911:6;8905:13;8938:129;9063:3;9048:13;8938:129;:::i;:::-;8931:136;;9090:93;9176:6;9090:93;:::i;:::-;9080:103;;8870:323;8857:1;8854;8850:9;8845:14;;8810:383;;;8814:14;9209:3;9202:10;;8412:806;;;8222:996;;;;:::o;9224:505::-;9433:4;9471:2;9460:9;9456:18;9448:26;;9520:9;9514:4;9510:20;9506:1;9495:9;9491:17;9484:47;9548:174;9717:4;9708:6;9548:174;:::i;:::-;9540:182;;9224:505;;;;:::o;9735:180::-;9783:77;9780:1;9773:88;9880:4;9877:1;9870:15;9904:4;9901:1;9894:15;9921:311;9998:4;10088:18;10080:6;10077:30;10074:56;;;10110:18;;:::i;:::-;10074:56;10160:4;10152:6;10148:17;10140:25;;10220:4;10214;10210:15;10202:23;;9921:311;;;:::o;10238:143::-;10295:5;10326:6;10320:13;10311:22;;10342:33;10369:5;10342:33;:::i;:::-;10238:143;;;;:::o;10404:732::-;10511:5;10536:81;10552:64;10609:6;10552:64;:::i;:::-;10536:81;:::i;:::-;10527:90;;10637:5;10666:6;10659:5;10652:21;10700:4;10693:5;10689:16;10682:23;;10753:4;10745:6;10741:17;10733:6;10729:30;10782:3;10774:6;10771:15;10768:122;;;10801:79;;:::i;:::-;10768:122;10916:6;10899:231;10933:6;10928:3;10925:15;10899:231;;;11008:3;11037:48;11081:3;11069:10;11037:48;:::i;:::-;11032:3;11025:61;11115:4;11110:3;11106:14;11099:21;;10975:155;10959:4;10954:3;10950:14;10943:21;;10899:231;;;10903:21;10517:619;;10404:732;;;;;:::o;11159:385::-;11241:5;11290:3;11283:4;11275:6;11271:17;11267:27;11257:122;;11298:79;;:::i;:::-;11257:122;11408:6;11402:13;11433:105;11534:3;11526:6;11519:4;11511:6;11507:17;11433:105;:::i;:::-;11424:114;;11247:297;11159:385;;;;:::o;11550:554::-;11645:6;11694:2;11682:9;11673:7;11669:23;11665:32;11662:119;;;11700:79;;:::i;:::-;11662:119;11841:1;11830:9;11826:17;11820:24;11871:18;11863:6;11860:30;11857:117;;;11893:79;;:::i;:::-;11857:117;11998:89;12079:7;12070:6;12059:9;12055:22;11998:89;:::i;:::-;11988:99;;11791:306;11550:554;;;;:::o;12110:118::-;12197:24;12215:5;12197:24;:::i;:::-;12192:3;12185:37;12110:118;;:::o;12234:222::-;12327:4;12365:2;12354:9;12350:18;12342:26;;12378:71;12446:1;12435:9;12431:17;12422:6;12378:71;:::i;:::-;12234:222;;;;:::o;12462:122::-;12535:24;12553:5;12535:24;:::i;:::-;12528:5;12525:35;12515:63;;12574:1;12571;12564:12;12515:63;12462:122;:::o;12590:143::-;12647:5;12678:6;12672:13;12663:22;;12694:33;12721:5;12694:33;:::i;:::-;12590:143;;;;:::o;12739:351::-;12809:6;12858:2;12846:9;12837:7;12833:23;12829:32;12826:119;;;12864:79;;:::i;:::-;12826:119;12984:1;13009:64;13065:7;13056:6;13045:9;13041:22;13009:64;:::i;:::-;12999:74;;12955:128;12739:351;;;;:::o;13096:180::-;13144:77;13141:1;13134:88;13241:4;13238:1;13231:15;13265:4;13262:1;13255:15;13282:410;13322:7;13345:20;13363:1;13345:20;:::i;:::-;13340:25;;13379:20;13397:1;13379:20;:::i;:::-;13374:25;;13434:1;13431;13427:9;13456:30;13474:11;13456:30;:::i;:::-;13445:41;;13635:1;13626:7;13622:15;13619:1;13616:22;13596:1;13589:9;13569:83;13546:139;;13665:18;;:::i;:::-;13546:139;13330:362;13282:410;;;;:::o;13698:351::-;13768:6;13817:2;13805:9;13796:7;13792:23;13788:32;13785:119;;;13823:79;;:::i;:::-;13785:119;13943:1;13968:64;14024:7;14015:6;14004:9;14000:22;13968:64;:::i;:::-;13958:74;;13914:128;13698:351;;;;:::o;14055:114::-;14092:7;14132:30;14125:5;14121:42;14110:53;;14055:114;;;:::o;14175:122::-;14248:24;14266:5;14248:24;:::i;:::-;14241:5;14238:35;14228:63;;14287:1;14284;14277:12;14228:63;14175:122;:::o;14303:143::-;14360:5;14391:6;14385:13;14376:22;;14407:33;14434:5;14407:33;:::i;:::-;14303:143;;;;:::o;14452:93::-;14488:7;14528:10;14521:5;14517:22;14506:33;;14452:93;;;:::o;14551:120::-;14623:23;14640:5;14623:23;:::i;:::-;14616:5;14613:34;14603:62;;14661:1;14658;14651:12;14603:62;14551:120;:::o;14677:141::-;14733:5;14764:6;14758:13;14749:22;;14780:32;14806:5;14780:32;:::i;:::-;14677:141;;;;:::o;14824:661::-;14911:6;14919;14927;14976:2;14964:9;14955:7;14951:23;14947:32;14944:119;;;14982:79;;:::i;:::-;14944:119;15102:1;15127:64;15183:7;15174:6;15163:9;15159:22;15127:64;:::i;:::-;15117:74;;15073:128;15240:2;15266:64;15322:7;15313:6;15302:9;15298:22;15266:64;:::i;:::-;15256:74;;15211:129;15379:2;15405:63;15460:7;15451:6;15440:9;15436:22;15405:63;:::i;:::-;15395:73;;15350:128;14824:661;;;;;:::o;15491:279::-;15531:7;15554:20;15572:1;15554:20;:::i;:::-;15549:25;;15588:20;15606:1;15588:20;:::i;:::-;15583:25;;15643:1;15640;15636:9;15665:30;15683:11;15665:30;:::i;:::-;15654:41;;15727:11;15718:7;15715:24;15705:58;;15743:18;;:::i;:::-;15705:58;15539:231;15491:279;;;;:::o;15776:332::-;15897:4;15935:2;15924:9;15920:18;15912:26;;15948:71;16016:1;16005:9;16001:17;15992:6;15948:71;:::i;:::-;16029:72;16097:2;16086:9;16082:18;16073:6;16029:72;:::i;:::-;15776:332;;;;;:::o;16114:86::-;16149:7;16189:4;16182:5;16178:16;16167:27;;16114:86;;;:::o;16206:191::-;16244:4;16264:18;16280:1;16264:18;:::i;:::-;16259:23;;16296:18;16312:1;16296:18;:::i;:::-;16291:23;;16338:1;16335;16331:9;16323:17;;16362:4;16356;16353:14;16350:40;;;16370:18;;:::i;:::-;16350:40;16206:191;;;;:::o;16403:102::-;16445:8;16492:5;16489:1;16485:13;16464:34;;16403:102;;;:::o;16511:848::-;16572:5;16579:4;16603:6;16594:15;;16627:5;16618:14;;16641:712;16662:1;16652:8;16649:15;16641:712;;;16757:4;16752:3;16748:14;16742:4;16739:24;16736:50;;;16766:18;;:::i;:::-;16736:50;16816:1;16806:8;16802:16;16799:451;;;17231:4;17224:5;17220:16;17211:25;;16799:451;17281:4;17275;17271:15;17263:23;;17311:32;17334:8;17311:32;:::i;:::-;17299:44;;16641:712;;;16511:848;;;;;;;:::o;17365:1073::-;17419:5;17610:8;17600:40;;17631:1;17622:10;;17633:5;;17600:40;17659:4;17649:36;;17676:1;17667:10;;17678:5;;17649:36;17745:4;17793:1;17788:27;;;;17829:1;17824:191;;;;17738:277;;17788:27;17806:1;17797:10;;17808:5;;;17824:191;17869:3;17859:8;17856:17;17853:43;;;17876:18;;:::i;:::-;17853:43;17925:8;17922:1;17918:16;17909:25;;17960:3;17953:5;17950:14;17947:40;;;17967:18;;:::i;:::-;17947:40;18000:5;;;17738:277;;18124:2;18114:8;18111:16;18105:3;18099:4;18096:13;18092:36;18074:2;18064:8;18061:16;18056:2;18050:4;18047:12;18043:35;18027:111;18024:246;;;18180:8;18174:4;18170:19;18161:28;;18215:3;18208:5;18205:14;18202:40;;;18222:18;;:::i;:::-;18202:40;18255:5;;18024:246;18295:42;18333:3;18323:8;18317:4;18314:1;18295:42;:::i;:::-;18280:57;;;;18369:4;18364:3;18360:14;18353:5;18350:25;18347:51;;;18378:18;;:::i;:::-;18347:51;18427:4;18420:5;18416:16;18407:25;;17365:1073;;;;;;:::o;18444:281::-;18502:5;18526:23;18544:4;18526:23;:::i;:::-;18518:31;;18570:25;18586:8;18570:25;:::i;:::-;18558:37;;18614:104;18651:66;18641:8;18635:4;18614:104;:::i;:::-;18605:113;;18444:281;;;;:::o;18731:180::-;18779:77;18776:1;18769:88;18876:4;18873:1;18866:15;18900:4;18897:1;18890:15;18917:185;18957:1;18974:20;18992:1;18974:20;:::i;:::-;18969:25;;19008:20;19026:1;19008:20;:::i;:::-;19003:25;;19047:1;19037:35;;19052:18;;:::i;:::-;19037:35;19094:1;19091;19087:9;19082:14;;18917:185;;;;:::o;19108:89::-;19144:7;19184:6;19177:5;19173:18;19162:29;;19108:89;;;:::o;19203:91::-;19239:7;19279:8;19272:5;19268:20;19257:31;;19203:91;;;:::o;19300:60::-;19328:3;19349:5;19342:12;;19300:60;;;:::o;19366:138::-;19414:9;19447:51;19464:33;19473:23;19490:5;19473:23;:::i;:::-;19464:33;:::i;:::-;19447:51;:::i;:::-;19434:64;;19366:138;;;:::o;19510:127::-;19595:35;19624:5;19595:35;:::i;:::-;19590:3;19583:48;19510:127;;:::o;19643:438::-;19790:4;19828:2;19817:9;19813:18;19805:26;;19841:71;19909:1;19898:9;19894:17;19885:6;19841:71;:::i;:::-;19922:72;19990:2;19979:9;19975:18;19966:6;19922:72;:::i;:::-;20004:70;20070:2;20059:9;20055:18;20046:6;20004:70;:::i;:::-;19643:438;;;;;;:::o;20087:122::-;20160:24;20178:5;20160:24;:::i;:::-;20153:5;20150:35;20140:63;;20199:1;20196;20189:12;20140:63;20087:122;:::o;20215:143::-;20272:5;20303:6;20297:13;20288:22;;20319:33;20346:5;20319:33;:::i;:::-;20215:143;;;;:::o;20364:90::-;20399:7;20442:5;20439:1;20428:20;20417:31;;20364:90;;;:::o;20460:118::-;20531:22;20547:5;20531:22;:::i;:::-;20524:5;20521:33;20511:61;;20568:1;20565;20558:12;20511:61;20460:118;:::o;20584:139::-;20639:5;20670:6;20664:13;20655:22;;20686:31;20711:5;20686:31;:::i;:::-;20584:139;;;;:::o;20729:120::-;20801:23;20818:5;20801:23;:::i;:::-;20794:5;20791:34;20781:62;;20839:1;20836;20829:12;20781:62;20729:120;:::o;20855:141::-;20911:5;20942:6;20936:13;20927:22;;20958:32;20984:5;20958:32;:::i;:::-;20855:141;;;;:::o;21002:118::-;21073:22;21089:5;21073:22;:::i;:::-;21066:5;21063:33;21053:61;;21110:1;21107;21100:12;21053:61;21002:118;:::o;21126:139::-;21181:5;21212:6;21206:13;21197:22;;21228:31;21253:5;21228:31;:::i;:::-;21126:139;;;;:::o;21271:90::-;21305:7;21348:5;21341:13;21334:21;21323:32;;21271:90;;;:::o;21367:116::-;21437:21;21452:5;21437:21;:::i;:::-;21430:5;21427:32;21417:60;;21473:1;21470;21463:12;21417:60;21367:116;:::o;21489:137::-;21543:5;21574:6;21568:13;21559:22;;21590:30;21614:5;21590:30;:::i;:::-;21489:137;;;;:::o;21632:1271::-;21746:6;21754;21762;21770;21778;21786;21794;21843:3;21831:9;21822:7;21818:23;21814:33;21811:120;;;21850:79;;:::i;:::-;21811:120;21970:1;21995:64;22051:7;22042:6;22031:9;22027:22;21995:64;:::i;:::-;21985:74;;21941:128;22108:2;22134:62;22188:7;22179:6;22168:9;22164:22;22134:62;:::i;:::-;22124:72;;22079:127;22245:2;22271:63;22326:7;22317:6;22306:9;22302:22;22271:63;:::i;:::-;22261:73;;22216:128;22383:2;22409:63;22464:7;22455:6;22444:9;22440:22;22409:63;:::i;:::-;22399:73;;22354:128;22521:3;22548:63;22603:7;22594:6;22583:9;22579:22;22548:63;:::i;:::-;22538:73;;22492:129;22660:3;22687:62;22741:7;22732:6;22721:9;22717:22;22687:62;:::i;:::-;22677:72;;22631:128;22798:3;22825:61;22878:7;22869:6;22858:9;22854:22;22825:61;:::i;:::-;22815:71;;22769:127;21632:1271;;;;;;;;;;:::o;22909:98::-;22960:6;22994:5;22988:12;22978:22;;22909:98;;;:::o;23013:147::-;23114:11;23151:3;23136:18;;23013:147;;;;:::o;23166:139::-;23255:6;23250:3;23245;23239:23;23296:1;23287:6;23282:3;23278:16;23271:27;23166:139;;;:::o;23311:386::-;23415:3;23443:38;23475:5;23443:38;:::i;:::-;23497:88;23578:6;23573:3;23497:88;:::i;:::-;23490:95;;23594:65;23652:6;23647:3;23640:4;23633:5;23629:16;23594:65;:::i;:::-;23684:6;23679:3;23675:16;23668:23;;23419:278;23311:386;;;;:::o;23703:271::-;23833:3;23855:93;23944:3;23935:6;23855:93;:::i;:::-;23848:100;;23965:3;23958:10;;23703:271;;;;:::o;23980:180::-;24028:77;24025:1;24018:88;24125:4;24122:1;24115:15;24149:4;24146:1;24139:15","linkReferences":{}},"methodIdentifiers":{"getWethValueInPools((uint8,address)[])":"339173fd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_uniswapV2Factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_uniswapV3Factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_weth\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"enum WethValueInPools.PoolType\",\"name\":\"poolType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"poolAddress\",\"type\":\"address\"}],\"internalType\":\"struct WethValueInPools.PoolInfo[]\",\"name\":\"pools\",\"type\":\"tuple[]\"}],\"name\":\"getWethValueInPools\",\"outputs\":[{\"components\":[{\"internalType\":\"enum WethValueInPools.PoolType\",\"name\":\"poolType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"poolAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"wethValue\",\"type\":\"uint256\"}],\"internalType\":\"struct WethValueInPools.PoolInfoReturn[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getWethValueInPools((uint8,address)[])\":{\"details\":\"We require a 1 ETH minimum liquidity in the quoting pool for it to be considered.\"}},\"stateVariables\":{\"UNISWAP_V2_FACTORY\":{\"details\":\"Used as the first priority for quoting WETH value\"},\"UNISWAP_V3_FACTORY\":{\"details\":\"Used as the second priority for quoting WETH value\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getWethValueInPools((uint8,address)[])\":{\"notice\":\"Returns an array of `PoolInfoReturn` for the consumer to determine wether to filter or not to save gas.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/filters/WethValueInPools.sol\":\"WethValueInPools\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"src/UniswapV3/FixedPoint.sol\":{\"keccak256\":\"0xf82873fe78051afcf0446c27f5c5857816d1129e2bc84855dee8275d764b49d0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5d1b9704466cdf93f446ac2330ef89752c2bcc1f271a70c296f54e0d9291467f\",\"dweb:/ipfs/QmaQd3DUAdJMVQD422o2HyAwhTDyLo33znMgRDU5NaZegE\"]},\"src/filters/WethValueInPools.sol\":{\"keccak256\":\"0x1bd98caec9df680366948f8e1f24ed7262021aeb841ea155efafb05648152c4b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3f88558f892e5441c824e1d6973036e1196445b99c7e24fcfa6a399af64e2ace\",\"dweb:/ipfs/QmT7KqFaR9pysM94AAbSgeJrb1XsQickV6kyowBWc5vYgT\"]},\"src/interfaces/IBalancer.sol\":{\"keccak256\":\"0xe7ca1e7f70a16d6919334b612a584e5d42692a802f4d92686c564a4ab1550c27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2e0cf4540fca9dbf3650d22d1d927b43bcd8333a988c7575c6618b633bff082f\",\"dweb:/ipfs/QmYAcUnqBauhiXJNfMLta4Bj1dntGmNJ3cxaHq18LnBDAQ\"]},\"src/interfaces/IUniswapV2.sol\":{\"keccak256\":\"0x067d9c125da6fdbe44d6ce7d498c42460d7347317413f8317bf80bd25c08898d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1ad58162042aa8d1eb7451af3ccc3b1df64e720aeeb69a6843507aec0e5d146\",\"dweb:/ipfs/QmdvEJYkfWaGWrGXtKajZSDdfNYJ3sDFpzsV4f1X4KQYZM\"]},\"src/interfaces/IUniswapV3.sol\":{\"keccak256\":\"0x914ac5f4d9e6b6d0345c89e769f1a2d9784d047e8cac6f3265b229afd9363729\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://19a3f9d71839d62cea60562c57cdfe582821da7bfe17a1d6ca26597db51a3762\",\"dweb:/ipfs/QmdWoVo3J7tcSKCk5cCADvjvMtmczcGbsmKx5v9AFjQANz\"]},\"src/interfaces/Token.sol\":{\"keccak256\":\"0x2f7118f6cba8e0303e66028f738463e025a19ec0186a5462523692f44330e113\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca6355f3ce4aec77f281142db4cb0a63d5e1b3b4b12836ac9a3ed251069801d0\",\"dweb:/ipfs/QmWTt8HyEuzTdKVWCzBDxVMWL3tptkxsTfsssbEMVA818A\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_uniswapV2Factory","type":"address"},{"internalType":"address","name":"_uniswapV3Factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"struct WethValueInPools.PoolInfo[]","name":"pools","type":"tuple[]","components":[{"internalType":"enum WethValueInPools.PoolType","name":"poolType","type":"uint8"},{"internalType":"address","name":"poolAddress","type":"address"}]}],"stateMutability":"nonpayable","type":"function","name":"getWethValueInPools","outputs":[{"internalType":"struct WethValueInPools.PoolInfoReturn[]","name":"","type":"tuple[]","components":[{"internalType":"enum WethValueInPools.PoolType","name":"poolType","type":"uint8"},{"internalType":"address","name":"poolAddress","type":"address"},{"internalType":"uint256","name":"wethValue","type":"uint256"}]}]}],"devdoc":{"kind":"dev","methods":{"getWethValueInPools((uint8,address)[])":{"details":"We require a 1 ETH minimum liquidity in the quoting pool for it to be considered."}},"version":1},"userdoc":{"kind":"user","methods":{"getWethValueInPools((uint8,address)[])":{"notice":"Returns an array of `PoolInfoReturn` for the consumer to determine wether to filter or not to save gas."}},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":false,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/filters/WethValueInPools.sol":"WethValueInPools"},"evmVersion":"cancun","libraries":{}},"sources":{"src/UniswapV3/FixedPoint.sol":{"keccak256":"0xf82873fe78051afcf0446c27f5c5857816d1129e2bc84855dee8275d764b49d0","urls":["bzz-raw://5d1b9704466cdf93f446ac2330ef89752c2bcc1f271a70c296f54e0d9291467f","dweb:/ipfs/QmaQd3DUAdJMVQD422o2HyAwhTDyLo33znMgRDU5NaZegE"],"license":"MIT"},"src/filters/WethValueInPools.sol":{"keccak256":"0x1bd98caec9df680366948f8e1f24ed7262021aeb841ea155efafb05648152c4b","urls":["bzz-raw://3f88558f892e5441c824e1d6973036e1196445b99c7e24fcfa6a399af64e2ace","dweb:/ipfs/QmT7KqFaR9pysM94AAbSgeJrb1XsQickV6kyowBWc5vYgT"],"license":"MIT"},"src/interfaces/IBalancer.sol":{"keccak256":"0xe7ca1e7f70a16d6919334b612a584e5d42692a802f4d92686c564a4ab1550c27","urls":["bzz-raw://2e0cf4540fca9dbf3650d22d1d927b43bcd8333a988c7575c6618b633bff082f","dweb:/ipfs/QmYAcUnqBauhiXJNfMLta4Bj1dntGmNJ3cxaHq18LnBDAQ"],"license":"MIT"},"src/interfaces/IUniswapV2.sol":{"keccak256":"0x067d9c125da6fdbe44d6ce7d498c42460d7347317413f8317bf80bd25c08898d","urls":["bzz-raw://b1ad58162042aa8d1eb7451af3ccc3b1df64e720aeeb69a6843507aec0e5d146","dweb:/ipfs/QmdvEJYkfWaGWrGXtKajZSDdfNYJ3sDFpzsV4f1X4KQYZM"],"license":"MIT"},"src/interfaces/IUniswapV3.sol":{"keccak256":"0x914ac5f4d9e6b6d0345c89e769f1a2d9784d047e8cac6f3265b229afd9363729","urls":["bzz-raw://19a3f9d71839d62cea60562c57cdfe582821da7bfe17a1d6ca26597db51a3762","dweb:/ipfs/QmdWoVo3J7tcSKCk5cCADvjvMtmczcGbsmKx5v9AFjQANz"],"license":"MIT"},"src/interfaces/Token.sol":{"keccak256":"0x2f7118f6cba8e0303e66028f738463e025a19ec0186a5462523692f44330e113","urls":["bzz-raw://ca6355f3ce4aec77f281142db4cb0a63d5e1b3b4b12836ac9a3ed251069801d0","dweb:/ipfs/QmWTt8HyEuzTdKVWCzBDxVMWL3tptkxsTfsssbEMVA818A"],"license":"MIT"}},"version":1},"id":37} \ No newline at end of file diff --git a/src/amms/error.rs b/src/amms/error.rs index 1b01f903..3c873106 100644 --- a/src/amms/error.rs +++ b/src/amms/error.rs @@ -31,6 +31,10 @@ pub enum AMMError { UnrecognizedEventSignature(FixedBytes<32>), #[error(transparent)] JoinError(#[from] tokio::task::JoinError), + #[error("Snapshot Error: {0}")] + SnapshotError(#[from] serde_json::Error), + #[error("Snapshot Error: {0}")] + SnapshotIOError(#[from] std::io::Error), } #[derive(Error, Debug)] diff --git a/src/state_space/cache.rs b/src/state_space/cache.rs index 46890a5d..271a7bc7 100644 --- a/src/state_space/cache.rs +++ b/src/state_space/cache.rs @@ -3,11 +3,11 @@ use std::collections::HashMap; use crate::amms::amm::{AutomatedMarketMaker, AMM}; use arraydeque::ArrayDeque; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct StateChangeCache { - oldest_block: u64, - cache: ArrayDeque, + pub oldest_block: u64, + pub cache: ArrayDeque, } impl Default for StateChangeCache { @@ -87,7 +87,7 @@ impl StateChangeCache { // NOTE: we can probably make this more efficient and create a state change struct for each amm rather than // cloning each amm when caching -#[derive(Debug, Clone)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct StateChange { pub state_change: Vec, pub block_number: u64, diff --git a/src/state_space/filters/value.rs b/src/state_space/filters/value.rs index 7fa7c1d7..8de3d37b 100644 --- a/src/state_space/filters/value.rs +++ b/src/state_space/filters/value.rs @@ -87,7 +87,6 @@ where async fn filter(&self, amms: Vec) -> Result, AMMError> { let pool_infos = amms .iter() - .cloned() .map(|amm| { let pool_address = amm.address(); let pool_type = match amm { diff --git a/src/state_space/hooks.rs b/src/state_space/hooks.rs new file mode 100644 index 00000000..4ec12a61 --- /dev/null +++ b/src/state_space/hooks.rs @@ -0,0 +1,173 @@ +use std::{ + collections::HashMap, + path::PathBuf, + sync::{ + atomic::{AtomicU64, Ordering}, + Arc, + }, + time::Duration, +}; + +use alloy::primitives::Address; +use tokio::sync::RwLock; +use tracing::error; + +use crate::state_space::{SerializableStateSpace, StateSpace}; + +/// A hook that can be used to observe, and react to state changes. +pub type StateHook = Arc; + +/// Registry for managing state change hooks. +#[derive(Clone)] +pub struct HookRegistry { + inner: Arc>>, + next_id: Arc, +} + +#[derive(Clone)] +struct HookRegistryInner { + hooks: HashMap>, +} + +impl HookRegistry { + /// Creates a new hook registry. + pub fn new(hooks: Vec>) -> Self { + Self { + inner: Arc::new(RwLock::new(HookRegistryInner { + hooks: hooks.into_iter().enumerate().collect(), + })), + next_id: Arc::new(AtomicU64::new(1)), + } + } + + /// Registers a hook and returns a handle that unregisters on drop. + pub async fn register(&self, hook: StateHook) -> HookHandle { + let id = self.next_id.fetch_add(1, Ordering::Relaxed); + self.inner.write().await.hooks.insert(id as usize, hook); + HookHandle { + id, + reg: self.clone(), + } + } + + /// Notifies all registered hooks of a state change. + pub async fn notify(&self, state_change: &T) { + let mut hooks: Vec> = { + let guard = self.inner.read().await; + guard.hooks.values().cloned().collect() + }; + + for hook in hooks.iter_mut() { + (hook)(state_change); + } + } + + async fn unregister(&self, id: u64) { + self.inner.write().await.hooks.remove(&(id as usize)); + } +} + +/// RAII handle for a registered hook. Unregisters the hook on drop. +#[derive(Clone)] +pub struct HookHandle { + id: u64, + reg: HookRegistry, +} + +impl Drop for HookHandle { + fn drop(&mut self) { + let id = self.id; + let reg = self.reg.clone(); + tokio::spawn(async move { + reg.unregister(id).await; + }); + } +} + +#[derive(Clone, Debug)] +pub struct SnapshotConfig { + /// Interval between consecutive snapshots. + pub interval: Duration, + /// Directory to store snapshots. + pub directory: PathBuf, + /// Maximum number of snapshots to retain. + pub max_snapshots: usize, +} + +impl Default for SnapshotConfig { + fn default() -> Self { + Self { + interval: Duration::from_secs(60), + directory: PathBuf::from("./snapshots"), + max_snapshots: 5, + } + } +} + +impl SnapshotConfig { + /// Creates a new snapshot configuration. + pub fn new(interval: Duration, directory: PathBuf, max_snapshots: usize) -> Self { + Self { + interval, + directory, + max_snapshots, + } + } + + pub async fn into_state_hook(self, state: Arc>) -> StateHook> { + let interval = self.interval; + let max_snapshots = self.max_snapshots; + let directory = self.directory.clone(); + + let start = std::time::Instant::now(); + + let hook = move |_: &Vec
| { + if start.elapsed() < interval { + return; + } + + let timestamp = chrono::Utc::now().format("%Y%m%d%H%M%S"); + let filename = format!("snapshot_{}.json", timestamp); + let path = directory.join(filename); + + std::fs::create_dir_all(&directory) + .inspect_err( + |e| error!(target: "snapshot", "Failed to create snapshot directory: {}", e), + ) + .ok(); + + let state = futures::executor::block_on(state.read()).clone(); + let state: SerializableStateSpace = state.into(); + + let Ok(file) = std::fs::File::create(&path) else { + error!(target: "snapshot", "Failed to create snapshot file: {:?}", path); + return; + }; + + let writer = std::io::BufWriter::new(file); + let Ok(_) = serde_json::to_writer_pretty(writer, &state) else { + error!(target: "snapshot", "Failed to write snapshot to file: {:?}", path); + return; + }; + + let Ok(mut entries) = std::fs::read_dir(&directory) + .map(|rd| rd.filter_map(Result::ok).collect::>()) + else { + error!(target: "snapshot", "Failed to read snapshot directory: {:?}", directory); + return; + }; + + entries.sort_by_key(|e| e.metadata().and_then(|m| m.modified()).ok()); + if entries.len() > max_snapshots { + entries.drain(..entries.len() - max_snapshots).for_each(|entry| { + let Ok(_) = std::fs::remove_file(entry.path()) else { + error!(target: "snapshot", "Failed to remove old snapshot: {:?}", entry.path()); + return; + }; + }); + } + }; + + Arc::new(hook) + } +} diff --git a/src/state_space/mod.rs b/src/state_space/mod.rs index f885cf69..70132d63 100644 --- a/src/state_space/mod.rs +++ b/src/state_space/mod.rs @@ -2,11 +2,16 @@ pub mod cache; pub mod discovery; pub mod error; pub mod filters; +pub mod hooks; use crate::amms::amm::AutomatedMarketMaker; use crate::amms::amm::AMM; use crate::amms::error::AMMError; use crate::amms::factory::Factory; +use crate::state_space::hooks::HookHandle; +use crate::state_space::hooks::HookRegistry; +use crate::state_space::hooks::SnapshotConfig; +use crate::state_space::hooks::StateHook; use alloy::consensus::BlockHeader; use alloy::eips::BlockId; @@ -27,28 +32,34 @@ use futures::stream::FuturesUnordered; use futures::Stream; use futures::StreamExt; use std::collections::HashSet; +use std::fmt::Debug; +use std::path::PathBuf; use std::pin::Pin; use std::sync::atomic::AtomicU64; use std::sync::atomic::Ordering; use std::{collections::HashMap, marker::PhantomData, sync::Arc}; use tokio::sync::RwLock; -use tracing::debug; -use tracing::info; + +use tracing::{debug, info, trace}; pub const CACHE_SIZE: usize = 30; #[derive(Clone)] pub struct StateSpaceManager { pub state: Arc>, - pub latest_block: Arc, - // discovery_manager: Option, pub block_filter: Filter, pub provider: P, + pub latest_block: Arc, + hooks: HookRegistry>, phantom: PhantomData, - // TODO: add support for caching } impl StateSpaceManager { + /// Registers a hook to be called on every state change. + pub async fn register_hook(&self, hook: StateHook>) -> HookHandle> { + self.hooks.register(hook).await + } + pub async fn subscribe( &self, ) -> Result< @@ -65,6 +76,7 @@ impl StateSpaceManager { let mut block_filter = self.block_filter.clone(); let block_stream = provider.subscribe_blocks().await?.into_stream(); + let hooks = self.hooks.clone(); Ok(Box::pin(stream! { tokio::pin!(block_stream); @@ -77,6 +89,10 @@ impl StateSpaceManager { let logs = provider.get_logs(&block_filter).await?; let affected_amms = state.write().await.sync(&logs)?; + + // Always notify hooks, even if no AMMs were affected + hooks.notify(&affected_amms).await; + latest_block.store(block_number, Ordering::Relaxed); yield Ok(affected_amms); @@ -85,16 +101,17 @@ impl StateSpaceManager { } } -// TODO: Drop impl, create a checkpoint -#[derive(Debug, Default)] +#[derive(Clone)] pub struct StateSpaceBuilder { pub provider: P, pub latest_block: u64, pub factories: Vec, pub amms: Vec, pub filters: Vec, + pub hooks: Vec>>, + pub snapshot_path: Option, + pub snapshot_config: Option, phantom: PhantomData, - // TODO: add support for caching } impl StateSpaceBuilder @@ -109,8 +126,10 @@ where factories: vec![], amms: vec![], filters: vec![], - // discovery: false, phantom: PhantomData, + snapshot_path: None, + snapshot_config: None, + hooks: vec![], } } @@ -133,7 +152,35 @@ where StateSpaceBuilder { filters, ..self } } - pub async fn sync(self) -> Result, AMMError> { + pub fn with_hooks(self, hooks: Vec>>) -> StateSpaceBuilder { + StateSpaceBuilder { hooks, ..self } + } + + pub fn with_snapshot_path(self, snapshot_path: PathBuf) -> StateSpaceBuilder { + StateSpaceBuilder { + snapshot_path: Some(snapshot_path), + ..self + } + } + + pub fn with_snapshot_enabled(self, config: Option) -> StateSpaceBuilder { + let config = config.unwrap_or_default(); + StateSpaceBuilder { + snapshot_config: Some(config), + ..self + } + } + + pub async fn sync(mut self) -> Result, AMMError> { + let mut state_space = if self.snapshot_path.is_some() { + let serialized = serde_json::from_reader::<_, SerializableStateSpace>( + std::fs::File::open(self.snapshot_path.unwrap())?, + )?; + serialized.into() + } else { + StateSpace::default() + }; + let chain_tip = BlockId::from(self.provider.get_block_number().await?); let factories = self.factories.clone(); let mut futures = FuturesUnordered::new(); @@ -155,6 +202,7 @@ where filter_set.into_iter().collect::>>(), )); let mut amm_variants = HashMap::new(); + for amm in self.amms.into_iter() { amm_variants .entry(amm.variant()) @@ -214,7 +262,6 @@ where })); } - let mut state_space = StateSpace::default(); while let Some(res) = futures.next().await { let synced_amms = res??; @@ -232,17 +279,25 @@ where } } + let state_space = Arc::new(RwLock::new(state_space)); + + if let Some(snapshot_config) = self.snapshot_config { + let hook = snapshot_config.into_state_hook(state_space.clone()).await; + self.hooks.push(hook); + } + Ok(StateSpaceManager { latest_block: Arc::new(AtomicU64::new(self.latest_block)), - state: Arc::new(RwLock::new(state_space)), + state: state_space, block_filter, provider: self.provider, phantom: PhantomData, + hooks: HookRegistry::new(self.hooks), }) } } -#[derive(Debug, Default)] +#[derive(Clone, Debug, Default)] pub struct StateSpace { pub state: HashMap, pub latest_block: Arc, @@ -270,7 +325,7 @@ impl StateSpace { // Check if there is a reorg and unwind to state before block_number if latest >= block_number { - info!( + debug!( target: "state_space::sync", from = %latest, to = %block_number - 1, @@ -296,7 +351,7 @@ impl StateSpace { affected_amms.extend(amms.iter().map(|amm| amm.address())); let state_change = StateChange::new(amms, block_number); - debug!( + trace!( target: "state_space::sync", state_change = ?state_change, "Caching state change" @@ -312,9 +367,9 @@ impl StateSpace { cached_amms.insert(amm.clone()); amm.sync(log)?; - info!( + debug!( target: "state_space::sync", - ?amm, + address =%amm.address(), "Synced AMM" ); } @@ -325,7 +380,7 @@ impl StateSpace { affected_amms.extend(amms.iter().map(|amm| amm.address())); let state_change = StateChange::new(amms, block_number); - debug!( + trace!( target: "state_space::sync", state_change = ?state_change, "Caching state change" @@ -338,6 +393,37 @@ impl StateSpace { } } +#[derive(serde::Serialize, serde::Deserialize)] +pub struct SerializableStateSpace { + pub state: HashMap, + pub latest_block: u64, + pub cache: (Vec, u64), +} + +impl From for SerializableStateSpace { + fn from(ss: StateSpace) -> Self { + Self { + state: ss.state, + latest_block: ss.latest_block.load(Ordering::Relaxed), + cache: (ss.cache.cache.into_iter().collect(), ss.cache.oldest_block), + } + } +} + +impl From for StateSpace { + fn from(val: SerializableStateSpace) -> Self { + let (cache, oldest_block) = val.cache; + StateSpace { + state: val.state, + latest_block: Arc::new(AtomicU64::new(val.latest_block)), + cache: StateChangeCache { + cache: cache.into_iter().collect(), + oldest_block, + }, + } + } +} + #[macro_export] macro_rules! sync { // Sync factories with provider